├── .editorconfig ├── .env.example ├── .github ├── dependabot.yml └── workflows │ ├── checks.yml │ ├── codeql.yml │ └── test.yml ├── .gitignore ├── .mocharc.json ├── .prettierignore ├── LICENSE ├── README.md ├── eslint.config.js ├── package.json ├── pnpm-lock.yaml ├── renovate.json ├── src ├── addresses.ts └── index.ts ├── test └── detect.test.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = false 10 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | ETH_MAINNET_URL=https://eth-mainnet.alchemyapi.io/v2/ 2 | ETHERSCAN_API_KEY= 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | day: "monday" 8 | target-branch: "main" 9 | labels: 10 | - "dependencies" 11 | assignees: 12 | - "pcaversaccio" 13 | -------------------------------------------------------------------------------- /.github/workflows/checks.yml: -------------------------------------------------------------------------------- 1 | name: 👮‍♂️ Sanity checks 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | concurrency: 6 | group: ${{ github.workflow }}-${{ github.ref }} 7 | cancel-in-progress: true 8 | 9 | jobs: 10 | prettify-n-lint: 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | matrix: 14 | os: 15 | - ubuntu-latest 16 | node_version: 17 | - 22 18 | 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | 23 | - name: Install pnpm 24 | uses: pnpm/action-setup@v4 25 | with: 26 | run_install: false 27 | 28 | - name: Get pnpm cache directory path 29 | id: pnpm-cache-dir-path 30 | run: echo "dir=$(pnpm store path --silent)" >> $GITHUB_OUTPUT 31 | 32 | - name: Restore pnpm cache 33 | uses: actions/cache@v4 34 | id: pnpm-cache 35 | with: 36 | path: ${{ steps.pnpm-cache-dir-path.outputs.dir }} 37 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 38 | restore-keys: | 39 | ${{ runner.os }}-pnpm-store- 40 | 41 | - name: Use Node.js ${{ matrix.node_version }} 42 | uses: actions/setup-node@v4 43 | with: 44 | node-version: ${{ matrix.node_version }} 45 | 46 | - name: Install pnpm project with a clean slate 47 | run: pnpm install --prefer-offline --frozen-lockfile 48 | 49 | - name: Prettier and lint 50 | run: pnpm lint:check 51 | 52 | codespell: 53 | runs-on: ${{ matrix.os }} 54 | strategy: 55 | matrix: 56 | os: 57 | - ubuntu-latest 58 | 59 | steps: 60 | - name: Checkout 61 | uses: actions/checkout@v4 62 | 63 | - name: Run codespell 64 | uses: codespell-project/actions-codespell@v2 65 | with: 66 | check_filenames: true 67 | skip: ./.git,pnpm-lock.yaml 68 | 69 | validate-links: 70 | runs-on: ${{ matrix.os }} 71 | strategy: 72 | matrix: 73 | os: 74 | - ubuntu-latest 75 | ruby_version: 76 | - 3.4 77 | 78 | steps: 79 | - name: Checkout 80 | uses: actions/checkout@v4 81 | 82 | - name: Set up Ruby 83 | uses: ruby/setup-ruby@v1 84 | with: 85 | ruby-version: ${{ matrix.ruby_version }} 86 | bundler-cache: true 87 | 88 | - name: Install awesome_bot 89 | run: gem install awesome_bot 90 | 91 | - name: Validate URLs 92 | run: awesome_bot ./*.md src/*.ts --request-delay 0.4 --white-list https://eth-mainnet.alchemyapi.io/v2/ 93 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | name: 🔍️ CodeQL 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | concurrency: 6 | group: ${{ github.workflow }}-${{ github.ref }} 7 | cancel-in-progress: true 8 | 9 | jobs: 10 | analyse: 11 | runs-on: ${{ matrix.os }} 12 | permissions: 13 | security-events: write 14 | strategy: 15 | matrix: 16 | os: 17 | - ubuntu-latest 18 | language: 19 | - javascript-typescript 20 | 21 | steps: 22 | - name: Checkout 23 | uses: actions/checkout@v4 24 | 25 | - name: Initialise CodeQL 26 | uses: github/codeql-action/init@v3 27 | with: 28 | languages: ${{ matrix.language }} 29 | queries: +security-and-quality 30 | 31 | - name: Autobuild 32 | uses: github/codeql-action/autobuild@v3 33 | 34 | - name: Perform CodeQL analysis 35 | uses: github/codeql-action/analyze@v3 36 | with: 37 | category: "/language:${{ matrix.language }}" 38 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: 🕵️‍♂️ Test TORN detector 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | concurrency: 6 | group: ${{ github.workflow }}-${{ github.ref }} 7 | cancel-in-progress: true 8 | 9 | jobs: 10 | tests: 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | matrix: 14 | os: 15 | - ubuntu-latest 16 | node_version: 17 | - 22 18 | 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | 23 | - name: Install pnpm 24 | uses: pnpm/action-setup@v4 25 | with: 26 | run_install: false 27 | 28 | - name: Get pnpm cache directory path 29 | id: pnpm-cache-dir-path 30 | run: echo "dir=$(pnpm store path --silent)" >> $GITHUB_OUTPUT 31 | 32 | - name: Restore pnpm cache 33 | uses: actions/cache@v4 34 | id: pnpm-cache 35 | with: 36 | path: ${{ steps.pnpm-cache-dir-path.outputs.dir }} 37 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 38 | restore-keys: | 39 | ${{ runner.os }}-pnpm-store- 40 | 41 | - name: Use Node.js ${{ matrix.node_version }} 42 | uses: actions/setup-node@v4 43 | with: 44 | node-version: ${{ matrix.node_version }} 45 | 46 | - name: Install pnpm project with a clean slate 47 | run: pnpm install --prefer-offline --frozen-lockfile 48 | 49 | - name: TORN detector tests 50 | run: pnpm test 51 | env: 52 | ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} 53 | ETH_MAINNET_URL: ${{ secrets.ETH_MAINNET_URL }} 54 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore all Visual Studio Code settings 2 | .vscode/* 3 | !.vscode/settings.json 4 | !.vscode/tasks.json 5 | !.vscode/launch.json 6 | !.vscode/extensions.json 7 | !.vscode/*.code-snippets 8 | 9 | # Local history for Visual Studio Code 10 | .history 11 | 12 | # Built Visual Studio Code extensions 13 | *.vsix 14 | 15 | # Dependency directory 16 | node_modules 17 | 18 | # dotenv environment variable files 19 | .env 20 | .env.development.local 21 | .env.test.local 22 | .env.production.local 23 | .env.local 24 | 25 | # Log files 26 | logs 27 | *.log 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # Yarn integrity file 34 | .yarn-integrity 35 | 36 | # Optional npm cache directory 37 | .npm 38 | 39 | # Modern Yarn files 40 | .pnp.* 41 | .yarn/* 42 | !.yarn/cache 43 | !.yarn/patches 44 | !.yarn/plugins 45 | !.yarn/releases 46 | !.yarn/sdks 47 | !.yarn/versions 48 | 49 | # Miscellaneous files 50 | bin 51 | out 52 | -------------------------------------------------------------------------------- /.mocharc.json: -------------------------------------------------------------------------------- 1 | { 2 | "loader": "ts-node/esm", 3 | "timeout": 50000 4 | } 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | pnpm-lock.yaml 3 | out 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2004 Sam Hocevar 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🕵️‍♂️ TORN Detector 2 | 3 | [![🕵️‍♂️ Test TORN detector](https://github.com/pcaversaccio/torn-detector/actions/workflows/test.yml/badge.svg)](https://github.com/pcaversaccio/torn-detector/actions/workflows/test.yml) 4 | [![License: WTFPL](https://img.shields.io/badge/License-WTFPL-blue.svg)](https://www.wtfpl.net/about/) 5 | 6 | Detect if a contract has been deployed in the latest (or predefined) block from an address that was previously funded through Tornado.Cash. 7 | 8 | ## Installation 9 | 10 | It is recommended to install [`pnpm`](https://pnpm.io) through the `npm` package manager, which comes bundled with [Node.js](https://nodejs.org/en) when you install it on your system. It is recommended to use a Node.js version `>=22.11.0`. 11 | 12 | Once you have `npm` installed, you can run the following both to install and upgrade `pnpm`: 13 | 14 | ```console 15 | npm install -g pnpm 16 | ``` 17 | 18 | After having installed `pnpm`, simply run: 19 | 20 | ```console 21 | pnpm install 22 | ``` 23 | 24 | ## `.env` File 25 | 26 | You must specify the RPC URL of your mainnet node as well as your Etherscan API key in the `.env` file: 27 | 28 | ```txt 29 | ETH_MAINNET_URL=https://eth-mainnet.alchemyapi.io/v2/ 30 | ETHERSCAN_API_KEY=6FECCD7C9B8C24... 31 | ``` 32 | 33 | ## Testing 34 | 35 | Simply run 36 | 37 | ```console 38 | pnpm test 39 | ``` 40 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import eslint from "@eslint/js"; 2 | import tseslint from "typescript-eslint"; 3 | import eslintConfigPrettier from "eslint-config-prettier"; 4 | 5 | export default tseslint.config( 6 | { 7 | files: ["**/*.{js,ts}"], 8 | extends: [ 9 | eslint.configs.recommended, 10 | ...tseslint.configs.recommended, 11 | ...tseslint.configs.stylistic, 12 | eslintConfigPrettier, 13 | ], 14 | plugins: { 15 | "@typescript-eslint": tseslint.plugin, 16 | }, 17 | rules: { "@typescript-eslint/prefer-for-of": "off" }, 18 | languageOptions: { 19 | ecmaVersion: "latest", 20 | parser: tseslint.parser, 21 | parserOptions: { 22 | project: true, 23 | }, 24 | }, 25 | }, 26 | { 27 | ignores: ["node_modules/**", "pnpm-lock.yaml", "out/**"], 28 | }, 29 | ); 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "torn-detector", 3 | "version": "1.0.0", 4 | "description": "Detect if a contract has been deployed in the latest (or predefined) block from an address that was previously funded through Tornado.Cash.", 5 | "main": "index.ts", 6 | "keywords": [ 7 | "deployment", 8 | "ethereum", 9 | "smart-contracts", 10 | "ethersjs", 11 | "tornado-cash" 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/pcaversaccio/torn-detector.git" 16 | }, 17 | "homepage": "https://github.com/pcaversaccio/torn-detector#readme", 18 | "bugs": { 19 | "url": "https://github.com/pcaversaccio/torn-detector/issues" 20 | }, 21 | "author": "Pascal Marco Caversaccio ", 22 | "license": "WTFPL", 23 | "packageManager": "pnpm@10.12.1", 24 | "scripts": { 25 | "test": "mocha --exit --recursive \"test/**/*.test.ts\"", 26 | "prettier:check": "npx prettier -c \"**/*.{js,ts,md,json,yml,yaml}\"", 27 | "prettier:fix": "npx prettier -w \"**/*.{js,ts,md,json,yml,yaml}\"", 28 | "lint:check": "pnpm prettier:check && npx eslint .", 29 | "lint:fix": "pnpm prettier:fix && npx eslint . --fix" 30 | }, 31 | "devDependencies": { 32 | "@eslint/js": "^9.28.0", 33 | "@types/chai": "^5.2.2", 34 | "@types/mocha": "^10.0.10", 35 | "@types/node": "^22.15.30", 36 | "@types/node-fetch": "^2.6.12", 37 | "chai": "^5.2.0", 38 | "dotenv": "^16.5.0", 39 | "eslint": "^9.28.0", 40 | "eslint-config-prettier": "^10.1.5", 41 | "ethers": "^6.14.3", 42 | "mocha": "^11.6.0", 43 | "node-fetch": "3.3.2", 44 | "prettier": "^3.5.3", 45 | "ts-node": "^10.9.2", 46 | "typescript": "^5.8.3", 47 | "typescript-eslint": "^8.33.1" 48 | }, 49 | "type": "module" 50 | } 51 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@eslint/js': 12 | specifier: ^9.28.0 13 | version: 9.28.0 14 | '@types/chai': 15 | specifier: ^5.2.2 16 | version: 5.2.2 17 | '@types/mocha': 18 | specifier: ^10.0.10 19 | version: 10.0.10 20 | '@types/node': 21 | specifier: ^22.15.30 22 | version: 22.15.30 23 | '@types/node-fetch': 24 | specifier: ^2.6.12 25 | version: 2.6.12 26 | chai: 27 | specifier: ^5.2.0 28 | version: 5.2.0 29 | dotenv: 30 | specifier: ^16.5.0 31 | version: 16.5.0 32 | eslint: 33 | specifier: ^9.28.0 34 | version: 9.28.0 35 | eslint-config-prettier: 36 | specifier: ^10.1.5 37 | version: 10.1.5(eslint@9.28.0) 38 | ethers: 39 | specifier: ^6.14.3 40 | version: 6.14.3 41 | mocha: 42 | specifier: ^11.6.0 43 | version: 11.6.0 44 | node-fetch: 45 | specifier: 3.3.2 46 | version: 3.3.2 47 | prettier: 48 | specifier: ^3.5.3 49 | version: 3.5.3 50 | ts-node: 51 | specifier: ^10.9.2 52 | version: 10.9.2(@types/node@22.15.30)(typescript@5.8.3) 53 | typescript: 54 | specifier: ^5.8.3 55 | version: 5.8.3 56 | typescript-eslint: 57 | specifier: ^8.33.1 58 | version: 8.33.1(eslint@9.28.0)(typescript@5.8.3) 59 | 60 | packages: 61 | 62 | '@adraffy/ens-normalize@1.10.1': 63 | resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} 64 | 65 | '@cspotcode/source-map-support@0.8.1': 66 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 67 | engines: {node: '>=12'} 68 | 69 | '@eslint-community/eslint-utils@4.7.0': 70 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 71 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 72 | peerDependencies: 73 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 74 | 75 | '@eslint-community/regexpp@4.12.1': 76 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 77 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 78 | 79 | '@eslint/config-array@0.20.0': 80 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 81 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 82 | 83 | '@eslint/config-helpers@0.2.2': 84 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} 85 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 86 | 87 | '@eslint/core@0.14.0': 88 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 89 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 90 | 91 | '@eslint/eslintrc@3.3.1': 92 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 93 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 94 | 95 | '@eslint/js@9.28.0': 96 | resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} 97 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 98 | 99 | '@eslint/object-schema@2.1.6': 100 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 101 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 102 | 103 | '@eslint/plugin-kit@0.3.1': 104 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 105 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 106 | 107 | '@humanfs/core@0.19.1': 108 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 109 | engines: {node: '>=18.18.0'} 110 | 111 | '@humanfs/node@0.16.6': 112 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 113 | engines: {node: '>=18.18.0'} 114 | 115 | '@humanwhocodes/module-importer@1.0.1': 116 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 117 | engines: {node: '>=12.22'} 118 | 119 | '@humanwhocodes/retry@0.3.1': 120 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 121 | engines: {node: '>=18.18'} 122 | 123 | '@humanwhocodes/retry@0.4.3': 124 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 125 | engines: {node: '>=18.18'} 126 | 127 | '@isaacs/cliui@8.0.2': 128 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 129 | engines: {node: '>=12'} 130 | 131 | '@jridgewell/resolve-uri@3.1.2': 132 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 133 | engines: {node: '>=6.0.0'} 134 | 135 | '@jridgewell/sourcemap-codec@1.5.0': 136 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 137 | 138 | '@jridgewell/trace-mapping@0.3.9': 139 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 140 | 141 | '@noble/curves@1.2.0': 142 | resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} 143 | 144 | '@noble/hashes@1.3.2': 145 | resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} 146 | engines: {node: '>= 16'} 147 | 148 | '@nodelib/fs.scandir@2.1.5': 149 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 150 | engines: {node: '>= 8'} 151 | 152 | '@nodelib/fs.stat@2.0.5': 153 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 154 | engines: {node: '>= 8'} 155 | 156 | '@nodelib/fs.walk@1.2.8': 157 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 158 | engines: {node: '>= 8'} 159 | 160 | '@pkgjs/parseargs@0.11.0': 161 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 162 | engines: {node: '>=14'} 163 | 164 | '@tsconfig/node10@1.0.11': 165 | resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} 166 | 167 | '@tsconfig/node12@1.0.11': 168 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 169 | 170 | '@tsconfig/node14@1.0.3': 171 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 172 | 173 | '@tsconfig/node16@1.0.4': 174 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 175 | 176 | '@types/chai@5.2.2': 177 | resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 178 | 179 | '@types/deep-eql@4.0.2': 180 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 181 | 182 | '@types/estree@1.0.8': 183 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 184 | 185 | '@types/json-schema@7.0.15': 186 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 187 | 188 | '@types/mocha@10.0.10': 189 | resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} 190 | 191 | '@types/node-fetch@2.6.12': 192 | resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} 193 | 194 | '@types/node@22.15.30': 195 | resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} 196 | 197 | '@types/node@22.7.5': 198 | resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} 199 | 200 | '@typescript-eslint/eslint-plugin@8.33.1': 201 | resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} 202 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 203 | peerDependencies: 204 | '@typescript-eslint/parser': ^8.33.1 205 | eslint: ^8.57.0 || ^9.0.0 206 | typescript: '>=4.8.4 <5.9.0' 207 | 208 | '@typescript-eslint/parser@8.33.1': 209 | resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} 210 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 211 | peerDependencies: 212 | eslint: ^8.57.0 || ^9.0.0 213 | typescript: '>=4.8.4 <5.9.0' 214 | 215 | '@typescript-eslint/project-service@8.33.1': 216 | resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} 217 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 218 | peerDependencies: 219 | typescript: '>=4.8.4 <5.9.0' 220 | 221 | '@typescript-eslint/scope-manager@8.33.1': 222 | resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} 223 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 224 | 225 | '@typescript-eslint/tsconfig-utils@8.33.1': 226 | resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} 227 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 228 | peerDependencies: 229 | typescript: '>=4.8.4 <5.9.0' 230 | 231 | '@typescript-eslint/type-utils@8.33.1': 232 | resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} 233 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 234 | peerDependencies: 235 | eslint: ^8.57.0 || ^9.0.0 236 | typescript: '>=4.8.4 <5.9.0' 237 | 238 | '@typescript-eslint/types@8.33.1': 239 | resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} 240 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 241 | 242 | '@typescript-eslint/typescript-estree@8.33.1': 243 | resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} 244 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 245 | peerDependencies: 246 | typescript: '>=4.8.4 <5.9.0' 247 | 248 | '@typescript-eslint/utils@8.33.1': 249 | resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} 250 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 251 | peerDependencies: 252 | eslint: ^8.57.0 || ^9.0.0 253 | typescript: '>=4.8.4 <5.9.0' 254 | 255 | '@typescript-eslint/visitor-keys@8.33.1': 256 | resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} 257 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 258 | 259 | acorn-jsx@5.3.2: 260 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 261 | peerDependencies: 262 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 263 | 264 | acorn-walk@8.3.4: 265 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 266 | engines: {node: '>=0.4.0'} 267 | 268 | acorn@8.15.0: 269 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 270 | engines: {node: '>=0.4.0'} 271 | hasBin: true 272 | 273 | aes-js@4.0.0-beta.5: 274 | resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} 275 | 276 | ajv@6.12.6: 277 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 278 | 279 | ansi-regex@5.0.1: 280 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 281 | engines: {node: '>=8'} 282 | 283 | ansi-regex@6.1.0: 284 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 285 | engines: {node: '>=12'} 286 | 287 | ansi-styles@4.3.0: 288 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 289 | engines: {node: '>=8'} 290 | 291 | ansi-styles@6.2.1: 292 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 293 | engines: {node: '>=12'} 294 | 295 | arg@4.1.3: 296 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 297 | 298 | argparse@2.0.1: 299 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 300 | 301 | assertion-error@2.0.1: 302 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 303 | engines: {node: '>=12'} 304 | 305 | asynckit@0.4.0: 306 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 307 | 308 | balanced-match@1.0.2: 309 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 310 | 311 | brace-expansion@1.1.11: 312 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 313 | 314 | brace-expansion@2.0.1: 315 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 316 | 317 | braces@3.0.3: 318 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 319 | engines: {node: '>=8'} 320 | 321 | browser-stdout@1.3.1: 322 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 323 | 324 | call-bind-apply-helpers@1.0.2: 325 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 326 | engines: {node: '>= 0.4'} 327 | 328 | callsites@3.1.0: 329 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 330 | engines: {node: '>=6'} 331 | 332 | camelcase@6.3.0: 333 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 334 | engines: {node: '>=10'} 335 | 336 | chai@5.2.0: 337 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 338 | engines: {node: '>=12'} 339 | 340 | chalk@4.1.2: 341 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 342 | engines: {node: '>=10'} 343 | 344 | check-error@2.1.1: 345 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 346 | engines: {node: '>= 16'} 347 | 348 | chokidar@4.0.3: 349 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 350 | engines: {node: '>= 14.16.0'} 351 | 352 | cliui@8.0.1: 353 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 354 | engines: {node: '>=12'} 355 | 356 | color-convert@2.0.1: 357 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 358 | engines: {node: '>=7.0.0'} 359 | 360 | color-name@1.1.4: 361 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 362 | 363 | combined-stream@1.0.8: 364 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 365 | engines: {node: '>= 0.8'} 366 | 367 | concat-map@0.0.1: 368 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 369 | 370 | create-require@1.1.1: 371 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 372 | 373 | cross-spawn@7.0.6: 374 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 375 | engines: {node: '>= 8'} 376 | 377 | data-uri-to-buffer@4.0.1: 378 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 379 | engines: {node: '>= 12'} 380 | 381 | debug@4.4.1: 382 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 383 | engines: {node: '>=6.0'} 384 | peerDependencies: 385 | supports-color: '*' 386 | peerDependenciesMeta: 387 | supports-color: 388 | optional: true 389 | 390 | decamelize@4.0.0: 391 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 392 | engines: {node: '>=10'} 393 | 394 | deep-eql@5.0.2: 395 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 396 | engines: {node: '>=6'} 397 | 398 | deep-is@0.1.4: 399 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 400 | 401 | delayed-stream@1.0.0: 402 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 403 | engines: {node: '>=0.4.0'} 404 | 405 | diff@4.0.2: 406 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 407 | engines: {node: '>=0.3.1'} 408 | 409 | diff@7.0.0: 410 | resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} 411 | engines: {node: '>=0.3.1'} 412 | 413 | dotenv@16.5.0: 414 | resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} 415 | engines: {node: '>=12'} 416 | 417 | dunder-proto@1.0.1: 418 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 419 | engines: {node: '>= 0.4'} 420 | 421 | eastasianwidth@0.2.0: 422 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 423 | 424 | emoji-regex@8.0.0: 425 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 426 | 427 | emoji-regex@9.2.2: 428 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 429 | 430 | es-define-property@1.0.1: 431 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 432 | engines: {node: '>= 0.4'} 433 | 434 | es-errors@1.3.0: 435 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 436 | engines: {node: '>= 0.4'} 437 | 438 | es-object-atoms@1.1.1: 439 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 440 | engines: {node: '>= 0.4'} 441 | 442 | es-set-tostringtag@2.1.0: 443 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 444 | engines: {node: '>= 0.4'} 445 | 446 | escalade@3.2.0: 447 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 448 | engines: {node: '>=6'} 449 | 450 | escape-string-regexp@4.0.0: 451 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 452 | engines: {node: '>=10'} 453 | 454 | eslint-config-prettier@10.1.5: 455 | resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} 456 | hasBin: true 457 | peerDependencies: 458 | eslint: '>=7.0.0' 459 | 460 | eslint-scope@8.3.0: 461 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 462 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 463 | 464 | eslint-visitor-keys@3.4.3: 465 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 466 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 467 | 468 | eslint-visitor-keys@4.2.0: 469 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 470 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 471 | 472 | eslint@9.28.0: 473 | resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} 474 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 475 | hasBin: true 476 | peerDependencies: 477 | jiti: '*' 478 | peerDependenciesMeta: 479 | jiti: 480 | optional: true 481 | 482 | espree@10.3.0: 483 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 484 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 485 | 486 | esquery@1.6.0: 487 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 488 | engines: {node: '>=0.10'} 489 | 490 | esrecurse@4.3.0: 491 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 492 | engines: {node: '>=4.0'} 493 | 494 | estraverse@5.3.0: 495 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 496 | engines: {node: '>=4.0'} 497 | 498 | esutils@2.0.3: 499 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 500 | engines: {node: '>=0.10.0'} 501 | 502 | ethers@6.14.3: 503 | resolution: {integrity: sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==} 504 | engines: {node: '>=14.0.0'} 505 | 506 | fast-deep-equal@3.1.3: 507 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 508 | 509 | fast-glob@3.3.3: 510 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 511 | engines: {node: '>=8.6.0'} 512 | 513 | fast-json-stable-stringify@2.1.0: 514 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 515 | 516 | fast-levenshtein@2.0.6: 517 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 518 | 519 | fastq@1.19.1: 520 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 521 | 522 | fetch-blob@3.2.0: 523 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 524 | engines: {node: ^12.20 || >= 14.13} 525 | 526 | file-entry-cache@8.0.0: 527 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 528 | engines: {node: '>=16.0.0'} 529 | 530 | fill-range@7.1.1: 531 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 532 | engines: {node: '>=8'} 533 | 534 | find-up@5.0.0: 535 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 536 | engines: {node: '>=10'} 537 | 538 | flat-cache@4.0.1: 539 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 540 | engines: {node: '>=16'} 541 | 542 | flat@5.0.2: 543 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 544 | hasBin: true 545 | 546 | flatted@3.3.3: 547 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 548 | 549 | foreground-child@3.3.1: 550 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 551 | engines: {node: '>=14'} 552 | 553 | form-data@4.0.3: 554 | resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} 555 | engines: {node: '>= 6'} 556 | 557 | formdata-polyfill@4.0.10: 558 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 559 | engines: {node: '>=12.20.0'} 560 | 561 | function-bind@1.1.2: 562 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 563 | 564 | get-caller-file@2.0.5: 565 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 566 | engines: {node: 6.* || 8.* || >= 10.*} 567 | 568 | get-intrinsic@1.3.0: 569 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 570 | engines: {node: '>= 0.4'} 571 | 572 | get-proto@1.0.1: 573 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 574 | engines: {node: '>= 0.4'} 575 | 576 | glob-parent@5.1.2: 577 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 578 | engines: {node: '>= 6'} 579 | 580 | glob-parent@6.0.2: 581 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 582 | engines: {node: '>=10.13.0'} 583 | 584 | glob@10.4.5: 585 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 586 | hasBin: true 587 | 588 | globals@14.0.0: 589 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 590 | engines: {node: '>=18'} 591 | 592 | gopd@1.2.0: 593 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 594 | engines: {node: '>= 0.4'} 595 | 596 | graphemer@1.4.0: 597 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 598 | 599 | has-flag@4.0.0: 600 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 601 | engines: {node: '>=8'} 602 | 603 | has-symbols@1.1.0: 604 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 605 | engines: {node: '>= 0.4'} 606 | 607 | has-tostringtag@1.0.2: 608 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 609 | engines: {node: '>= 0.4'} 610 | 611 | hasown@2.0.2: 612 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 613 | engines: {node: '>= 0.4'} 614 | 615 | he@1.2.0: 616 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 617 | hasBin: true 618 | 619 | ignore@5.3.2: 620 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 621 | engines: {node: '>= 4'} 622 | 623 | ignore@7.0.5: 624 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 625 | engines: {node: '>= 4'} 626 | 627 | import-fresh@3.3.1: 628 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 629 | engines: {node: '>=6'} 630 | 631 | imurmurhash@0.1.4: 632 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 633 | engines: {node: '>=0.8.19'} 634 | 635 | is-extglob@2.1.1: 636 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 637 | engines: {node: '>=0.10.0'} 638 | 639 | is-fullwidth-code-point@3.0.0: 640 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 641 | engines: {node: '>=8'} 642 | 643 | is-glob@4.0.3: 644 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 645 | engines: {node: '>=0.10.0'} 646 | 647 | is-number@7.0.0: 648 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 649 | engines: {node: '>=0.12.0'} 650 | 651 | is-plain-obj@2.1.0: 652 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 653 | engines: {node: '>=8'} 654 | 655 | is-unicode-supported@0.1.0: 656 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 657 | engines: {node: '>=10'} 658 | 659 | isexe@2.0.0: 660 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 661 | 662 | jackspeak@3.4.3: 663 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 664 | 665 | js-yaml@4.1.0: 666 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 667 | hasBin: true 668 | 669 | json-buffer@3.0.1: 670 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 671 | 672 | json-schema-traverse@0.4.1: 673 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 674 | 675 | json-stable-stringify-without-jsonify@1.0.1: 676 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 677 | 678 | keyv@4.5.4: 679 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 680 | 681 | levn@0.4.1: 682 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 683 | engines: {node: '>= 0.8.0'} 684 | 685 | locate-path@6.0.0: 686 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 687 | engines: {node: '>=10'} 688 | 689 | lodash.merge@4.6.2: 690 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 691 | 692 | log-symbols@4.1.0: 693 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 694 | engines: {node: '>=10'} 695 | 696 | loupe@3.1.3: 697 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 698 | 699 | lru-cache@10.4.3: 700 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 701 | 702 | make-error@1.3.6: 703 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 704 | 705 | math-intrinsics@1.1.0: 706 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 707 | engines: {node: '>= 0.4'} 708 | 709 | merge2@1.4.1: 710 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 711 | engines: {node: '>= 8'} 712 | 713 | micromatch@4.0.8: 714 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 715 | engines: {node: '>=8.6'} 716 | 717 | mime-db@1.52.0: 718 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 719 | engines: {node: '>= 0.6'} 720 | 721 | mime-types@2.1.35: 722 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 723 | engines: {node: '>= 0.6'} 724 | 725 | minimatch@3.1.2: 726 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 727 | 728 | minimatch@9.0.5: 729 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 730 | engines: {node: '>=16 || 14 >=14.17'} 731 | 732 | minipass@7.1.2: 733 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 734 | engines: {node: '>=16 || 14 >=14.17'} 735 | 736 | mocha@11.6.0: 737 | resolution: {integrity: sha512-i0JVb+OUBqw63X/1pC3jCyJsqYisgxySBbsQa8TKvefpA1oEnw7JXxXnftfMHRsw7bEEVGRtVlHcDYXBa7FzVw==} 738 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 739 | hasBin: true 740 | 741 | ms@2.1.3: 742 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 743 | 744 | natural-compare@1.4.0: 745 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 746 | 747 | node-domexception@1.0.0: 748 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 749 | engines: {node: '>=10.5.0'} 750 | deprecated: Use your platform's native DOMException instead 751 | 752 | node-fetch@3.3.2: 753 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 754 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 755 | 756 | optionator@0.9.4: 757 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 758 | engines: {node: '>= 0.8.0'} 759 | 760 | p-limit@3.1.0: 761 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 762 | engines: {node: '>=10'} 763 | 764 | p-locate@5.0.0: 765 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 766 | engines: {node: '>=10'} 767 | 768 | package-json-from-dist@1.0.1: 769 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 770 | 771 | parent-module@1.0.1: 772 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 773 | engines: {node: '>=6'} 774 | 775 | path-exists@4.0.0: 776 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 777 | engines: {node: '>=8'} 778 | 779 | path-key@3.1.1: 780 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 781 | engines: {node: '>=8'} 782 | 783 | path-scurry@1.11.1: 784 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 785 | engines: {node: '>=16 || 14 >=14.18'} 786 | 787 | pathval@2.0.0: 788 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 789 | engines: {node: '>= 14.16'} 790 | 791 | picocolors@1.1.1: 792 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 793 | 794 | picomatch@2.3.1: 795 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 796 | engines: {node: '>=8.6'} 797 | 798 | prelude-ls@1.2.1: 799 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 800 | engines: {node: '>= 0.8.0'} 801 | 802 | prettier@3.5.3: 803 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 804 | engines: {node: '>=14'} 805 | hasBin: true 806 | 807 | punycode@2.3.1: 808 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 809 | engines: {node: '>=6'} 810 | 811 | queue-microtask@1.2.3: 812 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 813 | 814 | randombytes@2.1.0: 815 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 816 | 817 | readdirp@4.1.2: 818 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 819 | engines: {node: '>= 14.18.0'} 820 | 821 | require-directory@2.1.1: 822 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 823 | engines: {node: '>=0.10.0'} 824 | 825 | resolve-from@4.0.0: 826 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 827 | engines: {node: '>=4'} 828 | 829 | reusify@1.1.0: 830 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 831 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 832 | 833 | run-parallel@1.2.0: 834 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 835 | 836 | safe-buffer@5.2.1: 837 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 838 | 839 | semver@7.7.2: 840 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 841 | engines: {node: '>=10'} 842 | hasBin: true 843 | 844 | serialize-javascript@6.0.2: 845 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 846 | 847 | shebang-command@2.0.0: 848 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 849 | engines: {node: '>=8'} 850 | 851 | shebang-regex@3.0.0: 852 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 853 | engines: {node: '>=8'} 854 | 855 | signal-exit@4.1.0: 856 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 857 | engines: {node: '>=14'} 858 | 859 | string-width@4.2.3: 860 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 861 | engines: {node: '>=8'} 862 | 863 | string-width@5.1.2: 864 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 865 | engines: {node: '>=12'} 866 | 867 | strip-ansi@6.0.1: 868 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 869 | engines: {node: '>=8'} 870 | 871 | strip-ansi@7.1.0: 872 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 873 | engines: {node: '>=12'} 874 | 875 | strip-json-comments@3.1.1: 876 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 877 | engines: {node: '>=8'} 878 | 879 | supports-color@7.2.0: 880 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 881 | engines: {node: '>=8'} 882 | 883 | supports-color@8.1.1: 884 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 885 | engines: {node: '>=10'} 886 | 887 | to-regex-range@5.0.1: 888 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 889 | engines: {node: '>=8.0'} 890 | 891 | ts-api-utils@2.1.0: 892 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 893 | engines: {node: '>=18.12'} 894 | peerDependencies: 895 | typescript: '>=4.8.4' 896 | 897 | ts-node@10.9.2: 898 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 899 | hasBin: true 900 | peerDependencies: 901 | '@swc/core': '>=1.2.50' 902 | '@swc/wasm': '>=1.2.50' 903 | '@types/node': '*' 904 | typescript: '>=2.7' 905 | peerDependenciesMeta: 906 | '@swc/core': 907 | optional: true 908 | '@swc/wasm': 909 | optional: true 910 | 911 | tslib@2.7.0: 912 | resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} 913 | 914 | type-check@0.4.0: 915 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 916 | engines: {node: '>= 0.8.0'} 917 | 918 | typescript-eslint@8.33.1: 919 | resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} 920 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 921 | peerDependencies: 922 | eslint: ^8.57.0 || ^9.0.0 923 | typescript: '>=4.8.4 <5.9.0' 924 | 925 | typescript@5.8.3: 926 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 927 | engines: {node: '>=14.17'} 928 | hasBin: true 929 | 930 | undici-types@6.19.8: 931 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 932 | 933 | undici-types@6.21.0: 934 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 935 | 936 | uri-js@4.4.1: 937 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 938 | 939 | v8-compile-cache-lib@3.0.1: 940 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 941 | 942 | web-streams-polyfill@3.3.3: 943 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 944 | engines: {node: '>= 8'} 945 | 946 | which@2.0.2: 947 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 948 | engines: {node: '>= 8'} 949 | hasBin: true 950 | 951 | word-wrap@1.2.5: 952 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 953 | engines: {node: '>=0.10.0'} 954 | 955 | workerpool@9.3.2: 956 | resolution: {integrity: sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==} 957 | 958 | wrap-ansi@7.0.0: 959 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 960 | engines: {node: '>=10'} 961 | 962 | wrap-ansi@8.1.0: 963 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 964 | engines: {node: '>=12'} 965 | 966 | ws@8.17.1: 967 | resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} 968 | engines: {node: '>=10.0.0'} 969 | peerDependencies: 970 | bufferutil: ^4.0.1 971 | utf-8-validate: '>=5.0.2' 972 | peerDependenciesMeta: 973 | bufferutil: 974 | optional: true 975 | utf-8-validate: 976 | optional: true 977 | 978 | y18n@5.0.8: 979 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 980 | engines: {node: '>=10'} 981 | 982 | yargs-parser@21.1.1: 983 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 984 | engines: {node: '>=12'} 985 | 986 | yargs-unparser@2.0.0: 987 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 988 | engines: {node: '>=10'} 989 | 990 | yargs@17.7.2: 991 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 992 | engines: {node: '>=12'} 993 | 994 | yn@3.1.1: 995 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 996 | engines: {node: '>=6'} 997 | 998 | yocto-queue@0.1.0: 999 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1000 | engines: {node: '>=10'} 1001 | 1002 | snapshots: 1003 | 1004 | '@adraffy/ens-normalize@1.10.1': {} 1005 | 1006 | '@cspotcode/source-map-support@0.8.1': 1007 | dependencies: 1008 | '@jridgewell/trace-mapping': 0.3.9 1009 | 1010 | '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0)': 1011 | dependencies: 1012 | eslint: 9.28.0 1013 | eslint-visitor-keys: 3.4.3 1014 | 1015 | '@eslint-community/regexpp@4.12.1': {} 1016 | 1017 | '@eslint/config-array@0.20.0': 1018 | dependencies: 1019 | '@eslint/object-schema': 2.1.6 1020 | debug: 4.4.1(supports-color@8.1.1) 1021 | minimatch: 3.1.2 1022 | transitivePeerDependencies: 1023 | - supports-color 1024 | 1025 | '@eslint/config-helpers@0.2.2': {} 1026 | 1027 | '@eslint/core@0.14.0': 1028 | dependencies: 1029 | '@types/json-schema': 7.0.15 1030 | 1031 | '@eslint/eslintrc@3.3.1': 1032 | dependencies: 1033 | ajv: 6.12.6 1034 | debug: 4.4.1(supports-color@8.1.1) 1035 | espree: 10.3.0 1036 | globals: 14.0.0 1037 | ignore: 5.3.2 1038 | import-fresh: 3.3.1 1039 | js-yaml: 4.1.0 1040 | minimatch: 3.1.2 1041 | strip-json-comments: 3.1.1 1042 | transitivePeerDependencies: 1043 | - supports-color 1044 | 1045 | '@eslint/js@9.28.0': {} 1046 | 1047 | '@eslint/object-schema@2.1.6': {} 1048 | 1049 | '@eslint/plugin-kit@0.3.1': 1050 | dependencies: 1051 | '@eslint/core': 0.14.0 1052 | levn: 0.4.1 1053 | 1054 | '@humanfs/core@0.19.1': {} 1055 | 1056 | '@humanfs/node@0.16.6': 1057 | dependencies: 1058 | '@humanfs/core': 0.19.1 1059 | '@humanwhocodes/retry': 0.3.1 1060 | 1061 | '@humanwhocodes/module-importer@1.0.1': {} 1062 | 1063 | '@humanwhocodes/retry@0.3.1': {} 1064 | 1065 | '@humanwhocodes/retry@0.4.3': {} 1066 | 1067 | '@isaacs/cliui@8.0.2': 1068 | dependencies: 1069 | string-width: 5.1.2 1070 | string-width-cjs: string-width@4.2.3 1071 | strip-ansi: 7.1.0 1072 | strip-ansi-cjs: strip-ansi@6.0.1 1073 | wrap-ansi: 8.1.0 1074 | wrap-ansi-cjs: wrap-ansi@7.0.0 1075 | 1076 | '@jridgewell/resolve-uri@3.1.2': {} 1077 | 1078 | '@jridgewell/sourcemap-codec@1.5.0': {} 1079 | 1080 | '@jridgewell/trace-mapping@0.3.9': 1081 | dependencies: 1082 | '@jridgewell/resolve-uri': 3.1.2 1083 | '@jridgewell/sourcemap-codec': 1.5.0 1084 | 1085 | '@noble/curves@1.2.0': 1086 | dependencies: 1087 | '@noble/hashes': 1.3.2 1088 | 1089 | '@noble/hashes@1.3.2': {} 1090 | 1091 | '@nodelib/fs.scandir@2.1.5': 1092 | dependencies: 1093 | '@nodelib/fs.stat': 2.0.5 1094 | run-parallel: 1.2.0 1095 | 1096 | '@nodelib/fs.stat@2.0.5': {} 1097 | 1098 | '@nodelib/fs.walk@1.2.8': 1099 | dependencies: 1100 | '@nodelib/fs.scandir': 2.1.5 1101 | fastq: 1.19.1 1102 | 1103 | '@pkgjs/parseargs@0.11.0': 1104 | optional: true 1105 | 1106 | '@tsconfig/node10@1.0.11': {} 1107 | 1108 | '@tsconfig/node12@1.0.11': {} 1109 | 1110 | '@tsconfig/node14@1.0.3': {} 1111 | 1112 | '@tsconfig/node16@1.0.4': {} 1113 | 1114 | '@types/chai@5.2.2': 1115 | dependencies: 1116 | '@types/deep-eql': 4.0.2 1117 | 1118 | '@types/deep-eql@4.0.2': {} 1119 | 1120 | '@types/estree@1.0.8': {} 1121 | 1122 | '@types/json-schema@7.0.15': {} 1123 | 1124 | '@types/mocha@10.0.10': {} 1125 | 1126 | '@types/node-fetch@2.6.12': 1127 | dependencies: 1128 | '@types/node': 22.15.30 1129 | form-data: 4.0.3 1130 | 1131 | '@types/node@22.15.30': 1132 | dependencies: 1133 | undici-types: 6.21.0 1134 | 1135 | '@types/node@22.7.5': 1136 | dependencies: 1137 | undici-types: 6.19.8 1138 | 1139 | '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0)(typescript@5.8.3))(eslint@9.28.0)(typescript@5.8.3)': 1140 | dependencies: 1141 | '@eslint-community/regexpp': 4.12.1 1142 | '@typescript-eslint/parser': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1143 | '@typescript-eslint/scope-manager': 8.33.1 1144 | '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1145 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1146 | '@typescript-eslint/visitor-keys': 8.33.1 1147 | eslint: 9.28.0 1148 | graphemer: 1.4.0 1149 | ignore: 7.0.5 1150 | natural-compare: 1.4.0 1151 | ts-api-utils: 2.1.0(typescript@5.8.3) 1152 | typescript: 5.8.3 1153 | transitivePeerDependencies: 1154 | - supports-color 1155 | 1156 | '@typescript-eslint/parser@8.33.1(eslint@9.28.0)(typescript@5.8.3)': 1157 | dependencies: 1158 | '@typescript-eslint/scope-manager': 8.33.1 1159 | '@typescript-eslint/types': 8.33.1 1160 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 1161 | '@typescript-eslint/visitor-keys': 8.33.1 1162 | debug: 4.4.1(supports-color@8.1.1) 1163 | eslint: 9.28.0 1164 | typescript: 5.8.3 1165 | transitivePeerDependencies: 1166 | - supports-color 1167 | 1168 | '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': 1169 | dependencies: 1170 | '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) 1171 | '@typescript-eslint/types': 8.33.1 1172 | debug: 4.4.1(supports-color@8.1.1) 1173 | typescript: 5.8.3 1174 | transitivePeerDependencies: 1175 | - supports-color 1176 | 1177 | '@typescript-eslint/scope-manager@8.33.1': 1178 | dependencies: 1179 | '@typescript-eslint/types': 8.33.1 1180 | '@typescript-eslint/visitor-keys': 8.33.1 1181 | 1182 | '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': 1183 | dependencies: 1184 | typescript: 5.8.3 1185 | 1186 | '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0)(typescript@5.8.3)': 1187 | dependencies: 1188 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 1189 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1190 | debug: 4.4.1(supports-color@8.1.1) 1191 | eslint: 9.28.0 1192 | ts-api-utils: 2.1.0(typescript@5.8.3) 1193 | typescript: 5.8.3 1194 | transitivePeerDependencies: 1195 | - supports-color 1196 | 1197 | '@typescript-eslint/types@8.33.1': {} 1198 | 1199 | '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': 1200 | dependencies: 1201 | '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) 1202 | '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) 1203 | '@typescript-eslint/types': 8.33.1 1204 | '@typescript-eslint/visitor-keys': 8.33.1 1205 | debug: 4.4.1(supports-color@8.1.1) 1206 | fast-glob: 3.3.3 1207 | is-glob: 4.0.3 1208 | minimatch: 9.0.5 1209 | semver: 7.7.2 1210 | ts-api-utils: 2.1.0(typescript@5.8.3) 1211 | typescript: 5.8.3 1212 | transitivePeerDependencies: 1213 | - supports-color 1214 | 1215 | '@typescript-eslint/utils@8.33.1(eslint@9.28.0)(typescript@5.8.3)': 1216 | dependencies: 1217 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0) 1218 | '@typescript-eslint/scope-manager': 8.33.1 1219 | '@typescript-eslint/types': 8.33.1 1220 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 1221 | eslint: 9.28.0 1222 | typescript: 5.8.3 1223 | transitivePeerDependencies: 1224 | - supports-color 1225 | 1226 | '@typescript-eslint/visitor-keys@8.33.1': 1227 | dependencies: 1228 | '@typescript-eslint/types': 8.33.1 1229 | eslint-visitor-keys: 4.2.0 1230 | 1231 | acorn-jsx@5.3.2(acorn@8.15.0): 1232 | dependencies: 1233 | acorn: 8.15.0 1234 | 1235 | acorn-walk@8.3.4: 1236 | dependencies: 1237 | acorn: 8.15.0 1238 | 1239 | acorn@8.15.0: {} 1240 | 1241 | aes-js@4.0.0-beta.5: {} 1242 | 1243 | ajv@6.12.6: 1244 | dependencies: 1245 | fast-deep-equal: 3.1.3 1246 | fast-json-stable-stringify: 2.1.0 1247 | json-schema-traverse: 0.4.1 1248 | uri-js: 4.4.1 1249 | 1250 | ansi-regex@5.0.1: {} 1251 | 1252 | ansi-regex@6.1.0: {} 1253 | 1254 | ansi-styles@4.3.0: 1255 | dependencies: 1256 | color-convert: 2.0.1 1257 | 1258 | ansi-styles@6.2.1: {} 1259 | 1260 | arg@4.1.3: {} 1261 | 1262 | argparse@2.0.1: {} 1263 | 1264 | assertion-error@2.0.1: {} 1265 | 1266 | asynckit@0.4.0: {} 1267 | 1268 | balanced-match@1.0.2: {} 1269 | 1270 | brace-expansion@1.1.11: 1271 | dependencies: 1272 | balanced-match: 1.0.2 1273 | concat-map: 0.0.1 1274 | 1275 | brace-expansion@2.0.1: 1276 | dependencies: 1277 | balanced-match: 1.0.2 1278 | 1279 | braces@3.0.3: 1280 | dependencies: 1281 | fill-range: 7.1.1 1282 | 1283 | browser-stdout@1.3.1: {} 1284 | 1285 | call-bind-apply-helpers@1.0.2: 1286 | dependencies: 1287 | es-errors: 1.3.0 1288 | function-bind: 1.1.2 1289 | 1290 | callsites@3.1.0: {} 1291 | 1292 | camelcase@6.3.0: {} 1293 | 1294 | chai@5.2.0: 1295 | dependencies: 1296 | assertion-error: 2.0.1 1297 | check-error: 2.1.1 1298 | deep-eql: 5.0.2 1299 | loupe: 3.1.3 1300 | pathval: 2.0.0 1301 | 1302 | chalk@4.1.2: 1303 | dependencies: 1304 | ansi-styles: 4.3.0 1305 | supports-color: 7.2.0 1306 | 1307 | check-error@2.1.1: {} 1308 | 1309 | chokidar@4.0.3: 1310 | dependencies: 1311 | readdirp: 4.1.2 1312 | 1313 | cliui@8.0.1: 1314 | dependencies: 1315 | string-width: 4.2.3 1316 | strip-ansi: 6.0.1 1317 | wrap-ansi: 7.0.0 1318 | 1319 | color-convert@2.0.1: 1320 | dependencies: 1321 | color-name: 1.1.4 1322 | 1323 | color-name@1.1.4: {} 1324 | 1325 | combined-stream@1.0.8: 1326 | dependencies: 1327 | delayed-stream: 1.0.0 1328 | 1329 | concat-map@0.0.1: {} 1330 | 1331 | create-require@1.1.1: {} 1332 | 1333 | cross-spawn@7.0.6: 1334 | dependencies: 1335 | path-key: 3.1.1 1336 | shebang-command: 2.0.0 1337 | which: 2.0.2 1338 | 1339 | data-uri-to-buffer@4.0.1: {} 1340 | 1341 | debug@4.4.1(supports-color@8.1.1): 1342 | dependencies: 1343 | ms: 2.1.3 1344 | optionalDependencies: 1345 | supports-color: 8.1.1 1346 | 1347 | decamelize@4.0.0: {} 1348 | 1349 | deep-eql@5.0.2: {} 1350 | 1351 | deep-is@0.1.4: {} 1352 | 1353 | delayed-stream@1.0.0: {} 1354 | 1355 | diff@4.0.2: {} 1356 | 1357 | diff@7.0.0: {} 1358 | 1359 | dotenv@16.5.0: {} 1360 | 1361 | dunder-proto@1.0.1: 1362 | dependencies: 1363 | call-bind-apply-helpers: 1.0.2 1364 | es-errors: 1.3.0 1365 | gopd: 1.2.0 1366 | 1367 | eastasianwidth@0.2.0: {} 1368 | 1369 | emoji-regex@8.0.0: {} 1370 | 1371 | emoji-regex@9.2.2: {} 1372 | 1373 | es-define-property@1.0.1: {} 1374 | 1375 | es-errors@1.3.0: {} 1376 | 1377 | es-object-atoms@1.1.1: 1378 | dependencies: 1379 | es-errors: 1.3.0 1380 | 1381 | es-set-tostringtag@2.1.0: 1382 | dependencies: 1383 | es-errors: 1.3.0 1384 | get-intrinsic: 1.3.0 1385 | has-tostringtag: 1.0.2 1386 | hasown: 2.0.2 1387 | 1388 | escalade@3.2.0: {} 1389 | 1390 | escape-string-regexp@4.0.0: {} 1391 | 1392 | eslint-config-prettier@10.1.5(eslint@9.28.0): 1393 | dependencies: 1394 | eslint: 9.28.0 1395 | 1396 | eslint-scope@8.3.0: 1397 | dependencies: 1398 | esrecurse: 4.3.0 1399 | estraverse: 5.3.0 1400 | 1401 | eslint-visitor-keys@3.4.3: {} 1402 | 1403 | eslint-visitor-keys@4.2.0: {} 1404 | 1405 | eslint@9.28.0: 1406 | dependencies: 1407 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0) 1408 | '@eslint-community/regexpp': 4.12.1 1409 | '@eslint/config-array': 0.20.0 1410 | '@eslint/config-helpers': 0.2.2 1411 | '@eslint/core': 0.14.0 1412 | '@eslint/eslintrc': 3.3.1 1413 | '@eslint/js': 9.28.0 1414 | '@eslint/plugin-kit': 0.3.1 1415 | '@humanfs/node': 0.16.6 1416 | '@humanwhocodes/module-importer': 1.0.1 1417 | '@humanwhocodes/retry': 0.4.3 1418 | '@types/estree': 1.0.8 1419 | '@types/json-schema': 7.0.15 1420 | ajv: 6.12.6 1421 | chalk: 4.1.2 1422 | cross-spawn: 7.0.6 1423 | debug: 4.4.1(supports-color@8.1.1) 1424 | escape-string-regexp: 4.0.0 1425 | eslint-scope: 8.3.0 1426 | eslint-visitor-keys: 4.2.0 1427 | espree: 10.3.0 1428 | esquery: 1.6.0 1429 | esutils: 2.0.3 1430 | fast-deep-equal: 3.1.3 1431 | file-entry-cache: 8.0.0 1432 | find-up: 5.0.0 1433 | glob-parent: 6.0.2 1434 | ignore: 5.3.2 1435 | imurmurhash: 0.1.4 1436 | is-glob: 4.0.3 1437 | json-stable-stringify-without-jsonify: 1.0.1 1438 | lodash.merge: 4.6.2 1439 | minimatch: 3.1.2 1440 | natural-compare: 1.4.0 1441 | optionator: 0.9.4 1442 | transitivePeerDependencies: 1443 | - supports-color 1444 | 1445 | espree@10.3.0: 1446 | dependencies: 1447 | acorn: 8.15.0 1448 | acorn-jsx: 5.3.2(acorn@8.15.0) 1449 | eslint-visitor-keys: 4.2.0 1450 | 1451 | esquery@1.6.0: 1452 | dependencies: 1453 | estraverse: 5.3.0 1454 | 1455 | esrecurse@4.3.0: 1456 | dependencies: 1457 | estraverse: 5.3.0 1458 | 1459 | estraverse@5.3.0: {} 1460 | 1461 | esutils@2.0.3: {} 1462 | 1463 | ethers@6.14.3: 1464 | dependencies: 1465 | '@adraffy/ens-normalize': 1.10.1 1466 | '@noble/curves': 1.2.0 1467 | '@noble/hashes': 1.3.2 1468 | '@types/node': 22.7.5 1469 | aes-js: 4.0.0-beta.5 1470 | tslib: 2.7.0 1471 | ws: 8.17.1 1472 | transitivePeerDependencies: 1473 | - bufferutil 1474 | - utf-8-validate 1475 | 1476 | fast-deep-equal@3.1.3: {} 1477 | 1478 | fast-glob@3.3.3: 1479 | dependencies: 1480 | '@nodelib/fs.stat': 2.0.5 1481 | '@nodelib/fs.walk': 1.2.8 1482 | glob-parent: 5.1.2 1483 | merge2: 1.4.1 1484 | micromatch: 4.0.8 1485 | 1486 | fast-json-stable-stringify@2.1.0: {} 1487 | 1488 | fast-levenshtein@2.0.6: {} 1489 | 1490 | fastq@1.19.1: 1491 | dependencies: 1492 | reusify: 1.1.0 1493 | 1494 | fetch-blob@3.2.0: 1495 | dependencies: 1496 | node-domexception: 1.0.0 1497 | web-streams-polyfill: 3.3.3 1498 | 1499 | file-entry-cache@8.0.0: 1500 | dependencies: 1501 | flat-cache: 4.0.1 1502 | 1503 | fill-range@7.1.1: 1504 | dependencies: 1505 | to-regex-range: 5.0.1 1506 | 1507 | find-up@5.0.0: 1508 | dependencies: 1509 | locate-path: 6.0.0 1510 | path-exists: 4.0.0 1511 | 1512 | flat-cache@4.0.1: 1513 | dependencies: 1514 | flatted: 3.3.3 1515 | keyv: 4.5.4 1516 | 1517 | flat@5.0.2: {} 1518 | 1519 | flatted@3.3.3: {} 1520 | 1521 | foreground-child@3.3.1: 1522 | dependencies: 1523 | cross-spawn: 7.0.6 1524 | signal-exit: 4.1.0 1525 | 1526 | form-data@4.0.3: 1527 | dependencies: 1528 | asynckit: 0.4.0 1529 | combined-stream: 1.0.8 1530 | es-set-tostringtag: 2.1.0 1531 | hasown: 2.0.2 1532 | mime-types: 2.1.35 1533 | 1534 | formdata-polyfill@4.0.10: 1535 | dependencies: 1536 | fetch-blob: 3.2.0 1537 | 1538 | function-bind@1.1.2: {} 1539 | 1540 | get-caller-file@2.0.5: {} 1541 | 1542 | get-intrinsic@1.3.0: 1543 | dependencies: 1544 | call-bind-apply-helpers: 1.0.2 1545 | es-define-property: 1.0.1 1546 | es-errors: 1.3.0 1547 | es-object-atoms: 1.1.1 1548 | function-bind: 1.1.2 1549 | get-proto: 1.0.1 1550 | gopd: 1.2.0 1551 | has-symbols: 1.1.0 1552 | hasown: 2.0.2 1553 | math-intrinsics: 1.1.0 1554 | 1555 | get-proto@1.0.1: 1556 | dependencies: 1557 | dunder-proto: 1.0.1 1558 | es-object-atoms: 1.1.1 1559 | 1560 | glob-parent@5.1.2: 1561 | dependencies: 1562 | is-glob: 4.0.3 1563 | 1564 | glob-parent@6.0.2: 1565 | dependencies: 1566 | is-glob: 4.0.3 1567 | 1568 | glob@10.4.5: 1569 | dependencies: 1570 | foreground-child: 3.3.1 1571 | jackspeak: 3.4.3 1572 | minimatch: 9.0.5 1573 | minipass: 7.1.2 1574 | package-json-from-dist: 1.0.1 1575 | path-scurry: 1.11.1 1576 | 1577 | globals@14.0.0: {} 1578 | 1579 | gopd@1.2.0: {} 1580 | 1581 | graphemer@1.4.0: {} 1582 | 1583 | has-flag@4.0.0: {} 1584 | 1585 | has-symbols@1.1.0: {} 1586 | 1587 | has-tostringtag@1.0.2: 1588 | dependencies: 1589 | has-symbols: 1.1.0 1590 | 1591 | hasown@2.0.2: 1592 | dependencies: 1593 | function-bind: 1.1.2 1594 | 1595 | he@1.2.0: {} 1596 | 1597 | ignore@5.3.2: {} 1598 | 1599 | ignore@7.0.5: {} 1600 | 1601 | import-fresh@3.3.1: 1602 | dependencies: 1603 | parent-module: 1.0.1 1604 | resolve-from: 4.0.0 1605 | 1606 | imurmurhash@0.1.4: {} 1607 | 1608 | is-extglob@2.1.1: {} 1609 | 1610 | is-fullwidth-code-point@3.0.0: {} 1611 | 1612 | is-glob@4.0.3: 1613 | dependencies: 1614 | is-extglob: 2.1.1 1615 | 1616 | is-number@7.0.0: {} 1617 | 1618 | is-plain-obj@2.1.0: {} 1619 | 1620 | is-unicode-supported@0.1.0: {} 1621 | 1622 | isexe@2.0.0: {} 1623 | 1624 | jackspeak@3.4.3: 1625 | dependencies: 1626 | '@isaacs/cliui': 8.0.2 1627 | optionalDependencies: 1628 | '@pkgjs/parseargs': 0.11.0 1629 | 1630 | js-yaml@4.1.0: 1631 | dependencies: 1632 | argparse: 2.0.1 1633 | 1634 | json-buffer@3.0.1: {} 1635 | 1636 | json-schema-traverse@0.4.1: {} 1637 | 1638 | json-stable-stringify-without-jsonify@1.0.1: {} 1639 | 1640 | keyv@4.5.4: 1641 | dependencies: 1642 | json-buffer: 3.0.1 1643 | 1644 | levn@0.4.1: 1645 | dependencies: 1646 | prelude-ls: 1.2.1 1647 | type-check: 0.4.0 1648 | 1649 | locate-path@6.0.0: 1650 | dependencies: 1651 | p-locate: 5.0.0 1652 | 1653 | lodash.merge@4.6.2: {} 1654 | 1655 | log-symbols@4.1.0: 1656 | dependencies: 1657 | chalk: 4.1.2 1658 | is-unicode-supported: 0.1.0 1659 | 1660 | loupe@3.1.3: {} 1661 | 1662 | lru-cache@10.4.3: {} 1663 | 1664 | make-error@1.3.6: {} 1665 | 1666 | math-intrinsics@1.1.0: {} 1667 | 1668 | merge2@1.4.1: {} 1669 | 1670 | micromatch@4.0.8: 1671 | dependencies: 1672 | braces: 3.0.3 1673 | picomatch: 2.3.1 1674 | 1675 | mime-db@1.52.0: {} 1676 | 1677 | mime-types@2.1.35: 1678 | dependencies: 1679 | mime-db: 1.52.0 1680 | 1681 | minimatch@3.1.2: 1682 | dependencies: 1683 | brace-expansion: 1.1.11 1684 | 1685 | minimatch@9.0.5: 1686 | dependencies: 1687 | brace-expansion: 2.0.1 1688 | 1689 | minipass@7.1.2: {} 1690 | 1691 | mocha@11.6.0: 1692 | dependencies: 1693 | browser-stdout: 1.3.1 1694 | chokidar: 4.0.3 1695 | debug: 4.4.1(supports-color@8.1.1) 1696 | diff: 7.0.0 1697 | escape-string-regexp: 4.0.0 1698 | find-up: 5.0.0 1699 | glob: 10.4.5 1700 | he: 1.2.0 1701 | js-yaml: 4.1.0 1702 | log-symbols: 4.1.0 1703 | minimatch: 9.0.5 1704 | ms: 2.1.3 1705 | picocolors: 1.1.1 1706 | serialize-javascript: 6.0.2 1707 | strip-json-comments: 3.1.1 1708 | supports-color: 8.1.1 1709 | workerpool: 9.3.2 1710 | yargs: 17.7.2 1711 | yargs-parser: 21.1.1 1712 | yargs-unparser: 2.0.0 1713 | 1714 | ms@2.1.3: {} 1715 | 1716 | natural-compare@1.4.0: {} 1717 | 1718 | node-domexception@1.0.0: {} 1719 | 1720 | node-fetch@3.3.2: 1721 | dependencies: 1722 | data-uri-to-buffer: 4.0.1 1723 | fetch-blob: 3.2.0 1724 | formdata-polyfill: 4.0.10 1725 | 1726 | optionator@0.9.4: 1727 | dependencies: 1728 | deep-is: 0.1.4 1729 | fast-levenshtein: 2.0.6 1730 | levn: 0.4.1 1731 | prelude-ls: 1.2.1 1732 | type-check: 0.4.0 1733 | word-wrap: 1.2.5 1734 | 1735 | p-limit@3.1.0: 1736 | dependencies: 1737 | yocto-queue: 0.1.0 1738 | 1739 | p-locate@5.0.0: 1740 | dependencies: 1741 | p-limit: 3.1.0 1742 | 1743 | package-json-from-dist@1.0.1: {} 1744 | 1745 | parent-module@1.0.1: 1746 | dependencies: 1747 | callsites: 3.1.0 1748 | 1749 | path-exists@4.0.0: {} 1750 | 1751 | path-key@3.1.1: {} 1752 | 1753 | path-scurry@1.11.1: 1754 | dependencies: 1755 | lru-cache: 10.4.3 1756 | minipass: 7.1.2 1757 | 1758 | pathval@2.0.0: {} 1759 | 1760 | picocolors@1.1.1: {} 1761 | 1762 | picomatch@2.3.1: {} 1763 | 1764 | prelude-ls@1.2.1: {} 1765 | 1766 | prettier@3.5.3: {} 1767 | 1768 | punycode@2.3.1: {} 1769 | 1770 | queue-microtask@1.2.3: {} 1771 | 1772 | randombytes@2.1.0: 1773 | dependencies: 1774 | safe-buffer: 5.2.1 1775 | 1776 | readdirp@4.1.2: {} 1777 | 1778 | require-directory@2.1.1: {} 1779 | 1780 | resolve-from@4.0.0: {} 1781 | 1782 | reusify@1.1.0: {} 1783 | 1784 | run-parallel@1.2.0: 1785 | dependencies: 1786 | queue-microtask: 1.2.3 1787 | 1788 | safe-buffer@5.2.1: {} 1789 | 1790 | semver@7.7.2: {} 1791 | 1792 | serialize-javascript@6.0.2: 1793 | dependencies: 1794 | randombytes: 2.1.0 1795 | 1796 | shebang-command@2.0.0: 1797 | dependencies: 1798 | shebang-regex: 3.0.0 1799 | 1800 | shebang-regex@3.0.0: {} 1801 | 1802 | signal-exit@4.1.0: {} 1803 | 1804 | string-width@4.2.3: 1805 | dependencies: 1806 | emoji-regex: 8.0.0 1807 | is-fullwidth-code-point: 3.0.0 1808 | strip-ansi: 6.0.1 1809 | 1810 | string-width@5.1.2: 1811 | dependencies: 1812 | eastasianwidth: 0.2.0 1813 | emoji-regex: 9.2.2 1814 | strip-ansi: 7.1.0 1815 | 1816 | strip-ansi@6.0.1: 1817 | dependencies: 1818 | ansi-regex: 5.0.1 1819 | 1820 | strip-ansi@7.1.0: 1821 | dependencies: 1822 | ansi-regex: 6.1.0 1823 | 1824 | strip-json-comments@3.1.1: {} 1825 | 1826 | supports-color@7.2.0: 1827 | dependencies: 1828 | has-flag: 4.0.0 1829 | 1830 | supports-color@8.1.1: 1831 | dependencies: 1832 | has-flag: 4.0.0 1833 | 1834 | to-regex-range@5.0.1: 1835 | dependencies: 1836 | is-number: 7.0.0 1837 | 1838 | ts-api-utils@2.1.0(typescript@5.8.3): 1839 | dependencies: 1840 | typescript: 5.8.3 1841 | 1842 | ts-node@10.9.2(@types/node@22.15.30)(typescript@5.8.3): 1843 | dependencies: 1844 | '@cspotcode/source-map-support': 0.8.1 1845 | '@tsconfig/node10': 1.0.11 1846 | '@tsconfig/node12': 1.0.11 1847 | '@tsconfig/node14': 1.0.3 1848 | '@tsconfig/node16': 1.0.4 1849 | '@types/node': 22.15.30 1850 | acorn: 8.15.0 1851 | acorn-walk: 8.3.4 1852 | arg: 4.1.3 1853 | create-require: 1.1.1 1854 | diff: 4.0.2 1855 | make-error: 1.3.6 1856 | typescript: 5.8.3 1857 | v8-compile-cache-lib: 3.0.1 1858 | yn: 3.1.1 1859 | 1860 | tslib@2.7.0: {} 1861 | 1862 | type-check@0.4.0: 1863 | dependencies: 1864 | prelude-ls: 1.2.1 1865 | 1866 | typescript-eslint@8.33.1(eslint@9.28.0)(typescript@5.8.3): 1867 | dependencies: 1868 | '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0)(typescript@5.8.3))(eslint@9.28.0)(typescript@5.8.3) 1869 | '@typescript-eslint/parser': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1870 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1871 | eslint: 9.28.0 1872 | typescript: 5.8.3 1873 | transitivePeerDependencies: 1874 | - supports-color 1875 | 1876 | typescript@5.8.3: {} 1877 | 1878 | undici-types@6.19.8: {} 1879 | 1880 | undici-types@6.21.0: {} 1881 | 1882 | uri-js@4.4.1: 1883 | dependencies: 1884 | punycode: 2.3.1 1885 | 1886 | v8-compile-cache-lib@3.0.1: {} 1887 | 1888 | web-streams-polyfill@3.3.3: {} 1889 | 1890 | which@2.0.2: 1891 | dependencies: 1892 | isexe: 2.0.0 1893 | 1894 | word-wrap@1.2.5: {} 1895 | 1896 | workerpool@9.3.2: {} 1897 | 1898 | wrap-ansi@7.0.0: 1899 | dependencies: 1900 | ansi-styles: 4.3.0 1901 | string-width: 4.2.3 1902 | strip-ansi: 6.0.1 1903 | 1904 | wrap-ansi@8.1.0: 1905 | dependencies: 1906 | ansi-styles: 6.2.1 1907 | string-width: 5.1.2 1908 | strip-ansi: 7.1.0 1909 | 1910 | ws@8.17.1: {} 1911 | 1912 | y18n@5.0.8: {} 1913 | 1914 | yargs-parser@21.1.1: {} 1915 | 1916 | yargs-unparser@2.0.0: 1917 | dependencies: 1918 | camelcase: 6.3.0 1919 | decamelize: 4.0.0 1920 | flat: 5.0.2 1921 | is-plain-obj: 2.1.0 1922 | 1923 | yargs@17.7.2: 1924 | dependencies: 1925 | cliui: 8.0.1 1926 | escalade: 3.2.0 1927 | get-caller-file: 2.0.5 1928 | require-directory: 2.1.1 1929 | string-width: 4.2.3 1930 | y18n: 5.0.8 1931 | yargs-parser: 21.1.1 1932 | 1933 | yn@3.1.1: {} 1934 | 1935 | yocto-queue@0.1.0: {} 1936 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseBranches": ["main"], 3 | "labels": ["dependencies"], 4 | "assignees": ["pcaversaccio"], 5 | "separateMajorMinor": false, 6 | "extends": [ 7 | ":preserveSemverRanges", 8 | "group:all", 9 | "schedule:monthly", 10 | ":maintainLockFilesMonthly" 11 | ], 12 | "lockFileMaintenance": { 13 | "extends": ["group:all"], 14 | "commitMessageAction": "Update" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/addresses.ts: -------------------------------------------------------------------------------- 1 | // Tornado Cash Ethereum mainnet addresses. 2 | export const TORN_ADDRESS_100ETH = "0xA160cdAB225685dA1d56aa342Ad8841c3b53f291"; 3 | export const TORN_ADDRESS_10ETH = "0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF"; 4 | export const TORN_ADDRESS_1ETH = "0x47CE0C6eD5B0Ce3d3A51fdb1C52DC66a7c3c2936"; 5 | export const TORN_ADDRESS_01ETH = "0x12D66f87A04A9E220743712cE6d9bB1B5616B8Fc"; 6 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as dotenv from "dotenv"; 2 | import { JsonRpcProvider, getAddress } from "ethers"; 3 | import { RequestInfo } from "node-fetch"; 4 | import * as fs from "fs"; 5 | 6 | import { 7 | TORN_ADDRESS_100ETH, 8 | TORN_ADDRESS_10ETH, 9 | TORN_ADDRESS_1ETH, 10 | TORN_ADDRESS_01ETH, 11 | } from "./addresses.js"; 12 | 13 | dotenv.config(); 14 | 15 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 16 | let blockPayload: any[] = []; // Array to aggregate all transactions of a single block. 17 | 18 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 19 | const initTransactions: any[] = []; // Array to track all deployer addresses from contract creation transactions. 20 | 21 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 22 | const susAddresses: any[] = []; // Array to track all suspicious deployer addresses that deployed via funds retrieved through Tornado.Cash. 23 | 24 | const baseUrl = 25 | "https://api.etherscan.io/api?module=account&action=txlistinternal&address="; // Etherscan API base URL for internal transactions retrievals. 26 | 27 | const provider = new JsonRpcProvider(process.env.ETH_MAINNET_URL); // Connecting to the Ethereum mainnet RPC. 28 | 29 | let selectedBlockNumber: number; // Variable that defines the selected block number to be analysed. 30 | const dir = "./out"; // Define the output directory. 31 | 32 | export async function detect(blockNumber?: number) { 33 | if (blockNumber && blockNumber >= 0) { 34 | selectedBlockNumber = blockNumber; // Use the user-defined block number. 35 | } else { 36 | selectedBlockNumber = await provider.getBlockNumber(); // Get the latest block number. 37 | } 38 | 39 | // Get the latest block from the network, where `blockPayload` is an array of `TransactionResponse` objects. 40 | const block = await provider.getBlock(selectedBlockNumber, true); 41 | if (block) { 42 | blockPayload = block.prefetchedTransactions; 43 | } 44 | 45 | // Get all contract deployment transactions and store the deployer address in a separate array. 46 | for (let i = 0; i < blockPayload.length; ++i) { 47 | if (blockPayload[i].to === null) { 48 | let j = 0; 49 | initTransactions[j] = blockPayload[i].from; 50 | ++j; 51 | } 52 | } 53 | 54 | // Get all internal transactions of each deployer address. 55 | // Remember: An internal transaction is an action that is occurring within, or between, one or multiple smart contracts. 56 | // All Tornado.Cash transactions are tracked as internal transactions. 57 | for (let i = 0; i < initTransactions.length; ++i) { 58 | // Retrieve all internal transactions via the Etherscan API. 59 | const fetch = (url: RequestInfo) => 60 | import("node-fetch").then(({ default: fetch }) => fetch(url)); 61 | const response = (await fetch( 62 | `${baseUrl}${initTransactions[i]}&startblock=0&endblock=${selectedBlockNumber}&sort=asc&apikey=${process.env.ETHERSCAN_API_KEY}`, 63 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 64 | )) as any; 65 | const res = await response.json(); 66 | 67 | // Check if the internal transactions have been conducted by one of the Tornado Cash contract addresses. 68 | for (let j = 0; j < res.result.length; ++j) { 69 | let z = 0; 70 | const checksummedAddress = getAddress(res.result[j].from); // We use checksummed Ethereum addresses. 71 | if ( 72 | checksummedAddress === TORN_ADDRESS_100ETH || 73 | checksummedAddress === TORN_ADDRESS_10ETH || 74 | checksummedAddress === TORN_ADDRESS_1ETH || 75 | checksummedAddress === TORN_ADDRESS_01ETH 76 | ) { 77 | susAddresses[z] = initTransactions[i]; 78 | ++z; 79 | } 80 | } 81 | 82 | if (!fs.existsSync(dir)) { 83 | fs.mkdirSync(dir); 84 | } 85 | 86 | // Save the output. 87 | fs.writeFileSync( 88 | `${dir}/suspicious_address_block_number_${selectedBlockNumber}.json`, 89 | JSON.stringify(susAddresses), 90 | ); 91 | 92 | // Print the result including Etherscan link. 93 | const len = susAddresses.length; 94 | console.log( 95 | `\nThe following addresses deployed a contract at block number ${selectedBlockNumber} via funds retrieved through Tornado.Cash:\n`, 96 | ); 97 | for (let i = 0; i < len; ++i) { 98 | console.log(`- https://etherscan.io/address/${susAddresses[i]}\n`); 99 | } 100 | } 101 | 102 | return susAddresses; // Return array of all suspicious addresses. 103 | } 104 | -------------------------------------------------------------------------------- /test/detect.test.ts: -------------------------------------------------------------------------------- 1 | import { detect } from "../src/index.js"; 2 | import { expect } from "chai"; 3 | 4 | describe("TORN detector test", () => { 5 | it("return empty array if no suspicious attacker address is available", async function () { 6 | const blockNumber = 14576841; 7 | const result = await detect(blockNumber); 8 | // eslint-disable-next-line @typescript-eslint/no-unused-expressions 9 | expect(result).to.be.an("array").that.is.empty; 10 | }); 11 | 12 | it("return C.R.E.A.M. Finance flash loan attacker address", async function () { 13 | const blockNumber = 13499638; 14 | const attackerAddress = "0x24354D31bC9D90F62FE5f2454709C32049cf866b"; 15 | const result = await detect(blockNumber); 16 | expect(result[0]).to.equal(attackerAddress); 17 | }); 18 | 19 | it("return Eminence attacker address", async function () { 20 | const blockNumber = 10954419; 21 | const attackerAddress = "0x223034EDbe95823c1160C16F26E3000315171cA9"; 22 | const result = await detect(blockNumber); 23 | expect(result[0]).to.equal(attackerAddress); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2021", 4 | "module": "node16", 5 | "allowJs": true, 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "moduleResolution": "node16", 9 | "outDir": "out", 10 | "declaration": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "skipLibCheck": true, 13 | "resolveJsonModule": true, 14 | "declarationMap": true, 15 | "sourceMap": true, 16 | "rootDirs": ["./test", "./src"] 17 | }, 18 | "include": ["./test**/*.ts", "./src**/*.ts"], 19 | "files": ["eslint.config.js"], 20 | "exclude": ["out", "node_modules"] 21 | } 22 | --------------------------------------------------------------------------------