diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..24ddada
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: 'npm'
+ directory: '/'
+ schedule:
+ interval: 'daily'
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
index e28e0d3..21d16ae 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,2 +1,3 @@
-npm run generate
-git add data.json
\ No newline at end of file
+bun run generate
+npm run generate_v1
+git add .
\ No newline at end of file
diff --git a/README.md b/README.md
index 1e1d658..b25cafb 100644
--- a/README.md
+++ b/README.md
@@ -1,49 +1,53 @@
# Pinax Chains
-This repository is the single-source-of-truth for the metadata of chains supported by Pinax. To make it more accessible, we've published it as a private npm package ([See below](#install_from_npm)) and created a public endpoint to fetch publicly available chains metadata ([See below](#public_endpoint)).
+Welcome to the Pinax Chains repository. This is the definitive source for the metadata of chains supported by Pinax **_products_**. Note that we maintain a separate, private list for internal operations.
-You can have a look at the [Chain Type](/types/chain.types.ts) and at our [list of supported, to-be-supported, or once-supported chains](/data/chains).
+To enhance accessibility, we offer the metadata as an [npm package](#install_from_npm) and provide a [public API endpoint](#public_endpoint) for fetching the data.
-**Note**: Some chains may be listed but won't have any service supported or may have been deprecated, see each chain's metadata to ensure the chain is truly supported.
+You can view details about the [Chain Type](/types/chain.types.ts) and explore our [list of supported, to-be-supported, or deprecated chains](/types/pinax.types.ts).
-## Install from npm
+> **Note**: Some chains may be listed without supported services or may have been deprecated. Always check the chain's metadata to confirm its current support status.
-```bash
-npm install @pinax/chains
-```
+## What's New
-## Public Endpoint
+With the 2.0 release, we’ve made significant improvements to enhance developer and maintainer experience. Key updates include:
-You can fetch the publicly available chains metadata from the following endpoint:
-
-```bash
-curl https://pinax.network/api/chains
-```
-
-## Contributing
+- ✅ Support for EVM chains
+- ✅ Reintroduced TypeScript support
+- ✅ Improved management of chain indexes (priority order)
+- ✅ Consolidated chain utilities and service configurations across projects
+- ✅ Automated checks for missing chain icons
+- ✅ Simplified data model reflecting better relationships between chains, services, and networks
+- ✅ Inclusion of beta chains
+- ✅ Support for `unreleased` and `beta` services
+- ✅ Eliminated redundant flags and information
+- ✅ Integrated chains website into metadata
+- And more...
-If you want to contribute to the metadata of chains, please open a PR with the changes you want to make. We'll review it and merge it if it's correct.
+## Installation
-### Adding a new chain
+You first need to install [bun](https://bun.sh/).
-Adding a new chain is as simple as adding a new file to the `data/chains` directory. The file should be named after the chain's official Pinax ID and should contain the metadata of the chain. Also make sure to run the `npm run generate:type_pinaxid` and `npm run generate:data_json` commands to update the related types and index.
+### From npm
-If you're unsure about the fields you need to fill, you can have a look at the [Chain Type](/types/chain.types.ts) to learn more about the fields you need to fill.
+To install the package, run:
-### Updating an existing chain
-
-To update an existing chain, you can simply open a PR with the changes you want to make to the chain's metadata.
+```bash
+npm install @pinax/chains
+```
-### Adding / Validating Graph IDs
+### Public Endpoint
-We use the `graph_id` field to match our chains to The Graph's. You can check the available graph IDs in the [Graphs](/types/graph.types.ts) file, which is [generated automatically](/scripts/generate/graphid_type.js) by fetching supported chains from The Graph's API. You can run `npm run generate:type_graphid` to update the graph IDs.
+Access the chains metadata via the public API endpoint:
-### Updating the Chain Type
+```bash
+curl https://pinax.network/api/chains
+```
-If you want to add a new field to the chain type, you can simply open a PR with the changes you want to make to the chain type and make sure every chain's metadata is updated to include the new field if required.
+### How to use
-Removing a field from the chain type is not recommended, as it may break the metadata of the chains. If you want to remove a field, please open an issue to discuss it first.
+Please see [How to use](/docs/how_to_use.md) documentation for more information.
-### Removing a chain
+## Contributing
-If a chain is no longer supported, simply set the `deprecated_at` field as the date of the deprecation. This allows the different services to know when to stop supporting the chain, and enables us to keep track of the chains we've supported in the past for proper redirects and such.
+If you wish to contribute to the chain metadata, please open a pull request (PR) with your proposed changes. We will review and merge it if accurate. Be sure to consult the [documentation](/docs) before contributing.
\ No newline at end of file
diff --git a/bun.lockb b/bun.lockb
new file mode 100644
index 0000000..de523b5
Binary files /dev/null and b/bun.lockb differ
diff --git a/configs.ts b/configs.ts
deleted file mode 100644
index 8bb0e9f..0000000
--- a/configs.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export const DEFAULT_SERVICE_PORT = 443;
-export const DOMAIN = 'pinax.network';
-export const DEFAULT_IMG_BASE_URL = `https://${DOMAIN}/vector/chain`;
diff --git a/data.d.ts b/data.d.ts
deleted file mode 100644
index 4728d88..0000000
--- a/data.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { BlockType } from './types/block.types';
-import { Chain } from './types/chain.types';
-import { GraphId } from './types/graph.types';
-import { Mainnet } from './types/mainnet.types';
-import { PinaxId } from './types/pinax.types';
-import { SupportedServices } from './types/service.types';
-import { Standard } from './types/standard.types';
-
-export {
- BlockType,
- Chain,
- GraphId,
- Mainnet,
- PinaxId,
- SupportedServices,
- Standard,
-};
diff --git a/data/chains/alfajores.json b/data/chains/V1/alfajores.json
similarity index 96%
rename from data/chains/alfajores.json
rename to data/chains/V1/alfajores.json
index 4d7d155..ef0a4ca 100644
--- a/data/chains/alfajores.json
+++ b/data/chains/V1/alfajores.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "celo",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/amoy.json b/data/chains/V1/amoy.json
similarity index 96%
rename from data/chains/amoy.json
rename to data/chains/V1/amoy.json
index 6a49256..fbfb342 100644
--- a/data/chains/amoy.json
+++ b/data/chains/V1/amoy.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "polygon",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/arbgoerli.json b/data/chains/V1/arbgoerli.json
similarity index 74%
rename from data/chains/arbgoerli.json
rename to data/chains/V1/arbgoerli.json
index 1f24aa1..8e64fab 100644
--- a/data/chains/arbgoerli.json
+++ b/data/chains/V1/arbgoerli.json
@@ -4,8 +4,9 @@
"graph_id": "arbitrum-goerli",
"name": "Arbitrum Goerli",
"alt_names": [],
- "mainnet": "arbitrum",
+ "mainnet": "arbone",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -15,15 +16,15 @@
"is_testnet": true,
"supported_services": {
"firehose": {
- "released_at": null,
+ "released_at": "2024-05-03T00:00:00.000Z",
"deprecated_at": null
},
"substreams": {
- "released_at": null,
+ "released_at": "2024-05-03T00:00:00.000Z",
"deprecated_at": null
},
"rpc": {
- "released_at": null,
+ "released_at": "2024-05-03T00:00:00.000Z",
"deprecated_at": null
}
}
diff --git a/data/chains/arbone.json b/data/chains/V1/arbone.json
similarity index 95%
rename from data/chains/arbone.json
rename to data/chains/V1/arbone.json
index efaf9e0..8be6947 100644
--- a/data/chains/arbone.json
+++ b/data/chains/V1/arbone.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "arbone",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/arbsepolia.json b/data/chains/V1/arbsepolia.json
similarity index 93%
rename from data/chains/arbsepolia.json
rename to data/chains/V1/arbsepolia.json
index da4c7b6..6b4db7d 100644
--- a/data/chains/arbsepolia.json
+++ b/data/chains/V1/arbsepolia.json
@@ -4,8 +4,9 @@
"graph_id": "arbitrum-sepolia",
"name": "Arbitrum Sepolia",
"alt_names": [],
- "mainnet": "arbone",
+ "mainnet": "arbitrum",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/arweave.json b/data/chains/V1/arweave.json
similarity index 96%
rename from data/chains/arweave.json
rename to data/chains/V1/arweave.json
index 0fa46ce..b6c5d31 100644
--- a/data/chains/arweave.json
+++ b/data/chains/V1/arweave.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "arweave",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.arweave.type.v1.Block",
"url": "https://buf.build/pinax/firehose-arweave/docs/main:sf.arweave.type.v1"
diff --git a/data/chains/avalanche.json b/data/chains/V1/avalanche.json
similarity index 96%
rename from data/chains/avalanche.json
rename to data/chains/V1/avalanche.json
index fb6b4ad..98e9902 100644
--- a/data/chains/avalanche.json
+++ b/data/chains/V1/avalanche.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "avalanche",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/base.json b/data/chains/V1/base.json
similarity index 96%
rename from data/chains/base.json
rename to data/chains/V1/base.json
index 9b23a2c..ead419e 100644
--- a/data/chains/base.json
+++ b/data/chains/V1/base.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "base",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/bitcoin.json b/data/chains/V1/bitcoin.json
similarity index 95%
rename from data/chains/bitcoin.json
rename to data/chains/V1/bitcoin.json
index dbb7514..b842225 100644
--- a/data/chains/bitcoin.json
+++ b/data/chains/V1/bitcoin.json
@@ -6,6 +6,7 @@
"alt_names": ["btc"],
"mainnet": "bitcoin",
"standard": "brc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.bitcoin.type.v1.Block",
"url": "https://buf.build/streamingfast/firehose-bitcoin/docs/main:sf.bitcoin.type.v1"
diff --git a/data/chains/bsc.json b/data/chains/V1/bsc.json
similarity index 96%
rename from data/chains/bsc.json
rename to data/chains/V1/bsc.json
index 29da2d2..9a09ece 100644
--- a/data/chains/bsc.json
+++ b/data/chains/V1/bsc.json
@@ -6,6 +6,7 @@
"alt_names": ["bsc", "binance"],
"mainnet": "bsc",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/celo.json b/data/chains/V1/celo.json
similarity index 96%
rename from data/chains/celo.json
rename to data/chains/V1/celo.json
index 33cba65..cd2ff34 100644
--- a/data/chains/celo.json
+++ b/data/chains/V1/celo.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "celo",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data.json b/data/chains/V1/chains.json
similarity index 95%
rename from data.json
rename to data/chains/V1/chains.json
index 57f5281..00e41ce 100644
--- a/data.json
+++ b/data/chains/V1/chains.json
@@ -7,6 +7,7 @@
"alt_names": [],
"mainnet": "celo",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -38,6 +39,7 @@
"alt_names": [],
"mainnet": "polygon",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -66,8 +68,9 @@
"graph_id": "arbitrum-goerli",
"name": "Arbitrum Goerli",
"alt_names": [],
- "mainnet": "arbitrum",
+ "mainnet": "arbone",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -77,15 +80,15 @@
"is_testnet": true,
"supported_services": {
"firehose": {
- "released_at": null,
+ "released_at": "2024-05-03T00:00:00.000Z",
"deprecated_at": null
},
"substreams": {
- "released_at": null,
+ "released_at": "2024-05-03T00:00:00.000Z",
"deprecated_at": null
},
"rpc": {
- "released_at": null,
+ "released_at": "2024-05-03T00:00:00.000Z",
"deprecated_at": null
}
}
@@ -98,6 +101,7 @@
"alt_names": [],
"mainnet": "arbone",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -126,8 +130,9 @@
"graph_id": "arbitrum-sepolia",
"name": "Arbitrum Sepolia",
"alt_names": [],
- "mainnet": "arbone",
+ "mainnet": "arbitrum",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -158,6 +163,7 @@
"alt_names": [],
"mainnet": "arweave",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.arweave.type.v1.Block",
"url": "https://buf.build/pinax/firehose-arweave/docs/main:sf.arweave.type.v1"
@@ -189,6 +195,7 @@
"alt_names": [],
"mainnet": "avalanche",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -220,6 +227,7 @@
"alt_names": [],
"mainnet": "base",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -253,6 +261,7 @@
],
"mainnet": "bitcoin",
"standard": "brc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.bitcoin.type.v1.Block",
"url": "https://buf.build/streamingfast/firehose-bitcoin/docs/main:sf.bitcoin.type.v1"
@@ -286,6 +295,7 @@
],
"mainnet": "bsc",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -316,6 +326,7 @@
"alt_names": [],
"mainnet": "celo",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -347,6 +358,7 @@
"alt_names": [],
"mainnet": "bsc",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -377,6 +389,7 @@
"alt_names": [],
"mainnet": "arbitrum",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -407,6 +420,7 @@
"alt_names": [],
"mainnet": "arbitrum",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -437,6 +451,7 @@
"alt_names": [],
"mainnet": "cosmoshub",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
@@ -467,6 +482,7 @@
"alt_names": [],
"mainnet": "decimal",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -497,6 +513,7 @@
"alt_names": [],
"mainnet": "eos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -528,6 +545,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -559,6 +577,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -590,6 +609,7 @@
"alt_names": [],
"mainnet": "fantom",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -621,6 +641,7 @@
"alt_names": [],
"mainnet": "gnosis",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -652,6 +673,7 @@
"alt_names": [],
"mainnet": "gnosis",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -683,6 +705,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -714,6 +737,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -745,6 +769,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -776,6 +801,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -807,6 +833,7 @@
"alt_names": [],
"mainnet": "eos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -837,6 +864,7 @@
"alt_names": [],
"mainnet": "juno",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
@@ -868,6 +896,7 @@
"alt_names": [],
"mainnet": "kava",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -898,6 +927,7 @@
"alt_names": [],
"mainnet": "eos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -928,6 +958,7 @@
"alt_names": [],
"mainnet": "mode",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -958,6 +989,7 @@
"alt_names": [],
"mainnet": "moonbeam",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -988,6 +1020,7 @@
"alt_names": [],
"mainnet": "polygon",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -1018,6 +1051,7 @@
"alt_names": [],
"mainnet": "near",
"standard": "near",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.near.type.v1.Block",
"url": "https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1"
@@ -1049,6 +1083,7 @@
"alt_names": [],
"mainnet": "near",
"standard": "near",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.near.type.v1.Block",
"url": "https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1"
@@ -1080,6 +1115,7 @@
"alt_names": [],
"mainnet": "optimism",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -1110,6 +1146,7 @@
"alt_names": [],
"mainnet": "ore",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -1140,6 +1177,7 @@
"alt_names": [],
"mainnet": "ore",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -1170,6 +1208,7 @@
"alt_names": [],
"mainnet": "osmosis",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
@@ -1202,6 +1241,7 @@
],
"mainnet": "polygon",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -1232,6 +1272,7 @@
"alt_names": [],
"mainnet": "scroll",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -1263,6 +1304,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -1294,6 +1336,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -1325,6 +1368,7 @@
"alt_names": [],
"mainnet": "starknet",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
@@ -1355,6 +1399,7 @@
"alt_names": [],
"mainnet": "telos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -1385,6 +1430,7 @@
"alt_names": [],
"mainnet": "telos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -1415,6 +1461,7 @@
"alt_names": [],
"mainnet": "cosmoshub",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
@@ -1445,6 +1492,7 @@
"alt_names": [],
"mainnet": "ux",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -1475,6 +1523,7 @@
"alt_names": [],
"mainnet": "wax",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -1505,6 +1554,7 @@
"alt_names": [],
"mainnet": "wax",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
@@ -1535,6 +1585,7 @@
"alt_names": [],
"mainnet": "zkatana",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/chapel.json b/data/chains/V1/chapel.json
similarity index 96%
rename from data/chains/chapel.json
rename to data/chains/V1/chapel.json
index ae9e352..ade809d 100644
--- a/data/chains/chapel.json
+++ b/data/chains/V1/chapel.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "bsc",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/chiado-cl.json b/data/chains/V1/chiado-cl.json
similarity index 96%
rename from data/chains/chiado-cl.json
rename to data/chains/V1/chiado-cl.json
index 68ed350..40ab010 100644
--- a/data/chains/chiado-cl.json
+++ b/data/chains/V1/chiado-cl.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "arbitrum",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/chiado.json b/data/chains/V1/chiado.json
similarity index 95%
rename from data/chains/chiado.json
rename to data/chains/V1/chiado.json
index 5166256..cbbc358 100644
--- a/data/chains/chiado.json
+++ b/data/chains/V1/chiado.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "arbitrum",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/cosmoshub.json b/data/chains/V1/cosmoshub.json
similarity index 96%
rename from data/chains/cosmoshub.json
rename to data/chains/V1/cosmoshub.json
index 810f921..016c1d5 100644
--- a/data/chains/cosmoshub.json
+++ b/data/chains/V1/cosmoshub.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "cosmoshub",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
diff --git a/data/chains/decimal.json b/data/chains/V1/decimal.json
similarity index 95%
rename from data/chains/decimal.json
rename to data/chains/V1/decimal.json
index 2aa25e4..98d0656 100644
--- a/data/chains/decimal.json
+++ b/data/chains/V1/decimal.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "decimal",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/eos.json b/data/chains/V1/eos.json
similarity index 96%
rename from data/chains/eos.json
rename to data/chains/V1/eos.json
index 3e1ac0f..30eac2d 100644
--- a/data/chains/eos.json
+++ b/data/chains/V1/eos.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/eth-cl.json b/data/chains/V1/eth-cl.json
similarity index 96%
rename from data/chains/eth-cl.json
rename to data/chains/V1/eth-cl.json
index 8bd94e8..2a8bfbd 100644
--- a/data/chains/eth-cl.json
+++ b/data/chains/V1/eth-cl.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/eth.json b/data/chains/V1/eth.json
similarity index 96%
rename from data/chains/eth.json
rename to data/chains/V1/eth.json
index 8851205..1528338 100644
--- a/data/chains/eth.json
+++ b/data/chains/V1/eth.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/fantom.json b/data/chains/V1/fantom.json
similarity index 96%
rename from data/chains/fantom.json
rename to data/chains/V1/fantom.json
index 78087c9..3bba80f 100644
--- a/data/chains/fantom.json
+++ b/data/chains/V1/fantom.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "fantom",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/gnosis-cl.json b/data/chains/V1/gnosis-cl.json
similarity index 96%
rename from data/chains/gnosis-cl.json
rename to data/chains/V1/gnosis-cl.json
index c524750..951f2e5 100644
--- a/data/chains/gnosis-cl.json
+++ b/data/chains/V1/gnosis-cl.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "gnosis",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/gnosis.json b/data/chains/V1/gnosis.json
similarity index 96%
rename from data/chains/gnosis.json
rename to data/chains/V1/gnosis.json
index ed5c220..f34e2c1 100644
--- a/data/chains/gnosis.json
+++ b/data/chains/V1/gnosis.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "gnosis",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/goerli-cl.json b/data/chains/V1/goerli-cl.json
similarity index 96%
rename from data/chains/goerli-cl.json
rename to data/chains/V1/goerli-cl.json
index cddd318..acddfed 100644
--- a/data/chains/goerli-cl.json
+++ b/data/chains/V1/goerli-cl.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/goerli.json b/data/chains/V1/goerli.json
similarity index 96%
rename from data/chains/goerli.json
rename to data/chains/V1/goerli.json
index 1234949..9b5fc69 100644
--- a/data/chains/goerli.json
+++ b/data/chains/V1/goerli.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/holesky-cl.json b/data/chains/V1/holesky-cl.json
similarity index 96%
rename from data/chains/holesky-cl.json
rename to data/chains/V1/holesky-cl.json
index b247870..78b6f71 100644
--- a/data/chains/holesky-cl.json
+++ b/data/chains/V1/holesky-cl.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/holesky.json b/data/chains/V1/holesky.json
similarity index 96%
rename from data/chains/holesky.json
rename to data/chains/V1/holesky.json
index 0535a78..062544a 100644
--- a/data/chains/holesky.json
+++ b/data/chains/V1/holesky.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/jungle4.json b/data/chains/V1/jungle4.json
similarity index 95%
rename from data/chains/jungle4.json
rename to data/chains/V1/jungle4.json
index 8665590..3aae677 100644
--- a/data/chains/jungle4.json
+++ b/data/chains/V1/jungle4.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/juno.json b/data/chains/V1/juno.json
similarity index 96%
rename from data/chains/juno.json
rename to data/chains/V1/juno.json
index e43258e..d131282 100644
--- a/data/chains/juno.json
+++ b/data/chains/V1/juno.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "juno",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
diff --git a/data/chains/kava.json b/data/chains/V1/kava.json
similarity index 95%
rename from data/chains/kava.json
rename to data/chains/V1/kava.json
index a97157a..e01e5c6 100644
--- a/data/chains/kava.json
+++ b/data/chains/V1/kava.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "kava",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/kylin.json b/data/chains/V1/kylin.json
similarity index 95%
rename from data/chains/kylin.json
rename to data/chains/V1/kylin.json
index 011f912..a687306 100644
--- a/data/chains/kylin.json
+++ b/data/chains/V1/kylin.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/mode.json b/data/chains/V1/mode.json
similarity index 96%
rename from data/chains/mode.json
rename to data/chains/V1/mode.json
index d7d7968..cf9451e 100644
--- a/data/chains/mode.json
+++ b/data/chains/V1/mode.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "mode",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/moonbeam.json b/data/chains/V1/moonbeam.json
similarity index 95%
rename from data/chains/moonbeam.json
rename to data/chains/V1/moonbeam.json
index 503ddf1..ee925f0 100644
--- a/data/chains/moonbeam.json
+++ b/data/chains/V1/moonbeam.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "moonbeam",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/mumbai.json b/data/chains/V1/mumbai.json
similarity index 96%
rename from data/chains/mumbai.json
rename to data/chains/V1/mumbai.json
index 4cc6621..74035a0 100644
--- a/data/chains/mumbai.json
+++ b/data/chains/V1/mumbai.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "polygon",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/near.json b/data/chains/V1/near.json
similarity index 96%
rename from data/chains/near.json
rename to data/chains/V1/near.json
index 5d32731..8f0a025 100644
--- a/data/chains/near.json
+++ b/data/chains/V1/near.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "near",
"standard": "near",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.near.type.v1.Block",
"url": "https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1"
diff --git a/data/chains/neartest.json b/data/chains/V1/neartest.json
similarity index 96%
rename from data/chains/neartest.json
rename to data/chains/V1/neartest.json
index e58146d..5e756e7 100644
--- a/data/chains/neartest.json
+++ b/data/chains/V1/neartest.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "near",
"standard": "near",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.near.type.v1.Block",
"url": "https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1"
diff --git a/data/chains/optimism.json b/data/chains/V1/optimism.json
similarity index 95%
rename from data/chains/optimism.json
rename to data/chains/V1/optimism.json
index f04de2a..6386513 100644
--- a/data/chains/optimism.json
+++ b/data/chains/V1/optimism.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "optimism",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/ore.json b/data/chains/V1/ore.json
similarity index 96%
rename from data/chains/ore.json
rename to data/chains/V1/ore.json
index 434d98a..1ba2639 100644
--- a/data/chains/ore.json
+++ b/data/chains/V1/ore.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "ore",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/orestage.json b/data/chains/V1/orestage.json
similarity index 96%
rename from data/chains/orestage.json
rename to data/chains/V1/orestage.json
index ab0cca6..e11c5d7 100644
--- a/data/chains/orestage.json
+++ b/data/chains/V1/orestage.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "ore",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/osmosis.json b/data/chains/V1/osmosis.json
similarity index 95%
rename from data/chains/osmosis.json
rename to data/chains/V1/osmosis.json
index a46a773..6a4c064 100644
--- a/data/chains/osmosis.json
+++ b/data/chains/V1/osmosis.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "osmosis",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
diff --git a/data/chains/polygon.json b/data/chains/V1/polygon.json
similarity index 96%
rename from data/chains/polygon.json
rename to data/chains/V1/polygon.json
index 9bdef19..505ad07 100644
--- a/data/chains/polygon.json
+++ b/data/chains/V1/polygon.json
@@ -6,6 +6,7 @@
"alt_names": ["matic"],
"mainnet": "polygon",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/scroll.json b/data/chains/V1/scroll.json
similarity index 96%
rename from data/chains/scroll.json
rename to data/chains/V1/scroll.json
index 6cb1bf9..6d91625 100644
--- a/data/chains/scroll.json
+++ b/data/chains/V1/scroll.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "scroll",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/sepolia-cl.json b/data/chains/V1/sepolia-cl.json
similarity index 96%
rename from data/chains/sepolia-cl.json
rename to data/chains/V1/sepolia-cl.json
index 4a1d8fa..66b9b9a 100644
--- a/data/chains/sepolia-cl.json
+++ b/data/chains/V1/sepolia-cl.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/sepolia.json b/data/chains/V1/sepolia.json
similarity index 96%
rename from data/chains/sepolia.json
rename to data/chains/V1/sepolia.json
index f8375e2..4f30302 100644
--- a/data/chains/sepolia.json
+++ b/data/chains/V1/sepolia.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "eth",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/starknet.json b/data/chains/V1/starknet.json
similarity index 95%
rename from data/chains/starknet.json
rename to data/chains/V1/starknet.json
index 2975585..51b69c6 100644
--- a/data/chains/starknet.json
+++ b/data/chains/V1/starknet.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "starknet",
"standard": "erc20",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/telos.json b/data/chains/V1/telos.json
similarity index 95%
rename from data/chains/telos.json
rename to data/chains/V1/telos.json
index 100ad33..26228a1 100644
--- a/data/chains/telos.json
+++ b/data/chains/V1/telos.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "telos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/telostest.json b/data/chains/V1/telostest.json
similarity index 95%
rename from data/chains/telostest.json
rename to data/chains/V1/telostest.json
index f928e92..8fff68d 100644
--- a/data/chains/telostest.json
+++ b/data/chains/V1/telostest.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "telos",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/theta.json b/data/chains/V1/theta.json
similarity index 96%
rename from data/chains/theta.json
rename to data/chains/V1/theta.json
index 0b3cbb4..57d573d 100644
--- a/data/chains/theta.json
+++ b/data/chains/V1/theta.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "cosmoshub",
"standard": "cosmos",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.cosmos.type.v1.Block",
"url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
diff --git a/data/chains/ux.json b/data/chains/V1/ux.json
similarity index 96%
rename from data/chains/ux.json
rename to data/chains/V1/ux.json
index 8a320c8..6085f94 100644
--- a/data/chains/ux.json
+++ b/data/chains/V1/ux.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "ux",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/wax.json b/data/chains/V1/wax.json
similarity index 95%
rename from data/chains/wax.json
rename to data/chains/V1/wax.json
index 93660ec..183f73b 100644
--- a/data/chains/wax.json
+++ b/data/chains/V1/wax.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "wax",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/waxtest.json b/data/chains/V1/waxtest.json
similarity index 95%
rename from data/chains/waxtest.json
rename to data/chains/V1/waxtest.json
index b69441b..1152b73 100644
--- a/data/chains/waxtest.json
+++ b/data/chains/V1/waxtest.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "wax",
"standard": "antelope",
+ "is_detailed_blocks": true,
"block_type": {
"label": "sf.antelope.type.v1.Block",
"url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
diff --git a/data/chains/zkatana.json b/data/chains/V1/zkatana.json
similarity index 95%
rename from data/chains/zkatana.json
rename to data/chains/V1/zkatana.json
index 8e416bf..53c8abc 100644
--- a/data/chains/zkatana.json
+++ b/data/chains/V1/zkatana.json
@@ -6,6 +6,7 @@
"alt_names": [],
"mainnet": "zkatana",
"standard": "erc20",
+ "is_detailed_blocks": false,
"block_type": {
"label": "sf.ethereum.type.v2.Block",
"url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
diff --git a/data/chains/V2/arbone/arbone.branded.svg b/data/chains/V2/arbone/arbone.branded.svg
new file mode 100644
index 0000000..360279a
--- /dev/null
+++ b/data/chains/V2/arbone/arbone.branded.svg
@@ -0,0 +1,6 @@
+
diff --git a/data/chains/V2/arbone/arbone.dark.svg b/data/chains/V2/arbone/arbone.dark.svg
new file mode 100644
index 0000000..09bd877
--- /dev/null
+++ b/data/chains/V2/arbone/arbone.dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/data/chains/V2/arbone/arbone.light.svg b/data/chains/V2/arbone/arbone.light.svg
new file mode 100644
index 0000000..3e47213
--- /dev/null
+++ b/data/chains/V2/arbone/arbone.light.svg
@@ -0,0 +1,6 @@
+
diff --git a/data/chains/V2/arbone/meta.ts b/data/chains/V2/arbone/meta.ts
new file mode 100644
index 0000000..243cc14
--- /dev/null
+++ b/data/chains/V2/arbone/meta.ts
@@ -0,0 +1,40 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'arbone',
+ graph_id: 'arbitrum-one',
+ name: 'Arbitrum One',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'tokens/arbi',
+ brand_theme: 'both',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-06-10T00:00:00.000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-06-10T00:00:00.000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-06-10T00:00:00.000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://arbitrum.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/arbone/testnets/arbgoerli/meta.ts b/data/chains/V2/arbone/testnets/arbgoerli/meta.ts
new file mode 100644
index 0000000..8111b42
--- /dev/null
+++ b/data/chains/V2/arbone/testnets/arbgoerli/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'arbgoerli',
+ graph_id: null,
+ name: 'Arbitrum Goerli',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-05-03T00:00:00.000Z',
+ full_released_at: '2024-05-03T00:00:00.000Z',
+ deprecated_at: '2024-05-03T00:00:00.000Z',
+ },
+ substreams: {
+ beta_released_at: '2024-05-03T00:00:00.000Z',
+ full_released_at: '2024-05-03T00:00:00.000Z',
+ deprecated_at: '2024-05-03T00:00:00.000Z',
+ },
+ rpc: {
+ beta_released_at: '2024-05-03T00:00:00.000Z',
+ full_released_at: '2024-05-03T00:00:00.000Z',
+ deprecated_at: '2024-05-03T00:00:00.000Z',
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/arbone/testnets/arbsepolia/meta.ts b/data/chains/V2/arbone/testnets/arbsepolia/meta.ts
new file mode 100644
index 0000000..4c66859
--- /dev/null
+++ b/data/chains/V2/arbone/testnets/arbsepolia/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'arbsepolia',
+ graph_id: 'arbitrum-sepolia',
+ name: 'Arbitrum Sepolia',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-05-03T00:00:00.000Z',
+ full_released_at: '2024-05-03T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-05-03T00:00:00.000Z',
+ full_released_at: '2024-05-03T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-05-03T00:00:00.000Z',
+ full_released_at: '2024-05-03T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/arweave/arweave.branded.svg b/data/chains/V2/arweave/arweave.branded.svg
new file mode 100644
index 0000000..2612559
--- /dev/null
+++ b/data/chains/V2/arweave/arweave.branded.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/arweave/arweave.dark.svg b/data/chains/V2/arweave/arweave.dark.svg
new file mode 100644
index 0000000..03bce8a
--- /dev/null
+++ b/data/chains/V2/arweave/arweave.dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/arweave/arweave.light.svg b/data/chains/V2/arweave/arweave.light.svg
new file mode 100644
index 0000000..2da0ee1
--- /dev/null
+++ b/data/chains/V2/arweave/arweave.light.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/arweave/meta.ts b/data/chains/V2/arweave/meta.ts
new file mode 100644
index 0000000..0b3a034
--- /dev/null
+++ b/data/chains/V2/arweave/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'arweave',
+ graph_id: 'arweave-mainnet',
+ name: 'Arweave',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.arweave.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-arweave/docs/main:sf.arweave.type.v1',
+ },
+ icon: {
+ id: 'tokens/ar',
+ brand_theme: 'dark',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-03-03T00:00:00.000Z',
+ full_released_at: '2024-03-03T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-03-03T00:00:00.000Z',
+ full_released_at: '2024-03-03T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://arweave.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/avalanche/avalanche.branded.svg b/data/chains/V2/avalanche/avalanche.branded.svg
new file mode 100644
index 0000000..8bd623e
--- /dev/null
+++ b/data/chains/V2/avalanche/avalanche.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/avalanche/avalanche.dark.svg b/data/chains/V2/avalanche/avalanche.dark.svg
new file mode 100644
index 0000000..054f391
--- /dev/null
+++ b/data/chains/V2/avalanche/avalanche.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/avalanche/avalanche.light.svg b/data/chains/V2/avalanche/avalanche.light.svg
new file mode 100644
index 0000000..21423e7
--- /dev/null
+++ b/data/chains/V2/avalanche/avalanche.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/avalanche/meta.ts b/data/chains/V2/avalanche/meta.ts
new file mode 100644
index 0000000..9ce83b3
--- /dev/null
+++ b/data/chains/V2/avalanche/meta.ts
@@ -0,0 +1,40 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'avalanche',
+ graph_id: 'avalanche',
+ name: 'Avalanche',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/avalanche',
+ brand_theme: 'both',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:00.000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:00.000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:00.000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.avax.network/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/base/base.branded.svg b/data/chains/V2/base/base.branded.svg
new file mode 100644
index 0000000..0da53fa
--- /dev/null
+++ b/data/chains/V2/base/base.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/base/base.dark.svg b/data/chains/V2/base/base.dark.svg
new file mode 100644
index 0000000..a5161a5
--- /dev/null
+++ b/data/chains/V2/base/base.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/base/base.light.svg b/data/chains/V2/base/base.light.svg
new file mode 100644
index 0000000..3e6c6ea
--- /dev/null
+++ b/data/chains/V2/base/base.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/base/meta.ts b/data/chains/V2/base/meta.ts
new file mode 100644
index 0000000..b2c65ab
--- /dev/null
+++ b/data/chains/V2/base/meta.ts
@@ -0,0 +1,40 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'base',
+ graph_id: 'base',
+ name: 'Base',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'tokens/base',
+ brand_theme: 'both',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-03-06T00:00:00.000Z',
+ full_released_at: '2024-03-06T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-03-06T00:00:00.000Z',
+ full_released_at: '2024-03-06T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.base.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/bitcoin/bitcoin.branded.svg b/data/chains/V2/bitcoin/bitcoin.branded.svg
new file mode 100644
index 0000000..1482f66
--- /dev/null
+++ b/data/chains/V2/bitcoin/bitcoin.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/bitcoin/bitcoin.dark.svg b/data/chains/V2/bitcoin/bitcoin.dark.svg
new file mode 100644
index 0000000..f15fbd1
--- /dev/null
+++ b/data/chains/V2/bitcoin/bitcoin.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/bitcoin/bitcoin.light.svg b/data/chains/V2/bitcoin/bitcoin.light.svg
new file mode 100644
index 0000000..96bfca6
--- /dev/null
+++ b/data/chains/V2/bitcoin/bitcoin.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/bitcoin/meta.ts b/data/chains/V2/bitcoin/meta.ts
new file mode 100644
index 0000000..386188a
--- /dev/null
+++ b/data/chains/V2/bitcoin/meta.ts
@@ -0,0 +1,40 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'bitcoin',
+ graph_id: null,
+ name: 'Bitcoin',
+ alt_names: ['btc'],
+ standard: 'brc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.bitcoin.type.v1.Block',
+ url: 'https://buf.build/streamingfast/firehose-bitcoin/docs/main:sf.bitcoin.type.v1',
+ },
+ icon: {
+ id: 'tokens/btc',
+ brand_theme: 'both',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-03-21T00:00:00.000Z',
+ full_released_at: '2023-03-21T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-03-21T00:00:00.000Z',
+ full_released_at: '2023-03-21T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://bitcoin.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/blast/blast.branded.svg b/data/chains/V2/blast/blast.branded.svg
new file mode 100644
index 0000000..6bf9065
--- /dev/null
+++ b/data/chains/V2/blast/blast.branded.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/blast/blast.dark.svg b/data/chains/V2/blast/blast.dark.svg
new file mode 100644
index 0000000..a15e308
--- /dev/null
+++ b/data/chains/V2/blast/blast.dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/blast/blast.light.svg b/data/chains/V2/blast/blast.light.svg
new file mode 100644
index 0000000..611035c
--- /dev/null
+++ b/data/chains/V2/blast/blast.light.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/blast/meta.ts b/data/chains/V2/blast/meta.ts
new file mode 100644
index 0000000..2e42352
--- /dev/null
+++ b/data/chains/V2/blast/meta.ts
@@ -0,0 +1,46 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'blast',
+ name: 'Blast Network',
+ alt_names: [],
+ graph_id: 'blast-mainnet',
+ index: 0,
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/blast',
+ brand_theme: 'light',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L2',
+ website: 'https://blast.io/en',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/blast/testnets/blastsepolia/meta.ts b/data/chains/V2/blast/testnets/blastsepolia/meta.ts
new file mode 100644
index 0000000..2fb96f9
--- /dev/null
+++ b/data/chains/V2/blast/testnets/blastsepolia/meta.ts
@@ -0,0 +1,34 @@
+import { ___InternalTestnet } from '../../../../../../types';
+
+const meta: ___InternalTestnet = {
+ id: 'blastsepolia',
+ name: 'Blast Network Sepolia',
+ alt_names: [],
+ graph_id: 'blast-testnet',
+ index: 0,
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/boba/boba.branded.svg b/data/chains/V2/boba/boba.branded.svg
new file mode 100644
index 0000000..34cdfb1
--- /dev/null
+++ b/data/chains/V2/boba/boba.branded.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/boba/boba.dark.svg b/data/chains/V2/boba/boba.dark.svg
new file mode 100644
index 0000000..c0ffaa5
--- /dev/null
+++ b/data/chains/V2/boba/boba.dark.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/boba/boba.light.svg b/data/chains/V2/boba/boba.light.svg
new file mode 100644
index 0000000..5f2dfdd
--- /dev/null
+++ b/data/chains/V2/boba/boba.light.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/boba/meta.ts b/data/chains/V2/boba/meta.ts
new file mode 100644
index 0000000..1c3e1ef
--- /dev/null
+++ b/data/chains/V2/boba/meta.ts
@@ -0,0 +1,45 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'boba',
+ name: 'Boba Network',
+ alt_names: [],
+ graph_id: 'boba',
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'tokens/boba',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L2',
+ website: 'https://boba.network/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/boba/testnets/bobasepolia/meta.ts b/data/chains/V2/boba/testnets/bobasepolia/meta.ts
new file mode 100644
index 0000000..e7aa446
--- /dev/null
+++ b/data/chains/V2/boba/testnets/bobasepolia/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'bobasepolia',
+ graph_id: null,
+ name: 'Boba Sepolia',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/bsc/bsc.branded.svg b/data/chains/V2/bsc/bsc.branded.svg
new file mode 100644
index 0000000..13c355c
--- /dev/null
+++ b/data/chains/V2/bsc/bsc.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/bsc/bsc.dark.svg b/data/chains/V2/bsc/bsc.dark.svg
new file mode 100644
index 0000000..220e4e3
--- /dev/null
+++ b/data/chains/V2/bsc/bsc.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/bsc/bsc.light.svg b/data/chains/V2/bsc/bsc.light.svg
new file mode 100644
index 0000000..f8c0b79
--- /dev/null
+++ b/data/chains/V2/bsc/bsc.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/bsc/meta.ts b/data/chains/V2/bsc/meta.ts
new file mode 100644
index 0000000..cf1442f
--- /dev/null
+++ b/data/chains/V2/bsc/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'bsc',
+ graph_id: 'bsc',
+ name: 'BNB',
+ alt_names: ['bsc', 'binance'],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/binance-smart-chain',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.bnbchain.org/en/bnb-smart-chain',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/bsc/testnets/chapel/meta.ts b/data/chains/V2/bsc/testnets/chapel/meta.ts
new file mode 100644
index 0000000..0539432
--- /dev/null
+++ b/data/chains/V2/bsc/testnets/chapel/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'chapel',
+ graph_id: 'chapel',
+ name: 'Chapel',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/cardano/cardano.branded.svg b/data/chains/V2/cardano/cardano.branded.svg
new file mode 100644
index 0000000..2482c08
--- /dev/null
+++ b/data/chains/V2/cardano/cardano.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/cardano/cardano.dark.svg b/data/chains/V2/cardano/cardano.dark.svg
new file mode 100644
index 0000000..84da2b8
--- /dev/null
+++ b/data/chains/V2/cardano/cardano.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/cardano/cardano.light.svg b/data/chains/V2/cardano/cardano.light.svg
new file mode 100644
index 0000000..3026e45
--- /dev/null
+++ b/data/chains/V2/cardano/cardano.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/cardano/meta.ts b/data/chains/V2/cardano/meta.ts
new file mode 100644
index 0000000..29b8197
--- /dev/null
+++ b/data/chains/V2/cardano/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'cardano',
+ graph_id: null,
+ name: 'Cardano',
+ alt_names: [],
+ standard: 'cardano',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/cardano',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://cardano.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/celo/celo.branded.svg b/data/chains/V2/celo/celo.branded.svg
new file mode 100644
index 0000000..b985af8
--- /dev/null
+++ b/data/chains/V2/celo/celo.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/celo/celo.dark.svg b/data/chains/V2/celo/celo.dark.svg
new file mode 100644
index 0000000..2b01dc8
--- /dev/null
+++ b/data/chains/V2/celo/celo.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/celo/celo.light.svg b/data/chains/V2/celo/celo.light.svg
new file mode 100644
index 0000000..b03cddc
--- /dev/null
+++ b/data/chains/V2/celo/celo.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/celo/meta.ts b/data/chains/V2/celo/meta.ts
new file mode 100644
index 0000000..ddcec23
--- /dev/null
+++ b/data/chains/V2/celo/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'celo',
+ graph_id: 'celo',
+ name: 'Celo',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/celo',
+ brand_theme: 'light',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://celo.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/celo/testnets/alfajores/meta.ts b/data/chains/V2/celo/testnets/alfajores/meta.ts
new file mode 100644
index 0000000..1bd4cc3
--- /dev/null
+++ b/data/chains/V2/celo/testnets/alfajores/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'alfajores',
+ graph_id: null,
+ name: 'Alfajores',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/chains.json b/data/chains/V2/chains.json
new file mode 100644
index 0000000..016f8ce
--- /dev/null
+++ b/data/chains/V2/chains.json
@@ -0,0 +1,2506 @@
+[
+ {
+ "id": "eth",
+ "graph_id": "mainnet",
+ "name": "Ethereum",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/ethereum",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://ethereum.org/"
+ },
+ "index": 0,
+ "testnets": [
+ {
+ "id": "holesky",
+ "graph_id": null,
+ "name": "Holesky",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 1
+ },
+ {
+ "id": "sepolia",
+ "graph_id": "sepolia",
+ "name": "Sepolia",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 2
+ },
+ {
+ "id": "goerli",
+ "graph_id": null,
+ "name": "Goerli",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ },
+ "rpc": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ }
+ },
+ "index": 6
+ }
+ ],
+ "consensus": [
+ {
+ "id": "eth-cl",
+ "graph_id": null,
+ "name": "Ethereum Consensus Layer",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 3
+ },
+ {
+ "id": "holesky-cl",
+ "graph_id": null,
+ "name": "Holesky Consensus Layer",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 4
+ },
+ {
+ "id": "sepolia-cl",
+ "graph_id": null,
+ "name": "Sepolia Consensus Layer",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 5
+ },
+ {
+ "id": "goerli-cl",
+ "graph_id": null,
+ "name": "Goerli Consensus Layer",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ }
+ },
+ "index": 7
+ }
+ ]
+ },
+ {
+ "id": "bitcoin",
+ "graph_id": null,
+ "name": "Bitcoin",
+ "alt_names": [
+ "btc"
+ ],
+ "standard": "brc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.bitcoin.type.v1.Block",
+ "url": "https://buf.build/streamingfast/firehose-bitcoin/docs/main:sf.bitcoin.type.v1"
+ },
+ "icon": {
+ "id": "tokens/btc",
+ "brand_theme": "both"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-03-21T00:00:00.000Z",
+ "full_released_at": "2023-03-21T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-21T00:00:00.000Z",
+ "full_released_at": "2023-03-21T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://bitcoin.org/"
+ },
+ "index": 8
+ },
+ {
+ "id": "polygon",
+ "graph_id": "matic",
+ "name": "Polygon",
+ "alt_names": [
+ "matic"
+ ],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/polygon-pos",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://polygon.technology/"
+ },
+ "index": 9,
+ "testnets": [
+ {
+ "id": "amoy",
+ "graph_id": "polygon-amoy",
+ "name": "Amoy",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-04-12T00:00:00.000Z",
+ "full_released_at": "2024-04-12T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-04-12T00:00:00.000Z",
+ "full_released_at": "2024-04-12T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-04-12T00:00:00.000Z",
+ "full_released_at": "2024-04-12T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 10
+ },
+ {
+ "id": "mumbai",
+ "graph_id": null,
+ "name": "Mumbai",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": "2024-04-12T00:00:00.000Z"
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": "2024-04-12T00:00:00.000Z"
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": "2024-04-12T00:00:00.000Z"
+ }
+ },
+ "index": 11
+ }
+ ]
+ },
+ {
+ "id": "bsc",
+ "graph_id": "bsc",
+ "name": "BNB",
+ "alt_names": [
+ "bsc",
+ "binance"
+ ],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/binance-smart-chain",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.bnbchain.org/en/bnb-smart-chain"
+ },
+ "index": 12,
+ "testnets": [
+ {
+ "id": "chapel",
+ "graph_id": "chapel",
+ "name": "Chapel",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 13
+ }
+ ]
+ },
+ {
+ "id": "arbone",
+ "graph_id": "arbitrum-one",
+ "name": "Arbitrum One",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "tokens/arbi",
+ "brand_theme": "both"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-06-10T00:00:00.000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-06-10T00:00:00.000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-06-10T00:00:00.000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://arbitrum.io/"
+ },
+ "index": 14,
+ "testnets": [
+ {
+ "id": "arbgoerli",
+ "graph_id": null,
+ "name": "Arbitrum Goerli",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-05-03T00:00:00.000Z",
+ "full_released_at": "2024-05-03T00:00:00.000Z",
+ "deprecated_at": "2024-05-03T00:00:00.000Z"
+ },
+ "substreams": {
+ "beta_released_at": "2024-05-03T00:00:00.000Z",
+ "full_released_at": "2024-05-03T00:00:00.000Z",
+ "deprecated_at": "2024-05-03T00:00:00.000Z"
+ },
+ "rpc": {
+ "beta_released_at": "2024-05-03T00:00:00.000Z",
+ "full_released_at": "2024-05-03T00:00:00.000Z",
+ "deprecated_at": "2024-05-03T00:00:00.000Z"
+ }
+ },
+ "index": 15
+ },
+ {
+ "id": "arbsepolia",
+ "graph_id": "arbitrum-sepolia",
+ "name": "Arbitrum Sepolia",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-05-03T00:00:00.000Z",
+ "full_released_at": "2024-05-03T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-05-03T00:00:00.000Z",
+ "full_released_at": "2024-05-03T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-05-03T00:00:00.000Z",
+ "full_released_at": "2024-05-03T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 16
+ },
+ {
+ "id": "chiado",
+ "graph_id": null,
+ "name": "Chiado",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 18
+ }
+ ],
+ "consensus": [
+ {
+ "id": "chiado-cl",
+ "graph_id": null,
+ "name": "Chiado Consensus Layer",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 17
+ }
+ ]
+ },
+ {
+ "id": "avalanche",
+ "graph_id": "avalanche",
+ "name": "Avalanche",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/avalanche",
+ "brand_theme": "both"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:00.000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:00.000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:00.000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.avax.network/"
+ },
+ "index": 19
+ },
+ {
+ "id": "optimism",
+ "graph_id": "optimism",
+ "name": "Optimism",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/optimistic-ethereum",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-01-01T00:00:00.000Z",
+ "full_released_at": "2024-01-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-01-01T00:00:00.000Z",
+ "full_released_at": "2024-01-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://optimism.io/"
+ },
+ "index": 20
+ },
+ {
+ "id": "base",
+ "graph_id": "base",
+ "name": "Base",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "tokens/base",
+ "brand_theme": "both"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-03-06T00:00:00.000Z",
+ "full_released_at": "2024-03-06T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-03-06T00:00:00.000Z",
+ "full_released_at": "2024-03-06T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.base.org/"
+ },
+ "index": 21
+ },
+ {
+ "id": "near",
+ "graph_id": "near-mainnet",
+ "name": "Near",
+ "alt_names": [],
+ "standard": "near",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.near.type.v1.Block",
+ "url": "https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1"
+ },
+ "icon": {
+ "id": "tokens/near",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://near.org/"
+ },
+ "index": 22,
+ "testnets": [
+ {
+ "id": "neartest",
+ "graph_id": "near-testnet",
+ "name": "Near-testnet",
+ "alt_names": [],
+ "standard": "near",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.near.type.v1.Block",
+ "url": "https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 23
+ }
+ ]
+ },
+ {
+ "id": "cardano",
+ "graph_id": null,
+ "name": "Cardano",
+ "alt_names": [],
+ "standard": "cardano",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/cardano",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://cardano.org/"
+ },
+ "index": 24
+ },
+ {
+ "id": "decimal",
+ "graph_id": null,
+ "name": "Decimal",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "tokens/del",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.decimalchain.com/"
+ },
+ "index": 25
+ },
+ {
+ "id": "gnosis",
+ "graph_id": "gnosis",
+ "name": "Gnosis",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "tokens/gno",
+ "brand_theme": "dark",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://gnosis.io/"
+ },
+ "index": 26,
+ "consensus": [
+ {
+ "id": "gnosis-cl",
+ "graph_id": null,
+ "name": "Gnosis Consensus Layer",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-08T00:00:00.000Z",
+ "full_released_at": "2023-03-08T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 27
+ }
+ ]
+ },
+ {
+ "id": "fantom",
+ "graph_id": "fantom",
+ "name": "Fantom",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/fantom",
+ "brand_theme": "light",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://fantom.foundation/"
+ },
+ "index": 28
+ },
+ {
+ "id": "celo",
+ "graph_id": "celo",
+ "name": "Celo",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/celo",
+ "brand_theme": "light",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://celo.org/"
+ },
+ "index": 29,
+ "testnets": [
+ {
+ "id": "alfajores",
+ "graph_id": null,
+ "name": "Alfajores",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 30
+ }
+ ]
+ },
+ {
+ "id": "arweave",
+ "graph_id": "arweave-mainnet",
+ "name": "Arweave",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.arweave.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-arweave/docs/main:sf.arweave.type.v1"
+ },
+ "icon": {
+ "id": "tokens/ar",
+ "brand_theme": "dark",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-03-03T00:00:00.000Z",
+ "full_released_at": "2024-03-03T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-03-03T00:00:00.000Z",
+ "full_released_at": "2024-03-03T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://arweave.org/"
+ },
+ "index": 31
+ },
+ {
+ "id": "cosmoshub",
+ "graph_id": "cosmoshub-4",
+ "name": "Cosmos Hub",
+ "alt_names": [],
+ "standard": "cosmos",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.cosmos.type.v1.Block",
+ "url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
+ },
+ "icon": {
+ "id": "networks/cosmos",
+ "brand_theme": "dark",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://cosmos.network/"
+ },
+ "index": 32,
+ "testnets": [
+ {
+ "id": "theta",
+ "graph_id": "theta-testnet-001",
+ "name": "Theta",
+ "alt_names": [],
+ "standard": "cosmos",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.cosmos.type.v1.Block",
+ "url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 33
+ },
+ {
+ "id": "juno",
+ "graph_id": null,
+ "name": "Juno",
+ "alt_names": [],
+ "standard": "cosmos",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.cosmos.type.v1.Block",
+ "url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": "2024-01-15T00:00:00.000Z"
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 34
+ }
+ ]
+ },
+ {
+ "id": "osmosis",
+ "graph_id": "osmosis-1",
+ "name": "Osmosis",
+ "alt_names": [],
+ "standard": "cosmos",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.cosmos.type.v1.Block",
+ "url": "https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto"
+ },
+ "icon": {
+ "id": "networks/osmosis",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-01-01T00:00:00.000Z",
+ "full_released_at": "2024-01-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://osmosis.zone/"
+ },
+ "index": 35
+ },
+ {
+ "id": "moonbeam",
+ "graph_id": "moonbeam",
+ "name": "Moonbeam",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/moonbeam",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://moonbeam.network/"
+ },
+ "index": 36
+ },
+ {
+ "id": "scroll",
+ "graph_id": "scroll",
+ "name": "Scroll",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/scroll",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://scroll.io/"
+ },
+ "index": 37
+ },
+ {
+ "id": "starknet",
+ "graph_id": null,
+ "name": "Starknet",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/starknet",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.starknet.io/"
+ },
+ "index": 38
+ },
+ {
+ "id": "eos",
+ "graph_id": null,
+ "name": "EOS",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "icon": {
+ "id": "tokens/eos",
+ "brand_theme": "light",
+ "variants": [
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://eosnetwork.com/"
+ },
+ "index": 39,
+ "evms": [
+ {
+ "id": "eosevm",
+ "graph_id": null,
+ "name": "EOS EVM",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 40
+ }
+ ],
+ "testnets": [
+ {
+ "id": "jungle4",
+ "graph_id": null,
+ "name": "Jungle4",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "index": 41
+ },
+ {
+ "id": "kylin",
+ "graph_id": null,
+ "name": "Kylin",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 42
+ }
+ ]
+ },
+ {
+ "id": "wax",
+ "graph_id": null,
+ "name": "WAX",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "icon": {
+ "id": "tokens/waxp",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://wax.io/"
+ },
+ "index": 43,
+ "testnets": [
+ {
+ "id": "waxtest",
+ "graph_id": null,
+ "name": "WAX Test",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 44
+ }
+ ]
+ },
+ {
+ "id": "telos",
+ "graph_id": null,
+ "name": "Telos",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "icon": {
+ "id": "networks/telos",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://telos.net/"
+ },
+ "index": 45,
+ "testnets": [
+ {
+ "id": "telostest",
+ "graph_id": null,
+ "name": "Telos Test",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2023-12-01T00:00:00.000Z",
+ "full_released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 46
+ }
+ ]
+ },
+ {
+ "id": "kava",
+ "graph_id": null,
+ "name": "Kava",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/kava",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.kava.io/"
+ },
+ "index": 47
+ },
+ {
+ "id": "blast",
+ "name": "Blast Network",
+ "alt_names": [],
+ "graph_id": "blast-mainnet",
+ "index": 48,
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/blast",
+ "brand_theme": "light",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [
+ {
+ "id": "blastsepolia",
+ "name": "Blast Network Sepolia",
+ "alt_names": [],
+ "graph_id": "blast-testnet",
+ "index": 49,
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ }
+ }
+ ],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L2",
+ "website": "https://blast.io/en"
+ }
+ },
+ {
+ "id": "boba",
+ "name": "Boba Network",
+ "alt_names": [],
+ "graph_id": "boba",
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "tokens/boba",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [
+ {
+ "id": "bobasepolia",
+ "graph_id": null,
+ "name": "Boba Sepolia",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 51
+ }
+ ],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L2",
+ "website": "https://boba.network/"
+ },
+ "index": 50
+ },
+ {
+ "id": "cronos",
+ "name": "Cronos",
+ "alt_names": [],
+ "graph_id": null,
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/cronos",
+ "brand_theme": "dark",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "website": "https://cronos.org/"
+ },
+ "index": 52
+ },
+ {
+ "id": "fuse",
+ "name": "Fuse",
+ "alt_names": [],
+ "graph_id": "fuse",
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "tokens/fuse",
+ "brand_theme": "light",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L1",
+ "website": "https://fuse.io/"
+ },
+ "index": 53
+ },
+ {
+ "id": "linea",
+ "name": "Linea",
+ "alt_names": [],
+ "graph_id": "linea",
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/linea",
+ "brand_theme": "dark",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:00Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:00Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:00Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "website": "https://linea.build/"
+ },
+ "index": 54
+ },
+ {
+ "id": "litecoin",
+ "name": "Litecoin",
+ "alt_names": [
+ "LTC"
+ ],
+ "graph_id": null,
+ "standard": "ltc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.litecoin.type.v1.Block",
+ "url": "https://buf.build/streamingfast/firehose-litecoin/docs/main:sf.litecoin.type.v1"
+ },
+ "icon": {
+ "id": "tokens/ltc",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L1",
+ "website": "https://litecoin.org/"
+ },
+ "index": 55
+ },
+ {
+ "id": "mode",
+ "name": "Mode Network",
+ "alt_names": [],
+ "graph_id": "mode-mainnet",
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/mode",
+ "brand_theme": "light",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-05-14T00:00:00Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-05-14T00:00:00Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-05-14T00:00:00Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L2",
+ "website": "https://www.mode.network/"
+ },
+ "index": 56
+ },
+ {
+ "id": "ronin",
+ "graph_id": null,
+ "name": "Ronin",
+ "alt_names": [],
+ "standard": "rrc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/ronin",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://roninchain.com/"
+ },
+ "index": 57
+ },
+ {
+ "id": "sei",
+ "graph_id": null,
+ "name": "Sei",
+ "alt_names": [],
+ "standard": "sei",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "tokens/sei",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.sei.io/"
+ },
+ "index": 58
+ },
+ {
+ "id": "xai",
+ "name": "XAI",
+ "alt_names": [],
+ "graph_id": null,
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/xai",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L3",
+ "website": "https://xai.games/"
+ },
+ "index": 59
+ },
+ {
+ "id": "zkastar",
+ "name": "Astar zkEVM",
+ "alt_names": [],
+ "graph_id": null,
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.zkevm.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-zkevm/docs/main:sf.zkevm.type.v1"
+ },
+ "icon": {
+ "id": "networks/astar",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [
+ {
+ "id": "zkatana",
+ "name": "Astar zKatana",
+ "alt_names": [],
+ "graph_id": null,
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.zkevm.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-zkevm/docs/main:sf.zkevm.type.v1"
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 61
+ },
+ {
+ "id": "zkyoto",
+ "name": "Astar zKyoto",
+ "alt_names": [],
+ "graph_id": "zkyoto-testnet",
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.zkevm.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-zkevm/docs/main:sf.zkevm.type.v1"
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "index": 62
+ }
+ ],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L2",
+ "website": "https://astar.network/"
+ },
+ "index": 60
+ },
+ {
+ "id": "x-layer",
+ "graph_id": null,
+ "name": "X-Layer",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": false,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/x-layer",
+ "brand_theme": "dark",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://www.okx.com/fr/xlayer"
+ },
+ "index": 63
+ },
+ {
+ "id": "zksync",
+ "graph_id": "zksync-era",
+ "name": "zkSync Era",
+ "alt_names": [],
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/zksync",
+ "brand_theme": "dark",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": null,
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "metadata": {
+ "website": "https://zksync.io/",
+ "tags": [
+ "zk"
+ ]
+ },
+ "index": 64
+ },
+ {
+ "id": "zora",
+ "name": "Zora Network",
+ "alt_names": [],
+ "graph_id": null,
+ "standard": "erc20",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/zora-network",
+ "brand_theme": "both",
+ "variants": [
+ "branded"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "firehose": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ },
+ "substreams": {
+ "beta_released_at": "2024-08-01T00:00:000Z",
+ "full_released_at": null,
+ "deprecated_at": null
+ }
+ },
+ "testnets": [],
+ "consensus": [],
+ "evms": [],
+ "metadata": {
+ "layer": "L2",
+ "website": "https://zora.co/"
+ },
+ "index": 65
+ },
+ {
+ "id": "ore",
+ "graph_id": null,
+ "name": "Ore",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "icon": {
+ "id": "networks/ore",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ },
+ "firehose": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ }
+ },
+ "metadata": {
+ "website": "https://ore.network/"
+ },
+ "index": 66,
+ "testnets": [
+ {
+ "id": "orestage",
+ "graph_id": null,
+ "name": "Ore Stage",
+ "alt_names": [],
+ "standard": "antelope",
+ "is_detailed_blocks": true,
+ "block_type": {
+ "label": "sf.antelope.type.v1.Block",
+ "url": "https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1"
+ },
+ "supported_services": {
+ "rpc": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ },
+ "firehose": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ },
+ "substreams": {
+ "beta_released_at": "2023-03-01T00:00:00.000Z",
+ "full_released_at": "2023-03-01T00:00:00.000Z",
+ "deprecated_at": "2023-03-21T00:00:00.000Z"
+ }
+ },
+ "index": 67
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/data/chains/V2/cosmoshub/cosmoshub.branded.svg b/data/chains/V2/cosmoshub/cosmoshub.branded.svg
new file mode 100644
index 0000000..a373532
--- /dev/null
+++ b/data/chains/V2/cosmoshub/cosmoshub.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/cosmoshub/cosmoshub.dark.svg b/data/chains/V2/cosmoshub/cosmoshub.dark.svg
new file mode 100644
index 0000000..250f661
--- /dev/null
+++ b/data/chains/V2/cosmoshub/cosmoshub.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/cosmoshub/cosmoshub.light.svg b/data/chains/V2/cosmoshub/cosmoshub.light.svg
new file mode 100644
index 0000000..4945283
--- /dev/null
+++ b/data/chains/V2/cosmoshub/cosmoshub.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/cosmoshub/meta.ts b/data/chains/V2/cosmoshub/meta.ts
new file mode 100644
index 0000000..f00031b
--- /dev/null
+++ b/data/chains/V2/cosmoshub/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'cosmoshub',
+ graph_id: 'cosmoshub-4',
+ name: 'Cosmos Hub',
+ alt_names: [],
+ standard: 'cosmos',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.cosmos.type.v1.Block',
+ url: 'https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto',
+ },
+ icon: {
+ id: 'networks/cosmos',
+ brand_theme: 'dark',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://cosmos.network/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/cosmoshub/testnets/juno/meta.ts b/data/chains/V2/cosmoshub/testnets/juno/meta.ts
new file mode 100644
index 0000000..58fe073
--- /dev/null
+++ b/data/chains/V2/cosmoshub/testnets/juno/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'juno',
+ graph_id: null,
+ name: 'Juno',
+ alt_names: [],
+ standard: 'cosmos',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.cosmos.type.v1.Block',
+ url: 'https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: '2024-01-15T00:00:00.000Z',
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/cosmoshub/testnets/theta/meta.ts b/data/chains/V2/cosmoshub/testnets/theta/meta.ts
new file mode 100644
index 0000000..68c8956
--- /dev/null
+++ b/data/chains/V2/cosmoshub/testnets/theta/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'theta',
+ graph_id: 'theta-testnet-001',
+ name: 'Theta',
+ alt_names: [],
+ standard: 'cosmos',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.cosmos.type.v1.Block',
+ url: 'https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/cronos/cronos.branded.svg b/data/chains/V2/cronos/cronos.branded.svg
new file mode 100644
index 0000000..3e465d2
--- /dev/null
+++ b/data/chains/V2/cronos/cronos.branded.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/cronos/cronos.dark.svg b/data/chains/V2/cronos/cronos.dark.svg
new file mode 100644
index 0000000..8276f3f
--- /dev/null
+++ b/data/chains/V2/cronos/cronos.dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/cronos/cronos.light.svg b/data/chains/V2/cronos/cronos.light.svg
new file mode 100644
index 0000000..7374bc5
--- /dev/null
+++ b/data/chains/V2/cronos/cronos.light.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/cronos/meta.ts b/data/chains/V2/cronos/meta.ts
new file mode 100644
index 0000000..b549cf1
--- /dev/null
+++ b/data/chains/V2/cronos/meta.ts
@@ -0,0 +1,44 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'cronos',
+ name: 'Cronos',
+ alt_names: [],
+ graph_id: null,
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/cronos',
+ brand_theme: 'dark',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ website: 'https://cronos.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/decimal/decimal.branded.svg b/data/chains/V2/decimal/decimal.branded.svg
new file mode 100644
index 0000000..5195000
--- /dev/null
+++ b/data/chains/V2/decimal/decimal.branded.svg
@@ -0,0 +1,10 @@
+
diff --git a/data/chains/V2/decimal/decimal.dark.svg b/data/chains/V2/decimal/decimal.dark.svg
new file mode 100644
index 0000000..ff1e411
--- /dev/null
+++ b/data/chains/V2/decimal/decimal.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/decimal/decimal.light.svg b/data/chains/V2/decimal/decimal.light.svg
new file mode 100644
index 0000000..f274534
--- /dev/null
+++ b/data/chains/V2/decimal/decimal.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/decimal/meta.ts b/data/chains/V2/decimal/meta.ts
new file mode 100644
index 0000000..5d6201d
--- /dev/null
+++ b/data/chains/V2/decimal/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'decimal',
+ graph_id: null,
+ name: 'Decimal',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'tokens/del',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.decimalchain.com/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eos/eos.dark.svg b/data/chains/V2/eos/eos.dark.svg
new file mode 100644
index 0000000..52d7f85
--- /dev/null
+++ b/data/chains/V2/eos/eos.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/eos/eos.light.svg b/data/chains/V2/eos/eos.light.svg
new file mode 100644
index 0000000..6f047b1
--- /dev/null
+++ b/data/chains/V2/eos/eos.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/eos/evms/eosevm/meta.ts b/data/chains/V2/eos/evms/eosevm/meta.ts
new file mode 100644
index 0000000..abd4f24
--- /dev/null
+++ b/data/chains/V2/eos/evms/eosevm/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalEVM } from '../../../../../../types/chain.types';
+
+const meta: ___InternalEVM = {
+ id: 'eosevm',
+ graph_id: null,
+ name: 'EOS EVM',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eos/meta.ts b/data/chains/V2/eos/meta.ts
new file mode 100644
index 0000000..6d74b69
--- /dev/null
+++ b/data/chains/V2/eos/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'eos',
+ graph_id: null,
+ name: 'EOS',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ icon: {
+ id: 'tokens/eos',
+ brand_theme: 'light',
+ variants: ['mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://eosnetwork.com/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eos/testnets/jungle4/meta.ts b/data/chains/V2/eos/testnets/jungle4/meta.ts
new file mode 100644
index 0000000..1109834
--- /dev/null
+++ b/data/chains/V2/eos/testnets/jungle4/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'jungle4',
+ graph_id: null,
+ name: 'Jungle4',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eos/testnets/kylin/meta.ts b/data/chains/V2/eos/testnets/kylin/meta.ts
new file mode 100644
index 0000000..28d21ad
--- /dev/null
+++ b/data/chains/V2/eos/testnets/kylin/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'kylin',
+ graph_id: null,
+ name: 'Kylin',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/consensus/eth-cl/meta.ts b/data/chains/V2/eth/consensus/eth-cl/meta.ts
new file mode 100644
index 0000000..5531389
--- /dev/null
+++ b/data/chains/V2/eth/consensus/eth-cl/meta.ts
@@ -0,0 +1,28 @@
+import { ___InternalConsensusLayer } from '../../../../../../types/chain.types';
+
+const meta: ___InternalConsensusLayer = {
+ id: 'eth-cl',
+ graph_id: null,
+ name: 'Ethereum Consensus Layer',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/consensus/goerli-cl/meta.ts b/data/chains/V2/eth/consensus/goerli-cl/meta.ts
new file mode 100644
index 0000000..e923dca
--- /dev/null
+++ b/data/chains/V2/eth/consensus/goerli-cl/meta.ts
@@ -0,0 +1,28 @@
+import { ___InternalConsensusLayer } from '../../../../../../types/chain.types';
+
+const meta: ___InternalConsensusLayer = {
+ id: 'goerli-cl',
+ graph_id: null,
+ name: 'Goerli Consensus Layer',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ substreams: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/consensus/holesky-cl/meta.ts b/data/chains/V2/eth/consensus/holesky-cl/meta.ts
new file mode 100644
index 0000000..4ad3b23
--- /dev/null
+++ b/data/chains/V2/eth/consensus/holesky-cl/meta.ts
@@ -0,0 +1,28 @@
+import { ___InternalConsensusLayer } from '../../../../../../types/chain.types';
+
+const meta: ___InternalConsensusLayer = {
+ id: 'holesky-cl',
+ graph_id: null,
+ name: 'Holesky Consensus Layer',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/consensus/sepolia-cl/meta.ts b/data/chains/V2/eth/consensus/sepolia-cl/meta.ts
new file mode 100644
index 0000000..8916e55
--- /dev/null
+++ b/data/chains/V2/eth/consensus/sepolia-cl/meta.ts
@@ -0,0 +1,28 @@
+import { ___InternalConsensusLayer } from '../../../../../../types/chain.types';
+
+const meta: ___InternalConsensusLayer = {
+ id: 'sepolia-cl',
+ graph_id: null,
+ name: 'Sepolia Consensus Layer',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/eth.branded.svg b/data/chains/V2/eth/eth.branded.svg
new file mode 100644
index 0000000..88766bd
--- /dev/null
+++ b/data/chains/V2/eth/eth.branded.svg
@@ -0,0 +1,10 @@
+
diff --git a/data/chains/V2/eth/eth.dark.svg b/data/chains/V2/eth/eth.dark.svg
new file mode 100644
index 0000000..2b0e08b
--- /dev/null
+++ b/data/chains/V2/eth/eth.dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/data/chains/V2/eth/eth.light.svg b/data/chains/V2/eth/eth.light.svg
new file mode 100644
index 0000000..6a5e837
--- /dev/null
+++ b/data/chains/V2/eth/eth.light.svg
@@ -0,0 +1,6 @@
+
diff --git a/data/chains/V2/eth/meta.ts b/data/chains/V2/eth/meta.ts
new file mode 100644
index 0000000..f48bb4a
--- /dev/null
+++ b/data/chains/V2/eth/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'eth',
+ graph_id: 'mainnet',
+ name: 'Ethereum',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/ethereum',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://ethereum.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/testnets/goerli/meta.ts b/data/chains/V2/eth/testnets/goerli/meta.ts
new file mode 100644
index 0000000..afe926c
--- /dev/null
+++ b/data/chains/V2/eth/testnets/goerli/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'goerli',
+ graph_id: null,
+ name: 'Goerli',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ substreams: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ rpc: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/testnets/holesky/meta.ts b/data/chains/V2/eth/testnets/holesky/meta.ts
new file mode 100644
index 0000000..1560b8d
--- /dev/null
+++ b/data/chains/V2/eth/testnets/holesky/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'holesky',
+ graph_id: null,
+ name: 'Holesky',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/eth/testnets/sepolia/meta.ts b/data/chains/V2/eth/testnets/sepolia/meta.ts
new file mode 100644
index 0000000..ac88f13
--- /dev/null
+++ b/data/chains/V2/eth/testnets/sepolia/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'sepolia',
+ graph_id: 'sepolia',
+ name: 'Sepolia',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/fantom/fantom.branded.svg b/data/chains/V2/fantom/fantom.branded.svg
new file mode 100644
index 0000000..c48ac21
--- /dev/null
+++ b/data/chains/V2/fantom/fantom.branded.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/fantom/fantom.dark.svg b/data/chains/V2/fantom/fantom.dark.svg
new file mode 100644
index 0000000..4659047
--- /dev/null
+++ b/data/chains/V2/fantom/fantom.dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/fantom/fantom.light.svg b/data/chains/V2/fantom/fantom.light.svg
new file mode 100644
index 0000000..155591d
--- /dev/null
+++ b/data/chains/V2/fantom/fantom.light.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/fantom/meta.ts b/data/chains/V2/fantom/meta.ts
new file mode 100644
index 0000000..66cb6b4
--- /dev/null
+++ b/data/chains/V2/fantom/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'fantom',
+ graph_id: 'fantom',
+ name: 'Fantom',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/fantom',
+ brand_theme: 'light',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://fantom.foundation/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/fuse/fuse.branded.svg b/data/chains/V2/fuse/fuse.branded.svg
new file mode 100644
index 0000000..91884b7
--- /dev/null
+++ b/data/chains/V2/fuse/fuse.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/fuse/fuse.dark.svg b/data/chains/V2/fuse/fuse.dark.svg
new file mode 100644
index 0000000..e046980
--- /dev/null
+++ b/data/chains/V2/fuse/fuse.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/fuse/fuse.light.svg b/data/chains/V2/fuse/fuse.light.svg
new file mode 100644
index 0000000..9e41934
--- /dev/null
+++ b/data/chains/V2/fuse/fuse.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/fuse/meta.ts b/data/chains/V2/fuse/meta.ts
new file mode 100644
index 0000000..e38c356
--- /dev/null
+++ b/data/chains/V2/fuse/meta.ts
@@ -0,0 +1,45 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'fuse',
+ name: 'Fuse',
+ alt_names: [],
+ graph_id: 'fuse',
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'tokens/fuse',
+ brand_theme: 'light',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L1',
+ website: 'https://fuse.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/gnosis/consensus/chiado-cl/meta.ts b/data/chains/V2/gnosis/consensus/chiado-cl/meta.ts
new file mode 100644
index 0000000..51da450
--- /dev/null
+++ b/data/chains/V2/gnosis/consensus/chiado-cl/meta.ts
@@ -0,0 +1,28 @@
+import { ___InternalConsensusLayer } from '../../../../../../types/chain.types';
+
+const meta: ___InternalConsensusLayer = {
+ id: 'chiado-cl',
+ graph_id: null,
+ name: 'Chiado Consensus Layer',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/gnosis/consensus/gnosis-cl/meta.ts b/data/chains/V2/gnosis/consensus/gnosis-cl/meta.ts
new file mode 100644
index 0000000..cfd099a
--- /dev/null
+++ b/data/chains/V2/gnosis/consensus/gnosis-cl/meta.ts
@@ -0,0 +1,28 @@
+import { ___InternalConsensusLayer } from '../../../../../../types/chain.types';
+
+const meta: ___InternalConsensusLayer = {
+ id: 'gnosis-cl',
+ graph_id: null,
+ name: 'Gnosis Consensus Layer',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-03-08T00:00:00.000Z',
+ full_released_at: '2023-03-08T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/gnosis/gnosis.branded.svg b/data/chains/V2/gnosis/gnosis.branded.svg
new file mode 100644
index 0000000..5271f3e
--- /dev/null
+++ b/data/chains/V2/gnosis/gnosis.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/gnosis/gnosis.dark.svg b/data/chains/V2/gnosis/gnosis.dark.svg
new file mode 100644
index 0000000..68d09cc
--- /dev/null
+++ b/data/chains/V2/gnosis/gnosis.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/gnosis/gnosis.light.svg b/data/chains/V2/gnosis/gnosis.light.svg
new file mode 100644
index 0000000..2a92e2c
--- /dev/null
+++ b/data/chains/V2/gnosis/gnosis.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/gnosis/meta.ts b/data/chains/V2/gnosis/meta.ts
new file mode 100644
index 0000000..722e4dc
--- /dev/null
+++ b/data/chains/V2/gnosis/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'gnosis',
+ graph_id: 'gnosis',
+ name: 'Gnosis',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'tokens/gno',
+ brand_theme: 'dark',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://gnosis.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/gnosis/testnets/chiado/meta.ts b/data/chains/V2/gnosis/testnets/chiado/meta.ts
new file mode 100644
index 0000000..83e5430
--- /dev/null
+++ b/data/chains/V2/gnosis/testnets/chiado/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'chiado',
+ graph_id: null,
+ name: 'Chiado',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/index.ts b/data/chains/V2/index.ts
new file mode 100644
index 0000000..9342a2a
--- /dev/null
+++ b/data/chains/V2/index.ts
@@ -0,0 +1,72 @@
+// This file is auto-generated on pre-commit to avoid maintaining it.
+// Do not modify manually as it will be overwritten.
+// Last generation on 8/2/2024, 12:13:17 PM.
+
+export { default as arbone } from './arbone/meta';
+export { default as arbgoerli } from './arbone/testnets/arbgoerli/meta';
+export { default as arbsepolia } from './arbone/testnets/arbsepolia/meta';
+export { default as arweave } from './arweave/meta';
+export { default as avalanche } from './avalanche/meta';
+export { default as base } from './base/meta';
+export { default as bitcoin } from './bitcoin/meta';
+export { default as blast } from './blast/meta';
+export { default as blastsepolia } from './blast/testnets/blastsepolia/meta';
+export { default as boba } from './boba/meta';
+export { default as bobasepolia } from './boba/testnets/bobasepolia/meta';
+export { default as bsc } from './bsc/meta';
+export { default as chapel } from './bsc/testnets/chapel/meta';
+export { default as cardano } from './cardano/meta';
+export { default as celo } from './celo/meta';
+export { default as alfajores } from './celo/testnets/alfajores/meta';
+export { default as cosmoshub } from './cosmoshub/meta';
+export { default as juno } from './cosmoshub/testnets/juno/meta';
+export { default as theta } from './cosmoshub/testnets/theta/meta';
+export { default as cronos } from './cronos/meta';
+export { default as decimal } from './decimal/meta';
+export { default as eos } from './eos/meta';
+export { default as jungle4 } from './eos/testnets/jungle4/meta';
+export { default as kylin } from './eos/testnets/kylin/meta';
+export { default as eosevm } from './eos/evms/eosevm/meta';
+export { default as eth } from './eth/meta';
+export { default as goerli } from './eth/testnets/goerli/meta';
+export { default as holesky } from './eth/testnets/holesky/meta';
+export { default as sepolia } from './eth/testnets/sepolia/meta';
+export { default as ethCl } from './eth/consensus/eth-cl/meta';
+export { default as goerliCl } from './eth/consensus/goerli-cl/meta';
+export { default as holeskyCl } from './eth/consensus/holesky-cl/meta';
+export { default as sepoliaCl } from './eth/consensus/sepolia-cl/meta';
+export { default as fantom } from './fantom/meta';
+export { default as fuse } from './fuse/meta';
+export { default as gnosis } from './gnosis/meta';
+export { default as chiado } from './gnosis/testnets/chiado/meta';
+export { default as chiadoCl } from './gnosis/consensus/chiado-cl/meta';
+export { default as gnosisCl } from './gnosis/consensus/gnosis-cl/meta';
+export { default as kava } from './kava/meta';
+export { default as linea } from './linea/meta';
+export { default as litecoin } from './litecoin/meta';
+export { default as mode } from './mode/meta';
+export { default as moonbeam } from './moonbeam/meta';
+export { default as near } from './near/meta';
+export { default as neartest } from './near/testnets/neartest/meta';
+export { default as optimism } from './optimism/meta';
+export { default as ore } from './ore/meta';
+export { default as orestage } from './ore/testnets/orestage/meta';
+export { default as osmosis } from './osmosis/meta';
+export { default as polygon } from './polygon/meta';
+export { default as amoy } from './polygon/testnets/amoy/meta';
+export { default as mumbai } from './polygon/testnets/mumbai/meta';
+export { default as ronin } from './ronin/meta';
+export { default as scroll } from './scroll/meta';
+export { default as sei } from './sei/meta';
+export { default as starknet } from './starknet/meta';
+export { default as telos } from './telos/meta';
+export { default as telostest } from './telos/testnets/telostest/meta';
+export { default as wax } from './wax/meta';
+export { default as waxtest } from './wax/testnets/waxtest/meta';
+export { default as xLayer } from './x-layer/meta';
+export { default as xai } from './xai/meta';
+export { default as zkastar } from './zkastar/meta';
+export { default as zkatana } from './zkastar/testnets/zkatana/meta';
+export { default as zkyoto } from './zkastar/testnets/zkyoto/meta';
+export { default as zksync } from './zksync/meta';
+export { default as zora } from './zora/meta';
diff --git a/data/chains/V2/kava/kava.branded.svg b/data/chains/V2/kava/kava.branded.svg
new file mode 100644
index 0000000..afca52f
--- /dev/null
+++ b/data/chains/V2/kava/kava.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/kava/kava.dark.svg b/data/chains/V2/kava/kava.dark.svg
new file mode 100644
index 0000000..15d7eb4
--- /dev/null
+++ b/data/chains/V2/kava/kava.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/kava/kava.light.svg b/data/chains/V2/kava/kava.light.svg
new file mode 100644
index 0000000..3ef7c2c
--- /dev/null
+++ b/data/chains/V2/kava/kava.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/kava/meta.ts b/data/chains/V2/kava/meta.ts
new file mode 100644
index 0000000..ed65ad8
--- /dev/null
+++ b/data/chains/V2/kava/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'kava',
+ graph_id: null,
+ name: 'Kava',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/kava',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.kava.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/linea/linea.branded.svg b/data/chains/V2/linea/linea.branded.svg
new file mode 100644
index 0000000..1fcdd17
--- /dev/null
+++ b/data/chains/V2/linea/linea.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/linea/linea.dark.svg b/data/chains/V2/linea/linea.dark.svg
new file mode 100644
index 0000000..b70101f
--- /dev/null
+++ b/data/chains/V2/linea/linea.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/linea/linea.light.svg b/data/chains/V2/linea/linea.light.svg
new file mode 100644
index 0000000..36b185a
--- /dev/null
+++ b/data/chains/V2/linea/linea.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/linea/meta.ts b/data/chains/V2/linea/meta.ts
new file mode 100644
index 0000000..679734b
--- /dev/null
+++ b/data/chains/V2/linea/meta.ts
@@ -0,0 +1,44 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'linea',
+ name: 'Linea',
+ alt_names: [],
+ graph_id: 'linea',
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/linea',
+ brand_theme: 'dark',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:00Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:00Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:00Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ website: 'https://linea.build/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/litecoin/litecoin.branded.svg b/data/chains/V2/litecoin/litecoin.branded.svg
new file mode 100644
index 0000000..e83c952
--- /dev/null
+++ b/data/chains/V2/litecoin/litecoin.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/litecoin/litecoin.dark.svg b/data/chains/V2/litecoin/litecoin.dark.svg
new file mode 100644
index 0000000..f624524
--- /dev/null
+++ b/data/chains/V2/litecoin/litecoin.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/litecoin/litecoin.light.svg b/data/chains/V2/litecoin/litecoin.light.svg
new file mode 100644
index 0000000..96533f2
--- /dev/null
+++ b/data/chains/V2/litecoin/litecoin.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/litecoin/meta.ts b/data/chains/V2/litecoin/meta.ts
new file mode 100644
index 0000000..3494048
--- /dev/null
+++ b/data/chains/V2/litecoin/meta.ts
@@ -0,0 +1,45 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'litecoin',
+ name: 'Litecoin',
+ alt_names: ['LTC'],
+ graph_id: null,
+ standard: 'ltc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.litecoin.type.v1.Block',
+ url: 'https://buf.build/streamingfast/firehose-litecoin/docs/main:sf.litecoin.type.v1',
+ },
+ icon: {
+ id: 'tokens/ltc',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L1',
+ website: 'https://litecoin.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/mode/meta.ts b/data/chains/V2/mode/meta.ts
new file mode 100644
index 0000000..d333c22
--- /dev/null
+++ b/data/chains/V2/mode/meta.ts
@@ -0,0 +1,45 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'mode',
+ name: 'Mode Network',
+ alt_names: [],
+ graph_id: 'mode-mainnet',
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/mode',
+ brand_theme: 'light',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-05-14T00:00:00Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-05-14T00:00:00Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-05-14T00:00:00Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L2',
+ website: 'https://www.mode.network/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/mode/mode.branded.svg b/data/chains/V2/mode/mode.branded.svg
new file mode 100644
index 0000000..88a614e
--- /dev/null
+++ b/data/chains/V2/mode/mode.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/mode/mode.dark.svg b/data/chains/V2/mode/mode.dark.svg
new file mode 100644
index 0000000..89e0103
--- /dev/null
+++ b/data/chains/V2/mode/mode.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/mode/mode.light.svg b/data/chains/V2/mode/mode.light.svg
new file mode 100644
index 0000000..47ada5b
--- /dev/null
+++ b/data/chains/V2/mode/mode.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/moonbeam/meta.ts b/data/chains/V2/moonbeam/meta.ts
new file mode 100644
index 0000000..237c6d1
--- /dev/null
+++ b/data/chains/V2/moonbeam/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'moonbeam',
+ graph_id: 'moonbeam',
+ name: 'Moonbeam',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/moonbeam',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://moonbeam.network/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/moonbeam/moonbeam.branded.svg b/data/chains/V2/moonbeam/moonbeam.branded.svg
new file mode 100644
index 0000000..f819a51
--- /dev/null
+++ b/data/chains/V2/moonbeam/moonbeam.branded.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/moonbeam/moonbeam.dark.svg b/data/chains/V2/moonbeam/moonbeam.dark.svg
new file mode 100644
index 0000000..35d39e9
--- /dev/null
+++ b/data/chains/V2/moonbeam/moonbeam.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/moonbeam/moonbeam.light.svg b/data/chains/V2/moonbeam/moonbeam.light.svg
new file mode 100644
index 0000000..eb76348
--- /dev/null
+++ b/data/chains/V2/moonbeam/moonbeam.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/near/meta.ts b/data/chains/V2/near/meta.ts
new file mode 100644
index 0000000..c079de8
--- /dev/null
+++ b/data/chains/V2/near/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'near',
+ graph_id: 'near-mainnet',
+ name: 'Near',
+ alt_names: [],
+ standard: 'near',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.near.type.v1.Block',
+ url: 'https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1',
+ },
+ icon: {
+ id: 'tokens/near',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://near.org/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/near/near.branded.svg b/data/chains/V2/near/near.branded.svg
new file mode 100644
index 0000000..3efe47c
--- /dev/null
+++ b/data/chains/V2/near/near.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/near/near.dark.svg b/data/chains/V2/near/near.dark.svg
new file mode 100644
index 0000000..0f25eda
--- /dev/null
+++ b/data/chains/V2/near/near.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/near/near.light.svg b/data/chains/V2/near/near.light.svg
new file mode 100644
index 0000000..876f1d4
--- /dev/null
+++ b/data/chains/V2/near/near.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/near/testnets/neartest/meta.ts b/data/chains/V2/near/testnets/neartest/meta.ts
new file mode 100644
index 0000000..7ccc589
--- /dev/null
+++ b/data/chains/V2/near/testnets/neartest/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'neartest',
+ graph_id: 'near-testnet',
+ name: 'Near-testnet',
+ alt_names: [],
+ standard: 'near',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.near.type.v1.Block',
+ url: 'https://buf.build/streamingfast/firehose-near/docs/main:sf.near.type.v1',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/optimism/meta.ts b/data/chains/V2/optimism/meta.ts
new file mode 100644
index 0000000..d185d54
--- /dev/null
+++ b/data/chains/V2/optimism/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'optimism',
+ graph_id: 'optimism',
+ name: 'Optimism',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/optimistic-ethereum',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-01-01T00:00:00.000Z',
+ full_released_at: '2024-01-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-01-01T00:00:00.000Z',
+ full_released_at: '2024-01-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://optimism.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/optimism/optimism.branded.svg b/data/chains/V2/optimism/optimism.branded.svg
new file mode 100644
index 0000000..d355b27
--- /dev/null
+++ b/data/chains/V2/optimism/optimism.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/optimism/optimism.dark.svg b/data/chains/V2/optimism/optimism.dark.svg
new file mode 100644
index 0000000..a115182
--- /dev/null
+++ b/data/chains/V2/optimism/optimism.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/optimism/optimism.light.svg b/data/chains/V2/optimism/optimism.light.svg
new file mode 100644
index 0000000..708b411
--- /dev/null
+++ b/data/chains/V2/optimism/optimism.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/ore/meta.ts b/data/chains/V2/ore/meta.ts
new file mode 100644
index 0000000..3268945
--- /dev/null
+++ b/data/chains/V2/ore/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'ore',
+ graph_id: null,
+ name: 'Ore',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ icon: {
+ id: 'networks/ore',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ firehose: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ substreams: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ },
+ metadata: {
+ website: 'https://ore.network/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/ore/ore.branded.svg b/data/chains/V2/ore/ore.branded.svg
new file mode 100644
index 0000000..6eeb726
--- /dev/null
+++ b/data/chains/V2/ore/ore.branded.svg
@@ -0,0 +1,9 @@
+
diff --git a/data/chains/V2/ore/ore.dark.svg b/data/chains/V2/ore/ore.dark.svg
new file mode 100644
index 0000000..02f197e
--- /dev/null
+++ b/data/chains/V2/ore/ore.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/ore/ore.light.svg b/data/chains/V2/ore/ore.light.svg
new file mode 100644
index 0000000..79e202f
--- /dev/null
+++ b/data/chains/V2/ore/ore.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/ore/testnets/orestage/meta.ts b/data/chains/V2/ore/testnets/orestage/meta.ts
new file mode 100644
index 0000000..14c7670
--- /dev/null
+++ b/data/chains/V2/ore/testnets/orestage/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'orestage',
+ graph_id: null,
+ name: 'Ore Stage',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ firehose: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ substreams: {
+ beta_released_at: '2023-03-01T00:00:00.000Z',
+ full_released_at: '2023-03-01T00:00:00.000Z',
+ deprecated_at: '2023-03-21T00:00:00.000Z',
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/osmosis/meta.ts b/data/chains/V2/osmosis/meta.ts
new file mode 100644
index 0000000..7792527
--- /dev/null
+++ b/data/chains/V2/osmosis/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'osmosis',
+ graph_id: 'osmosis-1',
+ name: 'Osmosis',
+ alt_names: [],
+ standard: 'cosmos',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.cosmos.type.v1.Block',
+ url: 'https://github.com/figment-networks/proto-cosmos/blob/main/sf/cosmos/type/v1/type.proto',
+ },
+ icon: {
+ id: 'networks/osmosis',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-01-01T00:00:00.000Z',
+ full_released_at: '2024-01-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://osmosis.zone/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/osmosis/osmosis.branded.svg b/data/chains/V2/osmosis/osmosis.branded.svg
new file mode 100644
index 0000000..b287a36
--- /dev/null
+++ b/data/chains/V2/osmosis/osmosis.branded.svg
@@ -0,0 +1,75 @@
+
diff --git a/data/chains/V2/osmosis/osmosis.dark.svg b/data/chains/V2/osmosis/osmosis.dark.svg
new file mode 100644
index 0000000..be66e06
--- /dev/null
+++ b/data/chains/V2/osmosis/osmosis.dark.svg
@@ -0,0 +1,6 @@
+
diff --git a/data/chains/V2/osmosis/osmosis.light.svg b/data/chains/V2/osmosis/osmosis.light.svg
new file mode 100644
index 0000000..dce9e92
--- /dev/null
+++ b/data/chains/V2/osmosis/osmosis.light.svg
@@ -0,0 +1,6 @@
+
diff --git a/data/chains/V2/polygon/meta.ts b/data/chains/V2/polygon/meta.ts
new file mode 100644
index 0000000..c11cf6a
--- /dev/null
+++ b/data/chains/V2/polygon/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'polygon',
+ graph_id: 'matic',
+ name: 'Polygon',
+ alt_names: ['matic'],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/polygon-pos',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://polygon.technology/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/polygon/polygon.branded.svg b/data/chains/V2/polygon/polygon.branded.svg
new file mode 100644
index 0000000..5f4bdea
--- /dev/null
+++ b/data/chains/V2/polygon/polygon.branded.svg
@@ -0,0 +1,10 @@
+
diff --git a/data/chains/V2/polygon/polygon.dark.svg b/data/chains/V2/polygon/polygon.dark.svg
new file mode 100644
index 0000000..dda426c
--- /dev/null
+++ b/data/chains/V2/polygon/polygon.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/polygon/polygon.light.svg b/data/chains/V2/polygon/polygon.light.svg
new file mode 100644
index 0000000..7236412
--- /dev/null
+++ b/data/chains/V2/polygon/polygon.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/polygon/testnets/amoy/meta.ts b/data/chains/V2/polygon/testnets/amoy/meta.ts
new file mode 100644
index 0000000..9755240
--- /dev/null
+++ b/data/chains/V2/polygon/testnets/amoy/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'amoy',
+ graph_id: 'polygon-amoy',
+ name: 'Amoy',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-04-12T00:00:00.000Z',
+ full_released_at: '2024-04-12T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-04-12T00:00:00.000Z',
+ full_released_at: '2024-04-12T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-04-12T00:00:00.000Z',
+ full_released_at: '2024-04-12T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/polygon/testnets/mumbai/meta.ts b/data/chains/V2/polygon/testnets/mumbai/meta.ts
new file mode 100644
index 0000000..4763544
--- /dev/null
+++ b/data/chains/V2/polygon/testnets/mumbai/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'mumbai',
+ graph_id: null,
+ name: 'Mumbai',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: '2024-04-12T00:00:00.000Z',
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: '2024-04-12T00:00:00.000Z',
+ },
+ rpc: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: '2024-04-12T00:00:00.000Z',
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/ronin/meta.ts b/data/chains/V2/ronin/meta.ts
new file mode 100644
index 0000000..300f3db
--- /dev/null
+++ b/data/chains/V2/ronin/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'ronin',
+ graph_id: null,
+ name: 'Ronin',
+ alt_names: [],
+ standard: 'rrc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/ronin',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://roninchain.com/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/ronin/ronin.branded.svg b/data/chains/V2/ronin/ronin.branded.svg
new file mode 100644
index 0000000..29ef675
--- /dev/null
+++ b/data/chains/V2/ronin/ronin.branded.svg
@@ -0,0 +1,11 @@
+
diff --git a/data/chains/V2/ronin/ronin.dark.svg b/data/chains/V2/ronin/ronin.dark.svg
new file mode 100644
index 0000000..d9fabc1
--- /dev/null
+++ b/data/chains/V2/ronin/ronin.dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/ronin/ronin.light.svg b/data/chains/V2/ronin/ronin.light.svg
new file mode 100644
index 0000000..e53f957
--- /dev/null
+++ b/data/chains/V2/ronin/ronin.light.svg
@@ -0,0 +1,4 @@
+
diff --git a/data/chains/V2/scroll/meta.ts b/data/chains/V2/scroll/meta.ts
new file mode 100644
index 0000000..49fa445
--- /dev/null
+++ b/data/chains/V2/scroll/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'scroll',
+ graph_id: 'scroll',
+ name: 'Scroll',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/scroll',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://scroll.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/scroll/scroll.branded.svg b/data/chains/V2/scroll/scroll.branded.svg
new file mode 100644
index 0000000..2672cbc
--- /dev/null
+++ b/data/chains/V2/scroll/scroll.branded.svg
@@ -0,0 +1,7 @@
+
diff --git a/data/chains/V2/scroll/scroll.dark.svg b/data/chains/V2/scroll/scroll.dark.svg
new file mode 100644
index 0000000..9623b5c
--- /dev/null
+++ b/data/chains/V2/scroll/scroll.dark.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/scroll/scroll.light.svg b/data/chains/V2/scroll/scroll.light.svg
new file mode 100644
index 0000000..bbdf115
--- /dev/null
+++ b/data/chains/V2/scroll/scroll.light.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/sei/meta.ts b/data/chains/V2/sei/meta.ts
new file mode 100644
index 0000000..4e40c36
--- /dev/null
+++ b/data/chains/V2/sei/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'sei',
+ graph_id: null,
+ name: 'Sei',
+ alt_names: [],
+ standard: 'sei',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'tokens/sei',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.sei.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/sei/sei.branded.svg b/data/chains/V2/sei/sei.branded.svg
new file mode 100644
index 0000000..504518e
--- /dev/null
+++ b/data/chains/V2/sei/sei.branded.svg
@@ -0,0 +1,9 @@
+
diff --git a/data/chains/V2/sei/sei.dark.svg b/data/chains/V2/sei/sei.dark.svg
new file mode 100644
index 0000000..f5cc4a8
--- /dev/null
+++ b/data/chains/V2/sei/sei.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/sei/sei.light.svg b/data/chains/V2/sei/sei.light.svg
new file mode 100644
index 0000000..81252a4
--- /dev/null
+++ b/data/chains/V2/sei/sei.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/starknet/meta.ts b/data/chains/V2/starknet/meta.ts
new file mode 100644
index 0000000..cc24da9
--- /dev/null
+++ b/data/chains/V2/starknet/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'starknet',
+ graph_id: null,
+ name: 'Starknet',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/starknet',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.starknet.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/starknet/starknet.branded.svg b/data/chains/V2/starknet/starknet.branded.svg
new file mode 100644
index 0000000..a092984
--- /dev/null
+++ b/data/chains/V2/starknet/starknet.branded.svg
@@ -0,0 +1,13 @@
+
diff --git a/data/chains/V2/starknet/starknet.dark.svg b/data/chains/V2/starknet/starknet.dark.svg
new file mode 100644
index 0000000..64de940
--- /dev/null
+++ b/data/chains/V2/starknet/starknet.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/starknet/starknet.light.svg b/data/chains/V2/starknet/starknet.light.svg
new file mode 100644
index 0000000..55452c8
--- /dev/null
+++ b/data/chains/V2/starknet/starknet.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/telos/meta.ts b/data/chains/V2/telos/meta.ts
new file mode 100644
index 0000000..f9aa3b9
--- /dev/null
+++ b/data/chains/V2/telos/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'telos',
+ graph_id: null,
+ name: 'Telos',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ icon: {
+ id: 'networks/telos',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://telos.net/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/telos/telos.branded.svg b/data/chains/V2/telos/telos.branded.svg
new file mode 100644
index 0000000..335acf8
--- /dev/null
+++ b/data/chains/V2/telos/telos.branded.svg
@@ -0,0 +1,15 @@
+
diff --git a/data/chains/V2/telos/telos.dark.svg b/data/chains/V2/telos/telos.dark.svg
new file mode 100644
index 0000000..31640b2
--- /dev/null
+++ b/data/chains/V2/telos/telos.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/telos/telos.light.svg b/data/chains/V2/telos/telos.light.svg
new file mode 100644
index 0000000..7c8daf3
--- /dev/null
+++ b/data/chains/V2/telos/telos.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/telos/testnets/telostest/meta.ts b/data/chains/V2/telos/testnets/telostest/meta.ts
new file mode 100644
index 0000000..dd99f71
--- /dev/null
+++ b/data/chains/V2/telos/testnets/telostest/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'telostest',
+ graph_id: null,
+ name: 'Telos Test',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/wax/meta.ts b/data/chains/V2/wax/meta.ts
new file mode 100644
index 0000000..f8c51dd
--- /dev/null
+++ b/data/chains/V2/wax/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'wax',
+ graph_id: null,
+ name: 'WAX',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ icon: {
+ id: 'tokens/waxp',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://wax.io/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/wax/testnets/waxtest/meta.ts b/data/chains/V2/wax/testnets/waxtest/meta.ts
new file mode 100644
index 0000000..73b5629
--- /dev/null
+++ b/data/chains/V2/wax/testnets/waxtest/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'waxtest',
+ graph_id: null,
+ name: 'WAX Test',
+ alt_names: [],
+ standard: 'antelope',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.antelope.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-antelope/docs/main:sf.antelope.type.v1',
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2023-12-01T00:00:00.000Z',
+ full_released_at: '2023-12-01T00:00:00.000Z',
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/wax/wax.branded.svg b/data/chains/V2/wax/wax.branded.svg
new file mode 100644
index 0000000..57c5d8b
--- /dev/null
+++ b/data/chains/V2/wax/wax.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/wax/wax.dark.svg b/data/chains/V2/wax/wax.dark.svg
new file mode 100644
index 0000000..dad28e1
--- /dev/null
+++ b/data/chains/V2/wax/wax.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/wax/wax.light.svg b/data/chains/V2/wax/wax.light.svg
new file mode 100644
index 0000000..20804b0
--- /dev/null
+++ b/data/chains/V2/wax/wax.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/x-layer/meta.ts b/data/chains/V2/x-layer/meta.ts
new file mode 100644
index 0000000..9e96ad5
--- /dev/null
+++ b/data/chains/V2/x-layer/meta.ts
@@ -0,0 +1,41 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'x-layer',
+ graph_id: null,
+ name: 'X-Layer',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/x-layer',
+ brand_theme: 'dark',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://www.okx.com/fr/xlayer',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/x-layer/x-layer.branded.svg b/data/chains/V2/x-layer/x-layer.branded.svg
new file mode 100644
index 0000000..f7a7ba2
--- /dev/null
+++ b/data/chains/V2/x-layer/x-layer.branded.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/x-layer/x-layer.dark.svg b/data/chains/V2/x-layer/x-layer.dark.svg
new file mode 100644
index 0000000..51ee552
--- /dev/null
+++ b/data/chains/V2/x-layer/x-layer.dark.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/x-layer/x-layer.light.svg b/data/chains/V2/x-layer/x-layer.light.svg
new file mode 100644
index 0000000..1820c7e
--- /dev/null
+++ b/data/chains/V2/x-layer/x-layer.light.svg
@@ -0,0 +1,5 @@
+
diff --git a/data/chains/V2/xai/meta.ts b/data/chains/V2/xai/meta.ts
new file mode 100644
index 0000000..72b0ed6
--- /dev/null
+++ b/data/chains/V2/xai/meta.ts
@@ -0,0 +1,45 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'xai',
+ name: 'XAI',
+ alt_names: [],
+ graph_id: null,
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/xai',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L3',
+ website: 'https://xai.games/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/xai/xai.branded.svg b/data/chains/V2/xai/xai.branded.svg
new file mode 100644
index 0000000..6272abb
--- /dev/null
+++ b/data/chains/V2/xai/xai.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/xai/xai.dark.svg b/data/chains/V2/xai/xai.dark.svg
new file mode 100644
index 0000000..9109748
--- /dev/null
+++ b/data/chains/V2/xai/xai.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/xai/xai.light.svg b/data/chains/V2/xai/xai.light.svg
new file mode 100644
index 0000000..b1cc000
--- /dev/null
+++ b/data/chains/V2/xai/xai.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/zkastar/meta.ts b/data/chains/V2/zkastar/meta.ts
new file mode 100644
index 0000000..1f30427
--- /dev/null
+++ b/data/chains/V2/zkastar/meta.ts
@@ -0,0 +1,45 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'zkastar',
+ name: 'Astar zkEVM',
+ alt_names: [],
+ graph_id: null,
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.zkevm.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-zkevm/docs/main:sf.zkevm.type.v1',
+ },
+ icon: {
+ id: 'networks/astar',
+ brand_theme: 'both',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L2',
+ website: 'https://astar.network/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/zkastar/testnets/zkatana/meta.ts b/data/chains/V2/zkastar/testnets/zkatana/meta.ts
new file mode 100644
index 0000000..fe73a73
--- /dev/null
+++ b/data/chains/V2/zkastar/testnets/zkatana/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'zkatana',
+ name: 'Astar zKatana',
+ alt_names: [],
+ graph_id: null,
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.zkevm.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-zkevm/docs/main:sf.zkevm.type.v1',
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/zkastar/testnets/zkyoto/meta.ts b/data/chains/V2/zkastar/testnets/zkyoto/meta.ts
new file mode 100644
index 0000000..93a939a
--- /dev/null
+++ b/data/chains/V2/zkastar/testnets/zkyoto/meta.ts
@@ -0,0 +1,33 @@
+import { ___InternalTestnet } from '../../../../../../types/chain.types';
+
+const meta: ___InternalTestnet = {
+ id: 'zkyoto',
+ name: 'Astar zKyoto',
+ alt_names: [],
+ graph_id: 'zkyoto-testnet',
+ standard: 'erc20',
+ is_detailed_blocks: false,
+ block_type: {
+ label: 'sf.zkevm.type.v1.Block',
+ url: 'https://buf.build/pinax/firehose-zkevm/docs/main:sf.zkevm.type.v1',
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/zkastar/zkastar.branded.svg b/data/chains/V2/zkastar/zkastar.branded.svg
new file mode 100644
index 0000000..13ce8c8
--- /dev/null
+++ b/data/chains/V2/zkastar/zkastar.branded.svg
@@ -0,0 +1,106 @@
+
diff --git a/data/chains/V2/zkastar/zkastar.dark.svg b/data/chains/V2/zkastar/zkastar.dark.svg
new file mode 100644
index 0000000..799c7aa
--- /dev/null
+++ b/data/chains/V2/zkastar/zkastar.dark.svg
@@ -0,0 +1,9 @@
+
diff --git a/data/chains/V2/zkastar/zkastar.light.svg b/data/chains/V2/zkastar/zkastar.light.svg
new file mode 100644
index 0000000..0cec748
--- /dev/null
+++ b/data/chains/V2/zkastar/zkastar.light.svg
@@ -0,0 +1,9 @@
+
diff --git a/data/chains/V2/zksync/meta.ts b/data/chains/V2/zksync/meta.ts
new file mode 100644
index 0000000..9904f41
--- /dev/null
+++ b/data/chains/V2/zksync/meta.ts
@@ -0,0 +1,42 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'zksync',
+ graph_id: 'zksync-era',
+ name: 'zkSync Era',
+ alt_names: [],
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/zksync',
+ brand_theme: 'dark',
+ variants: ['branded', 'mono'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: null,
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ metadata: {
+ website: 'https://zksync.io/',
+ tags: ['zk'],
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/zksync/zksync.branded.svg b/data/chains/V2/zksync/zksync.branded.svg
new file mode 100644
index 0000000..901dc2b
--- /dev/null
+++ b/data/chains/V2/zksync/zksync.branded.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/zksync/zksync.dark.svg b/data/chains/V2/zksync/zksync.dark.svg
new file mode 100644
index 0000000..d404ffd
--- /dev/null
+++ b/data/chains/V2/zksync/zksync.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/zksync/zksync.light.svg b/data/chains/V2/zksync/zksync.light.svg
new file mode 100644
index 0000000..09b7c8c
--- /dev/null
+++ b/data/chains/V2/zksync/zksync.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/data/chains/V2/zora/meta.ts b/data/chains/V2/zora/meta.ts
new file mode 100644
index 0000000..4e2d03e
--- /dev/null
+++ b/data/chains/V2/zora/meta.ts
@@ -0,0 +1,45 @@
+import { ___InternalChain } from '../../../../types/chain.types';
+
+const meta: ___InternalChain = {
+ id: 'zora',
+ name: 'Zora Network',
+ alt_names: [],
+ graph_id: null,
+ standard: 'erc20',
+ is_detailed_blocks: true,
+ block_type: {
+ label: 'sf.ethereum.type.v2.Block',
+ url: 'https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2',
+ },
+ icon: {
+ id: 'networks/zora-network',
+ brand_theme: 'both',
+ variants: ['branded'],
+ },
+ supported_services: {
+ rpc: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ firehose: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ substreams: {
+ beta_released_at: '2024-08-01T00:00:000Z',
+ full_released_at: null,
+ deprecated_at: null,
+ },
+ },
+ testnets: [],
+ consensus: [],
+ evms: [],
+ metadata: {
+ layer: 'L2',
+ website: 'https://zora.co/',
+ },
+};
+
+export default meta;
diff --git a/data/chains/V2/zora/zora.branded.svg b/data/chains/V2/zora/zora.branded.svg
new file mode 100644
index 0000000..f0a60e0
--- /dev/null
+++ b/data/chains/V2/zora/zora.branded.svg
@@ -0,0 +1,13 @@
+
diff --git a/data/index.config.ts b/data/index.config.ts
new file mode 100644
index 0000000..0dd88f3
--- /dev/null
+++ b/data/index.config.ts
@@ -0,0 +1,58 @@
+// This file is partially auto-generated.
+// Chains under ordered were manually placed, to manage the z-index (priority order) of chains.
+// Chains under missing are generated from available data, make sure to order them.
+// Include deprecated or future chains.
+// Last generation on 8/2/2024, 12:13:17 PM.
+
+export default {
+ ordered: {
+ eth: [
+ 'holesky',
+ 'sepolia',
+ 'eth-cl',
+ 'holesky-cl',
+ 'sepolia-cl',
+ 'goerli',
+ 'goerli-cl',
+ ],
+ bitcoin: [],
+ polygon: ['amoy', 'mumbai'],
+ bsc: ['chapel'],
+ arbone: ['arbgoerli', 'arbsepolia', 'chiado-cl', 'chiado'],
+ avalanche: [],
+ optimism: [],
+ base: [],
+ near: ['neartest'],
+ cardano: [],
+ decimal: [],
+ gnosis: ['gnosis-cl'],
+ fantom: [],
+ celo: ['alfajores'],
+ arweave: [],
+ cosmoshub: ['theta', 'juno'],
+ osmosis: [],
+ moonbeam: [],
+ scroll: [],
+ starknet: [],
+ eos: ['eosevm', 'jungle4', 'kylin'],
+ wax: ['waxtest'],
+ telos: ['telostest'],
+ kava: [],
+ blast: ['blastsepolia'],
+ boba: ['bobasepolia'],
+ cronos: [],
+ fuse: [],
+ linea: [],
+ litecoin: [],
+ mode: [],
+ ronin: [],
+ sei: [],
+ xai: [],
+ zkastar: ['zkatana', 'zkyoto'],
+ 'x-layer': [],
+ zksync: [],
+ zora: [],
+ ore: ['orestage'],
+ },
+ missing: [],
+};
diff --git a/data/services.ts b/data/services.ts
new file mode 100644
index 0000000..16fd09d
--- /dev/null
+++ b/data/services.ts
@@ -0,0 +1,21 @@
+import { ServiceEndpoint } from '../types/service.types';
+
+const services: Array = [
+ {
+ name: 'Substreams',
+ endpoint_slug: 'substreams',
+ port: 443,
+ },
+ {
+ name: 'Firehose',
+ endpoint_slug: 'firehose',
+ port: 443,
+ },
+ {
+ name: 'RPC',
+ endpoint_slug: 'rpc',
+ port: 443,
+ },
+];
+
+export default services;
diff --git a/docs/beta_chains.md b/docs/beta_chains.md
new file mode 100644
index 0000000..4864489
--- /dev/null
+++ b/docs/beta_chains.md
@@ -0,0 +1,5 @@
+# Beta Chains
+
+Beta chains are chains that are not yet officially supported by Pinax. These chains are not yet available in the Pinax UI, but endpoints are available for developers to use. These chains are typically requested to use by The Graph and while we do not productize them, we support them and they _**should**_ have the stability required by our contract with The Graph.
+
+We assume those are still risky to use on a production app.
\ No newline at end of file
diff --git a/docs/chain_icons.md b/docs/chain_icons.md
new file mode 100644
index 0000000..ad8bd35
--- /dev/null
+++ b/docs/chain_icons.md
@@ -0,0 +1,11 @@
+# Chain Icons
+
+For our chain icons, we use [Edge & Node's Token Icons library](https://tokenicons.io/). The library is a collection of SVG icons for various blockchain tokens and chains. The library is available on [GitHub](https://github.com/0xa3k5/token-icons), [NPM](https://www.npmjs.com/package/@token-icons/react) and [Figma](https://www.figma.com/community/file/1355517329090639687/token-icons-community).
+
+We wrote a script to leverage the library's metadata (in the final data.json generation script), to make sure that the chain icons are up-to-date with the latest changes.
+
+The [copy_token_icons.ts script](../scripts/generate/V2/copy_token_icons.ts) iterates through our supported chains and makes sure that every mainnet has its associated token-icons logos. The script will attempt to retrieve the `branded` and `mono` versions of the chains logo. It will then copy those over and with the mono version of the logo create the `dark` and `light` variants. For more information, please read [chain_icons.md](./chain_icons.md).
+
+If it can't find them, you'll receive an error and may need to provide an ID match in the script's code.
+
+See [copy_token_icons.ts](../scripts/generate/V2/copy_token_icons.ts) for more information.
\ No newline at end of file
diff --git a/docs/how_to_use.md b/docs/how_to_use.md
new file mode 100644
index 0000000..e78263e
--- /dev/null
+++ b/docs/how_to_use.md
@@ -0,0 +1,117 @@
+# How to Use the Chains Repository
+
+This file is the best place to learn everything there is to know about the chains repository! Feel free to use this as a quickstart guide or as a reference as you work inside the project.
+
+## Content
+
+- [Metadata Updates](#metadata-updates)
+ - [Adding a new chain](#adding-a-new-chain)
+ - [Updating an Existing Chain](#updating-an-existing-chain)
+ - [Deprecating a Chain](#deprecating-a-chain)
+- [Scripts](#scripts)
+ - [Script: Copy Token Icons](#script-copy-token-icons)
+ - [Script: Data Index](#script-data-index)
+ - [Script: Index Config Check](#script-index-config-check)
+ - [Script: Graph IDs Type](#script-graph-ids-type)
+ - [Script: Pinax IDs Type](#script-pinax-ids-type)
+- [Types](#types)
+ - [Typing & Updating Auto-Generated Types](#typing--updating-auto-generated-types)
+ - [Updating the Chain Type](#updating-the-chain-type)
+
+## Metadata Updates
+
+In this section, you'll learn all you need to update the chains metadata, to either add newly supported chains by Pinax, deprecated chains, etc.
+
+### Adding a new chain
+
+Adding a new chain is as simple as adding a new file under the `data/chains/V2` directory (we're deprecating V1). The folder structure should respect the following;
+
+```
+/data/chains/V2
+├── MAINNET_ID/
+│ ├── meta.ts # Metadata of the Mainnet
+│ ├── MAINNET_ID.branded.svg # Auto-generated Token-icons
+│ ├── MAINNET_ID.dark.svg
+│ ├── MAINNET_ID.light.svg
+│ ├── consensus/
+│ │ ├── TESTNET_ID/
+│ │ ├── meta.ts # Metadata of the consensus subnet (can be testnets)
+│ │ └── ...
+│ ├── evms/
+│ │ ├── EVM_ID/
+│ │ ├── meta.ts # Metadata of the EVM subnet
+│ │ └── ...
+│ ├── testnets/
+│ │ ├── TESTNET_ID/
+│ │ ├── meta.ts # Metadata of the testnet
+│ │ └── ...
+│ └──
+└── ...
+```
+
+The folders should be named after the chain's official Pinax ID and should contain the `meta.ts` file describing the chain. You may also like to read about [Beta Chains](./beta_chains.md).
+
+### Updating an Existing Chain
+
+To update an existing chain, you can simply open a PR with the changes you want to make to the chain's metadata.
+
+### Deprecating a Chain
+
+If a chain data stream is no longer supported, simply set the `deprecated_at` field as the date of the deprecation. This allows the different services to know when to stop supporting the chain, and enables us to keep track of the chains we've supported in the past for proper redirects and such.
+
+## Scripts
+
+As maintaining this huge list of chain can become challenging and repetitive, we've developed a few scripts to help automate certain tasks. You can review those scripts under the `/scripts` folder, but we'll summarize what they do here;
+
+### Generation Scripts
+
+Generation scripts use external data or project structure to extrapolate data to automate repetitive tasks.
+
+#### Script: Copy Token Icons
+
+This script iterates through our supported chains and makes sure that every mainnet has its associated token-icons logos. The script will attempt to retrieve the `branded` and `mono` versions of the chains logo. It will then copy those over and with the mono version of the logo create the `dark` and `light` variants. For more information, please read [chain_icons.md](./chain_icons.md).
+
+#### Script: Data Index
+
+This script maintains the index.ts file exporting all `meta.ts` from the `/data/chains/V2` folder (and nested folders), so we don't have to worry about unexported chains.
+
+#### Script: Index Config Check
+
+This script validates that every chain was placed in the `index.config.ts`, to be given a unique, prioritized index relative to other chains. If any chains are found in the `/data/chains/V2` folder but isn't configured in the `index.config.ts` file, it will throw an error and add those missing chains in the `missing` array of the file. For more info, please read [updating_indexes.md](./updating_indexes.md).
+
+#### Script: Graph IDs Type
+
+This script fetches The Graph endpoint of supported chains and updates our type definition for valid Graph network IDs. For more info, please read [retrieve_graph_ids.md](./retrieve_graph_ids.md).
+
+#### Script: Pinax IDs Type
+
+This script iterates through the files in the `/data/chains/V2` and updates our type definition for valid Pinax network IDs.
+
+
+#### Script Automation
+
+All of those scripts are defined in the `package.json`, so you can run them manually by using NPM commands. You may find that you need to need some scripts manually, one good example being `generate:type_pinaxid` and `generate:type_graphid` while adding new chains.
+
+But in most cases, you shouldn't have to worry to much about those scripts, they're run pre-commit, so everything _**should**_ update automagically, otherwise you'll receive errors explaning the steps that needs to be taken.
+
+### Verification Scripts
+
+For now, no verification script is implemented, but it would be a good idea to implement a script that can check our metadata against [Notion's Blockchain Service Matrix](https://www.notion.so/pinaxnetwork/bfec60491b1d48509980ef69e31e7651?v=93922339441443698c3ebc8a695b61bd) (or whatever chosen selected single-source-of-truth for Pinax-supported chains). The folder structure for such a script is already there, but the scripts would need to be implemented.
+
+## Types
+
+Core types are located under `/types/`. Make sure to review those files to familiarize yourself with the data format we enforce for mainnets and their subnets.
+
+### Typing & Updating Auto-Generated Types
+
+The chain files are in Typescript, so make sure to cast them to the appropriate type to get the proper validations (Chain, Testnet, Consensus).
+
+Also make sure to run the `npm run generate:type_pinaxid` and `npm run generate:data_json` commands to update the related types and index if you're encountering any ID type issue there.
+
+If you're unsure about the fields you need to fill, you can have a look at the [Chain Type](/types/chain.types.ts) to learn more about the fields you need to fill.
+
+### Updating the Chain Type
+
+If you want to add a new field to the chain type, you can simply open a PR with the changes you want to make to the chain type and make sure every chain's metadata is updated to include the new field if required.
+
+Removing a field from the chain type is not recommended, as it may break the metadata of the chains. If you want to remove a field, please open an issue to discuss it first.
\ No newline at end of file
diff --git a/docs/proposals/ops-product-sync.md b/docs/proposals/ops-product-sync.md
new file mode 100644
index 0000000..039896f
--- /dev/null
+++ b/docs/proposals/ops-product-sync.md
@@ -0,0 +1,109 @@
+# OPS-Product Sync
+
+## Summary
+
+This document is a proposal for syncing the OPS and Product teams. The goal is to ensure that the metadata of chains supported by Pinax products is up-to-date and accurate. This process is crucial in ensuring that the product team has the necessary information to maintain the products.
+
+> WIP: This document is a work in progress and is subject to change.
+>
+> exact schedule for blockchain to be deployed exists
+There are different sources
+Jonathan prioritizes chains on 'easy' wins
+YAML/JSON doesn't mean its ready
+>
+> -->> Once a blockchain is ready, DNS record (another yaml file in repo) <<--
+Doesn't mean blockchain is backuped, stable, etc. Maybe OK for use by The Graph.
+>
+> Automation might not be as straightforward
+>
+> Requirements for The Graph are different than requirements from public use.
+>
+> Fully operationnal chains tracked in Google Sheets
+>
+> Sajjad handles backups
+
+## Background
+
+The OPS team maintains a private list (in a YAML file in the OPS Github organization) of chains supported or to-be-supported by Pinax. This list needs to be maintained as it triggers a series of automations on the ops side.
+
+The Product team maintains this repository, which acts as the single-source-of-truth for Pinax products. It contains extra metadata that is not present in the OPS list, such as chain icons, __chain services__, and other product-specific information.
+
+Those two lists are already necessary for their respective teams.
+
+The OPS team also maintains a Notion page on The Graph's side, which contains the list of chains supported by Pinax products.
+
+### Data duplication
+
+To further avoid maintaining the same data in two different places, here's the data that each team currently maintains. It would be beneficial to understand which team is responsible for which piece of data.
+
+#### OPS Team
+
+##### Chain Metadata
+
+```json
+{
+ "status": "TBD"
+}
+```
+
+##### The Graph Notion Page
+
+TBD
+
+#### Product Team
+
+```json
+{
+ "id": "eth",
+ "graph_id": "mainnet",
+ "name": "Ethereum",
+ "alt_names": [],
+ "index": 0,
+ "standard": "erc20",
+ "block_type": {
+ "label": "sf.ethereum.type.v2.Block",
+ "url": "https://buf.build/streamingfast/firehose-ethereum/docs/main:sf.ethereum.type.v2"
+ },
+ "icon": {
+ "id": "networks/ethereum",
+ "brand_theme": "both",
+ "variants": [
+ "branded",
+ "mono"
+ ]
+ },
+ "supported_services": {
+ "firehose": {
+ "released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "substreams": {
+ "released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ },
+ "rpc": {
+ "released_at": "2023-12-01T00:00:00.000Z",
+ "deprecated_at": null
+ }
+ },
+ "testnets": [
+ // Array of simplified chain objects
+ ],
+ "consensus": [
+ // Array of simplified chain objects
+ ],
+ "evms": [
+ // Array of simplified chain objects
+ ],
+ }
+```
+
+## Proposal
+
+The proposal is for the OPS team to expose the metadata of chains supported by Pinax products as a public endpoint.
+
+The OPS team will maintain the private list as they do now and a GitHub Action, which will automatically update the public endpoint's data.
+
+The Product team can then leverage the public endpoint and Github Actions on their side too.
+
+Depending on the data the OPs team can provide and if The Graph accepts it, the Product team could work on an automated alternative to the current manual process of updating the Notion page.
\ No newline at end of file
diff --git a/docs/retrieve_graph_ids.md b/docs/retrieve_graph_ids.md
new file mode 100644
index 0000000..2d0e074
--- /dev/null
+++ b/docs/retrieve_graph_ids.md
@@ -0,0 +1,33 @@
+# Retrieve The Graph Chain IDs
+
+This process is useful to add a supported chain to the app, as we need to make sure that the chain is available on The Graph to provide a valid TOML quickstart config. GraphID type is automatically updated on pre-commit, so in most cases you don't need to worry about it.
+
+In the case that the chain is not available on The Graph, we set its `graph_id` to null, so that the TOML config shows `This chain is not supported by The Graph Network`.
+
+## Steps to retrieve The Graph Chain IDs
+
+**OPTION A: Run `npm run fetch-graph-ids` in the project**
+
+1. Clone the repository
+2. At the root of the project, run `npm run fetch-graph-ids`
+
+**OPTION B: CURL**
+
+1. Fetch The Graph Supported Chains
+ - **Option A**: Install [JQ](https://jqlang.github.io/jq/) and run cURL command `curl -X POST -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0", "method": "chain_list", "id": 1 }' https://api.studio.thegraph.com/deploy | jq`
+ - **Option B**: Use your favorite HTTP Client to retrieve it:
+ ```json
+ {
+ "url": "https://api.studio.thegraph.com/deploy",
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "body": {
+ "jsonrpc": "2.0",
+ "method": "chain_list",
+ "id": 1
+ }
+ }
+ ```
+2. See if you can find a chain ID matching the chain you are adding to the app under "hostedService"
+3. If you can't find any matching ID, the added chain will have `graph_id: null`, otherwise the chain ID
\ No newline at end of file
diff --git a/docs/updating_dependent_products.md b/docs/updating_dependent_products.md
new file mode 100644
index 0000000..ea94871
--- /dev/null
+++ b/docs/updating_dependent_products.md
@@ -0,0 +1,8 @@
+# Updating Dependent Products
+
+To update the dependent products, you simply need to publish a new version of the package and update those products to use the latest version.
+
+To keep things in sync, make sure to update ALL of the following products at the same time:
+
+- [App](https://github.com/pinax-network/app-frontend)
+- [Website](https://github.com/pinax-network/website-frontend)
\ No newline at end of file
diff --git a/docs/updating_indexes.md b/docs/updating_indexes.md
new file mode 100644
index 0000000..45c3be5
--- /dev/null
+++ b/docs/updating_indexes.md
@@ -0,0 +1,3 @@
+# Updating Indexes
+
+To display the chains in the UI, each chain has an index score that is used to sort the chains. To reorganize the chains, you can update the [index.config.ts](../data/index.config.ts) file. Indexes are given in ascending order.
\ No newline at end of file
diff --git a/index.ts b/index.ts
index 31dd3fb..98bfbdc 100644
--- a/index.ts
+++ b/index.ts
@@ -1,3 +1,5 @@
-import * as data from './data';
+import * as services from './data/services';
+import * as types from './types';
import * as utils from './utils';
-export default { data, utils };
+
+export default { services, types, utils };
diff --git a/package-lock.json b/package-lock.json
index b38c611..d2bedb9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,59 +1,6659 @@
{
"name": "@pinax/chains",
- "version": "1.1.19",
+ "version": "2.0.5-rc1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@pinax/chains",
- "version": "1.1.19",
+ "version": "2.0.5-rc1",
"devDependencies": {
+ "@token-icons/core": "^2.8.2",
+ "@types/bun": "latest",
+ "@types/jest": "^29.5.12",
"husky": "^9.0.11",
- "prettier": "^3.2.5"
+ "jest": "^29.7.0",
+ "prettier": "^3.2.5",
+ "ts-morph": "^22.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "^5.4.4"
}
},
- "node_modules/husky": {
- "version": "9.0.11",
- "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz",
- "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==",
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
"dev": true,
- "bin": {
- "husky": "bin.mjs"
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
- "node": ">=18"
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+ "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.24.7",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz",
+ "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz",
+ "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.9",
+ "@babel/helper-compilation-targets": "^7.24.8",
+ "@babel/helper-module-transforms": "^7.24.9",
+ "@babel/helpers": "^7.24.8",
+ "@babel/parser": "^7.24.8",
+ "@babel/template": "^7.24.7",
+ "@babel/traverse": "^7.24.8",
+ "@babel/types": "^7.24.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"funding": {
- "url": "https://github.com/sponsors/typicode"
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
}
},
- "node_modules/prettier": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
- "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
+ "node_modules/@babel/generator": {
+ "version": "7.24.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz",
+ "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.24.9",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz",
+ "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.24.8",
+ "@babel/helper-validator-option": "^7.24.8",
+ "browserslist": "^4.23.1",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+ "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+ "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+ "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+ "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz",
+ "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+ "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+ "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+ "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+ "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+ "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz",
+ "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+ "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/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==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/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==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz",
+ "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==",
"dev": true,
"bin": {
- "prettier": "bin/prettier.cjs"
+ "parser": "bin/babel-parser.js"
},
"engines": {
- "node": ">=14"
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
},
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
- }
- },
- "dependencies": {
- "husky": {
- "version": "9.0.11",
- "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz",
- "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==",
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
+ "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
+ "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
+ "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz",
+ "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.8",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-hoist-variables": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/parser": "^7.24.8",
+ "@babel/types": "^7.24.8",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz",
+ "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
"dev": true
},
- "prettier": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
- "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "dev": true,
+ "dependencies": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dev": true,
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "dev": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@token-icons/core": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/@token-icons/core/-/core-2.8.2.tgz",
+ "integrity": "sha512-wK29YO8DJbFbbsfZd1mN1jxuDxBC/gZMJUpTtDzdk6afMY2O/3tsMC+k9Mt9/OYzOKg+4J3yy6vsqwaLwdN75w==",
+ "dev": true,
+ "peerDependencies": {
+ "typescript": "^5.0.0"
+ }
+ },
+ "node_modules/@ts-morph/common": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.23.0.tgz",
+ "integrity": "sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==",
+ "dev": true,
+ "dependencies": {
+ "fast-glob": "^3.3.2",
+ "minimatch": "^9.0.3",
+ "mkdirp": "^3.0.1",
+ "path-browserify": "^1.0.1"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/bun": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.1.2.tgz",
+ "integrity": "sha512-pRBDD3EDqPf83qe95i3EpYu5G2J8bbb78a3736vnCm2K8YWtEE5cvJUq2jkKvJhW07YTfQtbImywIwRhWL8z3Q==",
+ "dev": true,
+ "dependencies": {
+ "bun-types": "1.1.8"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "29.5.12",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz",
+ "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==",
+ "dev": true,
+ "dependencies": {
+ "expect": "^29.0.0",
+ "pretty-format": "^29.0.0"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.12.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz",
+ "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.10",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
+ "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.32",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+ "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+ "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-import-meta": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-top-level-await": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.23.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+ "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001640",
+ "electron-to-chromium": "^1.4.820",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.1.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/bun-types": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.8.tgz",
+ "integrity": "sha512-dwhfuUKSGK8hm5Llcvb5+ejRh+4mIt8ibObJVKhZBsi0ScpXmt+AlaS1eDW6uRXCHj084Qt0kIqAJ08/7ZGC9Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "~20.12.8",
+ "@types/ws": "~8.5.10"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001642",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz",
+ "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "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/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz",
+ "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==",
+ "dev": true
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/code-block-writer": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.1.tgz",
+ "integrity": "sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==",
+ "dev": true
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "dev": true
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.829",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz",
+ "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==",
+ "dev": true
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "9.0.11",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.mjs"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "dev": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
+ "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "dev": true,
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "dev": true,
+ "dependencies": {
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "dev": true,
+ "dependencies": {
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz",
+ "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "dev": true
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.2.5",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ]
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "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"
+ }
+ ]
+ },
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/test-exclude/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-morph": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-22.0.0.tgz",
+ "integrity": "sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==",
+ "dev": true,
+ "dependencies": {
+ "@ts-morph/common": "~0.23.0",
+ "code-block-writer": "^13.0.1"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+ "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.2",
+ "picocolors": "^1.0.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+ "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.24.7",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz",
+ "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz",
+ "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.9",
+ "@babel/helper-compilation-targets": "^7.24.8",
+ "@babel/helper-module-transforms": "^7.24.9",
+ "@babel/helpers": "^7.24.8",
+ "@babel/parser": "^7.24.8",
+ "@babel/template": "^7.24.7",
+ "@babel/traverse": "^7.24.8",
+ "@babel/types": "^7.24.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.24.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz",
+ "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.24.9",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^2.5.1"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz",
+ "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.24.8",
+ "@babel/helper-validator-option": "^7.24.8",
+ "browserslist": "^4.23.1",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+ "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.24.7"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+ "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+ "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.24.7"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+ "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+ "dev": true,
+ "requires": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz",
+ "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+ "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
+ "dev": true
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+ "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
+ "dev": true,
+ "requires": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+ "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.24.7"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+ "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+ "dev": true
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+ "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz",
+ "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.8"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+ "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/parser": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz",
+ "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==",
+ "dev": true
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
+ "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-typescript": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
+ "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ }
+ },
+ "@babel/template": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
+ "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz",
+ "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.8",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-hoist-variables": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/parser": "^7.24.8",
+ "@babel/types": "^7.24.8",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.24.9",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz",
+ "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ }
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true
+ },
+ "@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "dev": true,
+ "requires": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
+ }
+ },
+ "@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "dev": true,
+ "requires": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ }
+ },
+ "@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dev": true,
+ "requires": {
+ "jest-get-type": "^29.6.3"
+ }
+ },
+ "@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ }
+ },
+ "@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ }
+ },
+ "@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "dev": true,
+ "requires": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ }
+ },
+ "@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "requires": {
+ "@sinclair/typebox": "^0.27.8"
+ }
+ },
+ "@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ }
+ },
+ "@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ }
+ },
+ "@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "dev": true,
+ "requires": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ }
+ },
+ "@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dev": true,
+ "requires": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true
+ },
+ "@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "@token-icons/core": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/@token-icons/core/-/core-2.8.2.tgz",
+ "integrity": "sha512-wK29YO8DJbFbbsfZd1mN1jxuDxBC/gZMJUpTtDzdk6afMY2O/3tsMC+k9Mt9/OYzOKg+4J3yy6vsqwaLwdN75w==",
+ "dev": true,
+ "requires": {}
+ },
+ "@ts-morph/common": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.23.0.tgz",
+ "integrity": "sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==",
+ "dev": true,
+ "requires": {
+ "fast-glob": "^3.3.2",
+ "minimatch": "^9.0.3",
+ "mkdirp": "^3.0.1",
+ "path-browserify": "^1.0.1"
+ }
+ },
+ "@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@types/bun": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.1.2.tgz",
+ "integrity": "sha512-pRBDD3EDqPf83qe95i3EpYu5G2J8bbb78a3736vnCm2K8YWtEE5cvJUq2jkKvJhW07YTfQtbImywIwRhWL8z3Q==",
+ "dev": true,
+ "requires": {
+ "bun-types": "1.1.8"
+ }
+ },
+ "@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true
+ },
+ "@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "@types/jest": {
+ "version": "29.5.12",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz",
+ "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==",
+ "dev": true,
+ "requires": {
+ "expect": "^29.0.0",
+ "pretty-format": "^29.0.0"
+ }
+ },
+ "@types/node": {
+ "version": "20.12.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz",
+ "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==",
+ "dev": true,
+ "requires": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true
+ },
+ "@types/ws": {
+ "version": "8.5.10",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
+ "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/yargs": {
+ "version": "17.0.32",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+ "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.21.3"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "dev": true,
+ "requires": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ }
+ },
+ "babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "dependencies": {
+ "istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ }
+ }
+ }
+ },
+ "babel-plugin-jest-hoist": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ }
+ },
+ "babel-preset-current-node-syntax": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+ "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-import-meta": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-top-level-await": "^7.8.3"
+ }
+ },
+ "babel-preset-jest": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.23.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+ "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001640",
+ "electron-to-chromium": "^1.4.820",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.1.0"
+ }
+ },
+ "bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "requires": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "bun-types": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.8.tgz",
+ "integrity": "sha512-dwhfuUKSGK8hm5Llcvb5+ejRh+4mIt8ibObJVKhZBsi0ScpXmt+AlaS1eDW6uRXCHj084Qt0kIqAJ08/7ZGC9Q==",
+ "dev": true,
+ "requires": {
+ "@types/node": "~20.12.8",
+ "@types/ws": "~8.5.10"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001642",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz",
+ "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true
+ },
+ "cjs-module-lexer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz",
+ "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true
+ },
+ "code-block-writer": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.1.tgz",
+ "integrity": "sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==",
+ "dev": true
+ },
+ "collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true
+ },
+ "detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true
+ },
+ "diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.4.829",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz",
+ "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==",
+ "dev": true
+ },
+ "emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true
+ },
+ "expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
+ "requires": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ }
+ },
+ "fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "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",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "requires": {
+ "bser": "2.1.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "husky": {
+ "version": "9.0.11",
+ "dev": true
+ },
+ "import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
+ "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
+ "dev": true,
+ "requires": {
+ "hasown": "^2.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "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==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true
+ },
+ "istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "dev": true,
+ "requires": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ }
+ },
+ "jest-changed-files": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "dev": true,
+ "requires": {
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ }
+ },
+ "jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ }
+ },
+ "jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "dev": true,
+ "requires": {
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
+ }
+ },
+ "jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ }
+ },
+ "jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "dev": true,
+ "requires": {
+ "detect-newline": "^3.0.0"
+ }
+ },
+ "jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
+ }
+ },
+ "jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ }
+ },
+ "jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "dev": true
+ },
+ "jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "fsevents": "^2.3.2",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
+ }
+ },
+ "jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "dev": true,
+ "requires": {
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ }
+ },
+ "jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ }
+ },
+ "jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ }
+ },
+ "jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ }
+ },
+ "jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "requires": {}
+ },
+ "jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "dev": true
+ },
+ "jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "dev": true,
+ "requires": {
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
+ }
+ },
+ "jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ }
+ },
+ "jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ }
+ },
+ "jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true
+ }
+ }
+ },
+ "jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true
+ }
+ }
+ },
+ "jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "dev": true,
+ "requires": {
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
+ }
+ },
+ "jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true
+ },
+ "kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true
+ },
+ "leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true
+ },
+ "lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "requires": {
+ "semver": "^7.5.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true
+ }
+ }
+ },
+ "makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "requires": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ },
+ "mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz",
+ "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ }
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "requires": {
+ "@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"
+ }
+ },
+ "path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "prettier": {
+ "version": "3.2.5",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "requires": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "requires": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "dev": true
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
+ "react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "resolve.exports": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
+ "dev": true
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^2.0.0"
+ }
+ },
+ "string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "requires": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "ts-morph": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-22.0.0.tgz",
+ "integrity": "sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==",
+ "dev": true,
+ "requires": {
+ "@ts-morph/common": "~0.23.0",
+ "code-block-writer": "^13.0.1"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true
+ },
+ "typescript": {
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "peer": true
+ },
+ "undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "update-browserslist-db": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+ "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.2",
+ "picocolors": "^1.0.1"
+ }
+ },
+ "v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ }
+ },
+ "walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "requires": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true
}
}
diff --git a/package.json b/package.json
index 8c6d728..871851d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@pinax/chains",
- "version": "1.1.25",
+ "version": "2.0.6",
"description": "Single-source-of-truth for the metadata of chains supported by Pinax.",
"keywords": [
"chains",
@@ -8,27 +8,45 @@
"ssot"
],
"author": "Dominic ",
- "main": "data.json",
- "types": "data.d.ts",
+ "main": "data/chains/V2/data.json",
+ "types": "/types/index.ts",
"files": [
- "data.json",
- "data.d.ts",
- "types/**.ts"
+ "index.ts",
+ "/utils/**/**.ts",
+ "/types/**.ts",
+ "/data/services.ts",
+ "/data/chains/V1/chains.json",
+ "/data/chains/V2/chains.json"
],
"scripts": {
- "fetch-graph-ids": "node ./scripts/fetchGraphIDs.js",
+ "fetch-graph-ids": "bun ./scripts/fetchGraphIDs.ts",
"format": "prettier --log-level warn --write \"./**/*.{js,jsx,ts,tsx}\"",
- "generate": "npm run generate:data",
- "generate:data": "node ./scripts/generate/data_json.js",
- "generate:types": "npm run generate:type_graphid && npm run generate:type_pinaxid && npm run format",
- "generate:type_graphid": "node ./scripts/generate/type_graphid.js",
- "generate:type_pinaxid": "node ./scripts/generate/type_pinaxid.js",
- "test": "echo \"Error: no test specified\" && exit 1",
+ "generate": "bun run generate:data && bun run generate:types && bun run generate:copy_token_icons",
+ "generate:data": "bun run generate:data_index && bun run generate:index_config && bun run generate:data_json",
+ "generate:index_config": "bun ./scripts/generate/V2/index_config_check.ts",
+ "generate:data_index": "bun ./scripts/generate/V2/data_index.ts",
+ "generate:data_json": "bun ./scripts/generate/V2/data_json.ts",
+ "generate:types": "bun run generate:type_graphid && bun run generate:type_pinaxid && bun run format",
+ "generate:type_graphid": "bun ./scripts/generate/V2/type_graphid.ts",
+ "generate:type_pinaxid": "bun ./scripts/generate/V2/type_pinaxid.ts",
+ "generate:copy_token_icons": "bun ./scripts/generate/V2/copy_token_icons.ts",
+ "verify:match_legacy_check": "bun ./scripts/verify/V2/match_legacy_data.ts",
+ "generate_v1": "npm run generate_v1:data",
+ "generate_v1:data": "node ./scripts/generate/V1/data_json.js",
+ "generate_v1:types": "npm run generate_v1:type_graphid && npm run generate_v1:type_pinaxid && npm run format",
+ "generate_v1:type_graphid": "node ./scripts/generate/V1/type_graphid.js",
+ "generate_v1:type_pinaxid": "node ./scripts/generate/V1/type_pinaxid.js",
+ "test": "bun test",
"prepare": "husky"
},
"devDependencies": {
+ "@token-icons/core": "^2.8.2",
+ "@types/bun": "latest",
+ "@types/jest": "^29.5.12",
"husky": "^9.0.11",
- "prettier": "^3.2.5"
+ "jest": "^29.7.0",
+ "prettier": "^3.2.5",
+ "ts-morph": "^22.0.0"
},
"repository": {
"type": "git",
@@ -37,5 +55,8 @@
"homepage": "https://github.com/pinax-network/chains#readme",
"bugs": {
"url": "https://github.com/pinax-network/chains/issues"
+ },
+ "peerDependencies": {
+ "typescript": "^5.4.4"
}
}
diff --git a/scripts/fetchGraphIDs.js b/scripts/fetchGraphIDs.js
deleted file mode 100644
index 864da5d..0000000
--- a/scripts/fetchGraphIDs.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const fetchGraphIDs = () => {
- console.log('Fetching graph IDs...');
- fetch('https://api.studio.thegraph.com/deploy', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- jsonrpc: '2.0',
- method: 'chain_list',
- id: 1,
- }),
- })
- .then((res) => res.json())
- .then((res) => {
- let graphIds = res.result.studio;
- console.log(graphIds.sort((a, b) => (a < b ? -1 : 1)));
- });
-};
-
-fetchGraphIDs();
diff --git a/scripts/fetchGraphIDs.ts b/scripts/fetchGraphIDs.ts
new file mode 100644
index 0000000..5b2f0aa
--- /dev/null
+++ b/scripts/fetchGraphIDs.ts
@@ -0,0 +1,26 @@
+import bun from 'bun';
+
+const fetchGraphIDs = async (): Promise => {
+ console.log('Fetching graph IDs...');
+ try {
+ const res = await fetch('https://api.studio.thegraph.com/deploy', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ jsonrpc: '2.0',
+ method: 'chain_list',
+ id: 1,
+ }),
+ });
+
+ const data = await res.json();
+ let graphIds = data.result.studio;
+ console.log(graphIds.sort((a: string, b: string) => (a < b ? -1 : 1)));
+ } catch (error) {
+ console.error('Error fetching graph IDs:', error);
+ }
+};
+
+fetchGraphIDs();
diff --git a/scripts/generate/data_json.js b/scripts/generate/V1/data_json.js
similarity index 73%
rename from scripts/generate/data_json.js
rename to scripts/generate/V1/data_json.js
index d39e6db..4bd1e47 100644
--- a/scripts/generate/data_json.js
+++ b/scripts/generate/V1/data_json.js
@@ -2,7 +2,7 @@ const fs = require('fs');
const path = require('path');
// Define the directory containing the JSON files
-const directoryPath = path.join(__dirname, '../..//data/chains');
+const directoryPath = path.join(__dirname, '../../../data/chains/V1');
// Read the directory
fs.readdir(directoryPath, (err, files) => {
@@ -14,6 +14,9 @@ fs.readdir(directoryPath, (err, files) => {
// Loop through all the files in the directory
files.forEach((file) => {
+ // Skip the chains.json file
+ if (file === 'chains.json') return;
+
// Only process .json files
if (path.extname(file) === '.json') {
// Read the JSON file
@@ -24,5 +27,8 @@ fs.readdir(directoryPath, (err, files) => {
});
// Write the combined data to a new JSON file
- fs.writeFileSync(path.join('./', 'data.json'), JSON.stringify(data, null, 2));
+ fs.writeFileSync(
+ path.join(directoryPath, 'chains.json'),
+ JSON.stringify(data, null, 2),
+ );
});
diff --git a/scripts/generate/type_graphid.js b/scripts/generate/V1/type_graphid.js
similarity index 100%
rename from scripts/generate/type_graphid.js
rename to scripts/generate/V1/type_graphid.js
diff --git a/scripts/generate/type_pinaxid.js b/scripts/generate/V1/type_pinaxid.js
similarity index 100%
rename from scripts/generate/type_pinaxid.js
rename to scripts/generate/V1/type_pinaxid.js
diff --git a/scripts/generate/V2/copy_token_icons.ts b/scripts/generate/V2/copy_token_icons.ts
new file mode 100644
index 0000000..caa00a7
--- /dev/null
+++ b/scripts/generate/V2/copy_token_icons.ts
@@ -0,0 +1,190 @@
+// Run after `npm run generate:data`
+import fs from 'fs';
+import path from 'path';
+
+interface Icon {
+ id: string;
+ variants: string[];
+}
+
+interface Network {
+ id: string;
+ icon: Icon;
+}
+
+interface Token {
+ id: string;
+ symbol: string;
+ variants: string[];
+}
+
+// Define the source directories and files
+const tokenIconDistDir: string = './node_modules/@token-icons/core/dist';
+const tokenIconMetaDir: string = `${tokenIconDistDir}/metadata`;
+const tokenIconNetworksMetaPath: string = `${tokenIconMetaDir}/networks.json`;
+const tokenIconTokensMetaPath: string = `${tokenIconMetaDir}/tokens.json`;
+const tokenIconNetworkSvgsDir: string = `${tokenIconDistDir}/svgs/networks`;
+const tokenIconTokenSvgsDir: string = `${tokenIconDistDir}/svgs/tokens`;
+
+// Define the destination directory for the icons
+const destDir = (chainID: string) => `./data/chains/V2/${chainID}`;
+
+// Read and parse the chains.json file
+const chains = JSON.parse(
+ fs.readFileSync('./data/chains/V2/chains.json', 'utf-8'),
+);
+
+const tiUnavailableIcons = [
+ // Those icons are not available in Token Icons
+ 'networks/ore',
+];
+
+// Token Icon Exceptions, where metadata ID
+// does not match the SVG ID
+const tiExceptions = [
+ ['networks/optimistic-ethereum', 'optimism'],
+ ['networks/binance-smart-chain', 'binance-smart-chain'], // Don't split at hyphen for bsc
+ ['networks/polygon-pos', 'polygon'],
+ ['networks/zora-network', 'zora'],
+ ['networks/x-layer', 'x-layer'], // Don't split at hyphen for x-layer
+];
+
+const iconIsUnavailable = (iconId: string) => {
+ return tiUnavailableIcons.includes(iconId);
+};
+
+const tokens: Token[] = JSON.parse(
+ fs.readFileSync(path.resolve(tokenIconTokensMetaPath), 'utf8'),
+);
+
+const networks: Network[] = JSON.parse(
+ fs.readFileSync(path.resolve(tokenIconNetworksMetaPath), 'utf8'),
+);
+
+const matchMetaToSVGIDs = (metaIconID: string, exceptions: string[][]) => {
+ // Find if metaIconID is in exceptions
+ const exception = tiExceptions.find(([id]) => id === metaIconID);
+
+ // If it is, return the second element of the exception array
+ if (exception) {
+ return exception[1];
+ }
+
+ // If it's not in exceptions, split at '/' and '-' and return the first element after the split
+ return metaIconID.split('/')[1].split('-')[0];
+};
+
+const checkIconMetaForChain = (chain: any) => {
+ if (!chain.icon) {
+ // Ignore chains without icons (typically subnets)
+ return;
+ }
+
+ if (iconIsUnavailable(chain.icon.id)) {
+ return;
+ }
+
+ if (chain.icon.id.indexOf('tokens') !== -1) {
+ const iconMeta = tokens.find(
+ (token) => token.symbol === chain.icon.id.split('/')[1],
+ );
+ if (iconMeta) {
+ chain.icon.variants = iconMeta.variants;
+ } else {
+ const warnMsg = `⚠️ Could not find icon meta for '${chain.icon.id}'`;
+ warnings.push(`(${warnings.length + 1}) ${warnMsg}`);
+ }
+ } else {
+ const iconMeta = networks.find(
+ (network) => network.id === chain.icon.id.split('/')[1],
+ );
+ if (iconMeta) {
+ // @ts-ignore
+ chain.icon.variants = iconMeta.variants;
+ } else {
+ const warnMsg = `⚠️ Could not find icon meta for '${chain.icon.id}'`;
+ warnings.push(`(${warnings.length + 1}) ${warnMsg}`);
+ }
+ }
+};
+
+const warnings: string[] = [];
+
+console.log('🕑 Copying chain icons from token-icons...');
+
+// Iterate over each chain
+for (const chain of chains) {
+ checkIconMetaForChain(chain);
+
+ const iconBasePath: string =
+ chain.icon.id.split('/')[0] === 'networks'
+ ? tokenIconNetworkSvgsDir
+ : tokenIconTokenSvgsDir;
+
+ // Define the paths to the icon variants
+ const brandedIconPath: string = path.join(
+ iconBasePath,
+ 'branded',
+ `${matchMetaToSVGIDs(chain.icon.id, tiExceptions)}.svg`,
+ );
+ const monoIconPath: string = path.join(
+ iconBasePath,
+ 'mono',
+ `${matchMetaToSVGIDs(chain.icon.id, tiExceptions)}.svg`,
+ );
+
+ // Define the destination file paths
+ const destBrandedIconPath: string = path.join(
+ destDir(chain.id),
+ `${chain.id}.branded.svg`,
+ );
+ const destLightIconPath: string = path.join(
+ destDir(chain.id),
+ `${chain.id}.light.svg`,
+ );
+ const destDarkIconPath: string = path.join(
+ destDir(chain.id),
+ `${chain.id}.dark.svg`,
+ );
+
+ if (chain.icon.variants.includes('branded')) {
+ // Copy the branded icon to the destination directory
+ if (fs.existsSync(brandedIconPath)) {
+ fs.copyFileSync(brandedIconPath, destBrandedIconPath);
+ } else {
+ if (!iconIsUnavailable(chain.icon.id)) {
+ console.log(brandedIconPath);
+ const warnMsg = `⚠️ Branded icon not found for ${chain.id}`;
+ warnings.push(`(${warnings.length + 1}) ${warnMsg}`);
+ }
+ }
+ }
+
+ if (chain.icon.variants.includes('mono')) {
+ if (fs.existsSync(monoIconPath)) {
+ // Create the light icon by replacing '#fff' with '#fffffe' in the mono icon
+ let monoIconContent = fs.readFileSync(monoIconPath, 'utf-8');
+ let lightIconContent = monoIconContent.replace(/#fff/g, '#fffffe');
+ fs.writeFileSync(destLightIconPath, lightIconContent);
+
+ // Create the dark icon by replacing '#fff' with '#000001' in the mono icon
+ monoIconContent = fs.readFileSync(monoIconPath, 'utf-8');
+ let darkIconContent = monoIconContent.replace(/#fff/g, '#000001');
+ fs.writeFileSync(destDarkIconPath, darkIconContent);
+ } else {
+ if (!iconIsUnavailable(chain.icon.id)) {
+ const warnMsg = `⚠️ Mono icon not found for ${chain.id}`;
+ warnings.push(`(${warnings.length + 1}) ${warnMsg}`);
+ }
+ }
+ }
+}
+
+if (warnings.length) {
+ console.log(warnings.join('\n'));
+ console.log(
+ `☑️ Copied chain icons from token-icons with ${warnings.length} warnings.`,
+ );
+} else {
+ console.log(`✅ Successfully copied chain icons from token-icons!`);
+}
diff --git a/scripts/generate/V2/data_index.ts b/scripts/generate/V2/data_index.ts
new file mode 100644
index 0000000..16db0dc
--- /dev/null
+++ b/scripts/generate/V2/data_index.ts
@@ -0,0 +1,43 @@
+import fs from 'fs';
+import path from 'path';
+import { toCamelCase } from '../../../utils/case';
+
+console.log('🕑 Generating data index...');
+
+const dataDir = path.join(__dirname, '../../../', 'data/chains/V2');
+let indexContent = '';
+
+// Generate the GraphId type definition
+const indexGeneratedComment = `// This file is auto-generated on pre-commit to avoid maintaining it.\n// Do not modify manually as it will be overwritten.\n// Last generation on ${new Date().toLocaleString()}.\n\n`;
+
+indexContent += indexGeneratedComment;
+
+fs.readdirSync(dataDir).forEach((mainnetDir) => {
+ // Ignore index.ts and chains.json files
+ if (mainnetDir === 'index.ts' || mainnetDir === 'chains.json') return;
+
+ const mainnetPath = path.join(dataDir, mainnetDir);
+ const mainnetMetaPath = path.join(mainnetPath, 'meta.ts');
+
+ if (fs.existsSync(mainnetMetaPath)) {
+ indexContent += `export { default as ${toCamelCase(mainnetDir)} } from './${mainnetDir}/meta';\n`;
+ }
+
+ ['testnets', 'consensus', 'evms'].forEach((subnetType) => {
+ const subnetPath = path.join(mainnetPath, subnetType);
+
+ if (fs.existsSync(subnetPath)) {
+ fs.readdirSync(subnetPath).forEach((subnetDir) => {
+ const subnetMetaPath = path.join(subnetPath, subnetDir, 'meta.ts');
+
+ if (fs.existsSync(subnetMetaPath)) {
+ indexContent += `export { default as ${toCamelCase(subnetDir)} } from './${mainnetDir}/${subnetType}/${subnetDir}/meta';\n`;
+ }
+ });
+ }
+ });
+});
+
+fs.writeFileSync(path.join(dataDir, 'index.ts'), indexContent);
+
+console.log('✅ Successfully generated data index!');
diff --git a/scripts/generate/V2/data_json.ts b/scripts/generate/V2/data_json.ts
new file mode 100644
index 0000000..59d797e
--- /dev/null
+++ b/scripts/generate/V2/data_json.ts
@@ -0,0 +1,64 @@
+import fs from 'fs';
+import path from 'path';
+import * as chainData from '../../../data/chains/V2/index';
+import { toCamelCase } from '../../../utils/case';
+import indexConf from '../../../data/index.config';
+import { IndexConfig } from './index_config_check';
+import { Chain, SupportedServices } from '../../../types';
+
+interface SubnetData {
+ id: string;
+ index: number;
+ supported_services: SupportedServices;
+}
+
+console.log('🕑 Generating data.json...');
+
+if (indexConf.missing.length > 0) {
+ console.log(
+ '⚠️ Missing chains detected. Please add them to the ./data/index.config.ts file.',
+ );
+ process.exit(1);
+}
+
+const data: Chain[] = [];
+
+let indexCounter = 0;
+
+Object.keys(indexConf.ordered).forEach((mainnet, mainnetIndex) => {
+ // @ts-ignore
+ const mainnetData: MainnetData = chainData[toCamelCase(mainnet)];
+
+ mainnetData.index = indexCounter++;
+
+ (indexConf as IndexConfig).ordered[mainnet].forEach((subnet: any) => {
+ // @ts-ignore
+ const subnetData: SubnetData = chainData[toCamelCase(subnet)];
+
+ subnetData.index = indexCounter++;
+
+ if (subnetData.id.indexOf('-cl') !== -1) {
+ if (!mainnetData.consensus) mainnetData.consensus = [];
+ mainnetData.consensus.push(subnetData);
+ } else if (subnetData.id.indexOf('evm') !== -1) {
+ if (!mainnetData.evms) mainnetData.evms = [];
+ mainnetData.evms.push(subnetData);
+ } else {
+ if (!mainnetData.testnets) mainnetData.testnets = [];
+ mainnetData.testnets.push(subnetData);
+ }
+ });
+ data.push(mainnetData);
+});
+
+const dataFolderPath = path.join(__dirname, '../../../data/chains/V2');
+if (!fs.existsSync(dataFolderPath)) {
+ fs.mkdirSync(dataFolderPath);
+}
+
+fs.writeFileSync(
+ path.join(dataFolderPath, 'chains.json'),
+ JSON.stringify(data, null, 2),
+);
+
+console.log(`✅ Successfully generated 'chains.json'!`);
diff --git a/scripts/generate/V2/index_config_check.ts b/scripts/generate/V2/index_config_check.ts
new file mode 100644
index 0000000..a6f5e1d
--- /dev/null
+++ b/scripts/generate/V2/index_config_check.ts
@@ -0,0 +1,67 @@
+import fs from 'fs';
+import path from 'path';
+import config from '../../../data/index.config';
+
+export type IndexConfig = {
+ ordered: { [key: string]: string[] };
+ missing?: string[];
+};
+
+console.log('🕑 Checking integrity of index.config.ts...');
+
+const configCast: IndexConfig = config;
+
+// Function to get directories recursively
+const getDirectories = (basePath: string, depth: number = 0): Array => {
+ const directories: Array = [];
+ const files = fs.readdirSync(basePath, { withFileTypes: true });
+
+ for (const file of files) {
+ if (file.isDirectory()) {
+ const dirPath = path.join(basePath, file.name);
+ if (depth === 0 || depth === 2) {
+ directories.push(dirPath.split(path.sep).pop() || '');
+ }
+
+ // Get subdirectories
+ const subdirectories: Array = getDirectories(dirPath, depth + 1);
+ directories.push(...subdirectories);
+ }
+ }
+
+ return directories;
+};
+
+// Get the list of directories under /data/chains/V2/
+const chainsPath = './data/chains/V2';
+const directories = getDirectories(chainsPath);
+
+// Get the list of chains already in the config file
+const existingChains = Object.keys(configCast.ordered);
+existingChains.forEach((chain: string) => {
+ if (configCast.ordered[chain].length > 0) {
+ existingChains.push(...configCast.ordered[chain]);
+ }
+});
+
+// Find the missing chains
+const missingChains = directories.filter(
+ (chain: string) => !existingChains.includes(chain),
+);
+
+// Add the missing chains
+configCast.missing = missingChains;
+
+// Notice for the generated file
+const fileGenerationNotive = `// This file is partially auto-generated.\n// Chains under ordered were manually placed, to manage the z-index (priority order) of chains.\n// Chains under missing are generated from available data, make sure to order them.\n// Include deprecated or future chains. \n// Last generation on ${new Date().toLocaleString()}.`;
+
+// Write the updated config back to the file
+fs.writeFileSync(
+ './data/index.config.ts',
+ [
+ fileGenerationNotive,
+ `export default ${JSON.stringify(config, null, 2)}`,
+ ].join('\n\n'),
+);
+
+console.log(`✅ Successfully checked index.config.ts integrity!`);
diff --git a/scripts/generate/V2/type_graphid.ts b/scripts/generate/V2/type_graphid.ts
new file mode 100644
index 0000000..5b5e697
--- /dev/null
+++ b/scripts/generate/V2/type_graphid.ts
@@ -0,0 +1,46 @@
+import fs from 'fs';
+import path from 'path';
+
+const typesDir = path.join(__dirname, '../../../types');
+const graphTypesFile = path.join(typesDir, 'graph.types.ts');
+
+console.log('🕑 Generating GraphID type...');
+
+const fetchGraphIDs = async (): Promise => {
+ try {
+ const res = await fetch('https://api.studio.thegraph.com/deploy', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ jsonrpc: '2.0',
+ method: 'chain_list',
+ id: 1,
+ }),
+ });
+
+ const data = await res.json();
+ let graphIds = data.result.studio;
+ let sortedGraphIds = graphIds.sort((a: string, b: string) =>
+ a < b ? -1 : 1,
+ );
+
+ // Generate the GraphId type definition
+ const graphIdType = `// This file is auto-generated on pre-commit to avoid maintaining it.\n// Do not modify manually as it will be overwritten.\n// Last generation on ${new Date().toLocaleString()}.\nexport type GraphID = '${sortedGraphIds.join("' | '")}'`;
+
+ // Write the GraphId type definition to the types directory
+ fs.writeFile(graphTypesFile, graphIdType, (err) => {
+ if (err) {
+ console.error('Error writing graph.types.ts file:', err);
+ return;
+ }
+
+ console.log('✅ Successfully generated GraphID type!');
+ });
+ } catch (error) {
+ console.error('Error fetching graph IDs:', error);
+ }
+};
+
+fetchGraphIDs();
diff --git a/scripts/generate/V2/type_pinaxid.ts b/scripts/generate/V2/type_pinaxid.ts
new file mode 100644
index 0000000..e11c620
--- /dev/null
+++ b/scripts/generate/V2/type_pinaxid.ts
@@ -0,0 +1,62 @@
+import fs from 'fs';
+import path from 'path';
+
+const chainsDir = path.join(__dirname, '../../../data');
+const typesDir = path.join(__dirname, '../../../types');
+
+const pinaxTypesFile = path.join(typesDir, 'pinax.types.ts');
+
+console.log('🕑 Generating PinaxID type...');
+
+// Function to recursively read directories and subdirectories
+function readDir(directory: string): string[] {
+ let fileNames: string[] = [];
+ const files = fs.readdirSync(directory);
+
+ files.forEach((file) => {
+ const filePath = path.join(directory, file);
+ const stats = fs.statSync(filePath);
+
+ if (stats.isDirectory()) {
+ // If the file is a directory, recursively read it
+ fileNames = fileNames.concat(readDir(filePath));
+ } else if (
+ path.extname(file) === '.ts' &&
+ path.basename(file) === 'meta.ts'
+ ) {
+ // If the file is a .ts file named meta.ts, add the directory name to the array
+ fileNames.push(path.basename(path.dirname(filePath)));
+ }
+ });
+
+ return fileNames;
+}
+
+// Read the directory and subdirectories
+const mainnetNames = readDir(chainsDir);
+
+// Read the subnets directories
+const subnetTypes = ['testnets', 'consensus', 'evms'];
+let subnetNames: string[] = [];
+subnetTypes.forEach((subnetType) => {
+ const subnetDir = path.join(chainsDir, subnetType);
+ if (fs.existsSync(subnetDir)) {
+ subnetNames = subnetNames.concat(readDir(subnetDir));
+ }
+});
+
+// Combine mainnet and subnet names
+const fileNames = mainnetNames.concat(subnetNames);
+
+// Generate the PinaxId type definition
+const pinaxIdType = `// This file is auto-generated on pre-commit to avoid maintaining it / circular dependencies.\n// Do not modify manually as it will be overwritten.\n// Last generation on ${new Date().toLocaleString()}.\nexport type PinaxID = '${fileNames.join("' | '")}'`;
+
+// Write the PinaxId type definition to the types directory
+fs.writeFile(pinaxTypesFile, pinaxIdType, (err) => {
+ if (err) {
+ console.error('Error writing pinax.types.ts file:', err);
+ return;
+ }
+
+ console.log('✅ Successfully generating PinaxID type!');
+});
diff --git a/scripts/verify/V2/match_legacy_data.ts b/scripts/verify/V2/match_legacy_data.ts
new file mode 100644
index 0000000..81684e3
--- /dev/null
+++ b/scripts/verify/V2/match_legacy_data.ts
@@ -0,0 +1,41 @@
+import fs from 'fs';
+
+// Read and parse the JSON files
+const dataLegacy = JSON.parse(
+ fs.readFileSync('./dist/data_legacy.json', 'utf8'),
+);
+const data = JSON.parse(fs.readFileSync('./dist/data.json', 'utf8'));
+
+// Create a new array for the missing chain IDs
+let missingChainIDs = [];
+
+// Iterate over the chains in data_legacy.json
+for (let legacyChain of dataLegacy) {
+ // Find the corresponding chain in data.json
+ let chain = data.find((c: any) => c.id === legacyChain.id);
+
+ // If the chain doesn't exist in data.json, check the mainnet of the chain
+ if (!chain) {
+ let mainnetChain = data.find((c: any) => c.id === legacyChain.mainnet);
+ if (mainnetChain) {
+ // Check both testnets and consensus arrays within that mainnet
+ if (
+ mainnetChain.testnets?.find((t: any) => t.id === legacyChain.id) !==
+ undefined
+ ) {
+ continue;
+ }
+ if (
+ mainnetChain.consensus?.find((c: any) => c.id === legacyChain.id) !==
+ undefined
+ ) {
+ continue;
+ }
+ }
+ // If the chain doesn't exist in data.json, add the legacy chain ID to the missingChainIDs array
+ missingChainIDs.push(legacyChain.id);
+ }
+}
+
+// Log the missing chain IDs
+console.log(missingChainIDs);
diff --git a/scripts/verify/V2/notion-diff/.gitignore b/scripts/verify/V2/notion-diff/.gitignore
new file mode 100644
index 0000000..7674fbb
--- /dev/null
+++ b/scripts/verify/V2/notion-diff/.gitignore
@@ -0,0 +1 @@
+input/
\ No newline at end of file
diff --git a/scripts/verify/V2/notion-diff/README.md b/scripts/verify/V2/notion-diff/README.md
new file mode 100644
index 0000000..16229c4
--- /dev/null
+++ b/scripts/verify/V2/notion-diff/README.md
@@ -0,0 +1,18 @@
+# Notion CSV Diff Tool
+
+This tool is used to compare the data that we have here against the Notion database that the broader team maintains. It is used to ensure that the data we have is up to date and accurate.
+
+## What it does
+
+- ✅ Show missing chains
+- ✅ Shows the different in service statuses
+
+## How to use
+
+1. Export the Blockchain Service Matrix CSV;
+ 1. Go on Notion [Blockchain Service Matrix](https://www.notion.so/pinaxnetwork/bfec60491b1d48509980ef69e31e7651?v=93922339441443698c3ebc8a695b61bd);
+ 1. Click on the three dots on the top right corner;
+ 1. Click on `Export`, and `Export` again (Markdown & CSV);
+1. Place the exported CSV in the `notion-diff/input` folder (only one file at a time);
+1. Run the script with `npm run notion-diff`;
+1. The script will output the differences between the data we have and the Notion database.
\ No newline at end of file
diff --git a/scripts/verify/V2/notion-diff/input/test.txt b/scripts/verify/V2/notion-diff/check_notion_csv_diff.ts
similarity index 100%
rename from scripts/verify/V2/notion-diff/input/test.txt
rename to scripts/verify/V2/notion-diff/check_notion_csv_diff.ts
diff --git a/tests/chain_exported.test.ts b/tests/chain_exported.test.ts
new file mode 100644
index 0000000..200676c
--- /dev/null
+++ b/tests/chain_exported.test.ts
@@ -0,0 +1,32 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById } from '../utils/chains';
+import indexConfig from '../data/index.config';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_exported', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ it('assert_every_indexconfig_chain_is_exported', () => {
+ const allChainIds = Object.values(indexConfig.ordered).flat();
+
+ allChainIds.forEach((chainId) => {
+ const chain = findChainById(chains, chainId);
+ expect(chain).toBeDefined();
+ expect(chain?.id).toBe(chainId);
+ });
+ });
+});
diff --git a/tests/chain_find_by_id.test.ts b/tests/chain_find_by_id.test.ts
new file mode 100644
index 0000000..f492c22
--- /dev/null
+++ b/tests/chain_find_by_id.test.ts
@@ -0,0 +1,51 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, hasChainFullBlockSupport } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_find_by_id', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_find_mainnet___returns_mainnet', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ expect(chain.id).toBe(chainID);
+ });
+
+ test('assert_find_testnet___returns_testnet', () => {
+ const chainID = 'holesky';
+ let chain = findChainById(chains, chainID) as Chain;
+ expect(chain.id).toBe(chainID);
+ });
+
+ test('assert_find_consensus_layer___returns_consensus_layer', () => {
+ const chainID = 'eth-cl';
+ let chain = findChainById(chains, chainID) as Chain;
+ expect(chain.id).toBe(chainID);
+ });
+
+ test('assert_find_evm___returns_evm', () => {
+ const chainID = 'eosevm';
+ let chain = findChainById(chains, chainID) as Chain;
+ expect(chain.id).toBe(chainID);
+ });
+
+ test('assert_find_non_existent___returns_undefined', () => {
+ const chainID = 'this_is_a_chain_id_that_does_not_exist';
+ let chain = findChainById(chains, chainID);
+ expect(chain).toBe(undefined);
+ });
+});
diff --git a/tests/chain_has_full_block.test.ts b/tests/chain_has_full_block.test.ts
new file mode 100644
index 0000000..3b52d6b
--- /dev/null
+++ b/tests/chain_has_full_block.test.ts
@@ -0,0 +1,39 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, hasChainFullBlockSupport } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_has_full_block', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_full_block_chain___returns_true', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(hasChainFullBlockSupport(chain)).toBe(true);
+ });
+
+ test('assert_partial_block_chain___returns_false', () => {
+ const chainID = 'bitcoin';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(hasChainFullBlockSupport(chain)).toBe(false);
+ });
+});
diff --git a/tests/chain_has_no_substreams_wo_firehose.test.ts b/tests/chain_has_no_substreams_wo_firehose.test.ts
new file mode 100644
index 0000000..7c8ba5c
--- /dev/null
+++ b/tests/chain_has_no_substreams_wo_firehose.test.ts
@@ -0,0 +1,30 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_has_no_substreams_wo_firehose', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ const hasDuplicates = (array: Array) => {
+ return new Set(array).size !== array.length;
+ };
+
+ test('assert_chain_services_are_valid', () => {
+ expect(
+ hasDuplicates(chains.map((chain) => chain.index) as Array),
+ ).toBe(false);
+ });
+});
diff --git a/tests/chain_is_consensus_layer.test.ts b/tests/chain_is_consensus_layer.test.ts
new file mode 100644
index 0000000..ce6711d
--- /dev/null
+++ b/tests/chain_is_consensus_layer.test.ts
@@ -0,0 +1,41 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, isChainConsensusLayer } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_is_consensus_layer', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_consensus_layer___returns_true', () => {
+ const chainID = 'eth-cl';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error(
+ 'Expected ' + chainID + ' Consensus Layer, but got ' + chain.id,
+ );
+ }
+ expect(isChainConsensusLayer(chain)).toBe(true);
+ });
+
+ test('assert_non_consensus_layer___returns_false', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ' Mainnet, but got ' + chain.id);
+ }
+ expect(isChainConsensusLayer(chain)).toBe(false);
+ });
+});
diff --git a/tests/chain_is_deprecated.test.ts b/tests/chain_is_deprecated.test.ts
new file mode 100644
index 0000000..7471343
--- /dev/null
+++ b/tests/chain_is_deprecated.test.ts
@@ -0,0 +1,48 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, isChainDeprecated } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_is_deprecated', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_deprecated_chain___returns_true', () => {
+ const chainID = 'goerli';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isChainDeprecated(chain)).toBe(true);
+ });
+
+ test('assert_supported_chain___returns_false', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isChainDeprecated(chain)).toBe(false);
+ });
+
+ test('assert_unsupported_chain___returns_false', () => {
+ const chainID = 'zksync';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isChainDeprecated(chain)).toBe(false);
+ });
+});
diff --git a/tests/chain_is_service_beta.test.ts b/tests/chain_is_service_beta.test.ts
new file mode 100644
index 0000000..9064242
--- /dev/null
+++ b/tests/chain_is_service_beta.test.ts
@@ -0,0 +1,57 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, isServiceBeta } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_is_service_beta', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_beta_service___returns_true', () => {
+ const chainID = 'mode';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceBeta(chain, 'rpc')).toBe(true);
+ });
+
+ test('assert_supported_service___returns_false', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceBeta(chain, 'rpc')).toBe(false);
+ });
+
+ test('assert_deprecated_service___returns_false', () => {
+ const chainID = 'goerli';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceBeta(chain, 'firehose')).toBe(false);
+ });
+
+ test('assert_unsupported_chain___returns_false', () => {
+ const chainID = 'zksync';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceBeta(chain, 'firehose')).toBe(false);
+ });
+});
diff --git a/tests/chain_is_service_deprecated.test.ts b/tests/chain_is_service_deprecated.test.ts
new file mode 100644
index 0000000..aa0ab88
--- /dev/null
+++ b/tests/chain_is_service_deprecated.test.ts
@@ -0,0 +1,48 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, isServiceDeprecated } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_is_service_deprecated', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_deprecated_service___returns_true', () => {
+ const chainID = 'goerli';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceDeprecated(chain, 'substreams')).toBe(true);
+ });
+
+ test('assert_supported_service___returns_false', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceDeprecated(chain, 'rpc')).toBe(false);
+ });
+
+ test('assert_unsupported_service___returns_false', () => {
+ const chainID = 'zksync';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceDeprecated(chain, 'firehose')).toBe(false);
+ });
+});
diff --git a/tests/chain_is_service_supported.test.ts b/tests/chain_is_service_supported.test.ts
new file mode 100644
index 0000000..1ce8d79
--- /dev/null
+++ b/tests/chain_is_service_supported.test.ts
@@ -0,0 +1,48 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, isServiceSupported } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_is_service_supported', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_supported_service___returns_true', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceSupported(chain, 'rpc')).toBe(true);
+ });
+
+ test('assert_deprecated_service___returns_false', () => {
+ const chainID = 'goerli';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceSupported(chain, 'firehose')).toBe(false);
+ });
+
+ test('assert_unsupported_chain___returns_false', () => {
+ const chainID = 'zksync';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isServiceSupported(chain, 'firehose')).toBe(false);
+ });
+});
diff --git a/tests/chain_is_supported.test.ts b/tests/chain_is_supported.test.ts
new file mode 100644
index 0000000..5279b31
--- /dev/null
+++ b/tests/chain_is_supported.test.ts
@@ -0,0 +1,48 @@
+import fs from 'fs';
+import path from 'path';
+import { Chain } from '../types';
+import { findChainById, isChainSupported } from '../utils/chains';
+
+const setup = (): Array => {
+ // read the data file as JSON
+ const chainsFile = path.join(__dirname, '../', 'data/chains/V2/chains.json');
+ if (fs.existsSync(chainsFile)) {
+ const chains = JSON.parse(fs.readFileSync(chainsFile, 'utf8'));
+ return chains;
+ }
+ return [];
+};
+
+describe('chain_is_supported', () => {
+ let chains: Array;
+ beforeAll(() => {
+ chains = setup();
+ });
+
+ test('assert_supported_chain___returns_true', () => {
+ const chainID = 'eth';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isChainSupported(chain)).toBe(true);
+ });
+
+ test('assert_deprecated_chain___returns_false', () => {
+ const chainID = 'goerli';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isChainSupported(chain)).toBe(false);
+ });
+
+ test('assert_unsupported_chain___returns_false', () => {
+ const chainID = 'zksync';
+ let chain = findChainById(chains, chainID) as Chain;
+ if (chain.id !== chainID) {
+ throw new Error('Expected ' + chainID + ', but got ' + chain.id);
+ }
+ expect(isChainSupported(chain)).toBe(false);
+ });
+});
diff --git a/types/chain.types.ts b/types/chain.types.ts
index a8145c8..4340ca2 100644
--- a/types/chain.types.ts
+++ b/types/chain.types.ts
@@ -1,57 +1,192 @@
import { BlockType } from './block.types';
-import { GraphId } from './graph.types';
-import { Mainnet } from './mainnet.types';
-import { PinaxId } from './pinax.types';
-import { SupportedServices } from './service.types';
+import { GraphID } from './graph.types';
+import { PinaxID } from './pinax.types';
+import {
+ ___InternalConsensusLayerServices,
+ ___InternalSupportedServices,
+ ConsensusLayerServices,
+ SupportedServices,
+} from './service.types';
import { Standard } from './standard.types';
+export type ChainBase = {
+ // Testnet ID
+ id: PinaxID;
+
+ // Testnet Name
+ name: string;
+
+ // Alternative Names
+ alt_names: string[];
+
+ // The Graph ID
+ // See docs/retrieve_graph_ids.md
+ graph_id: GraphID | null;
+
+ // Display Priority, lower is higher
+ index?: number;
+
+ // Chain Standard (ie. ERC20)
+ // One good reference to determine chain standard is
+ // https://thegraph.com/docs/en/developing/supported-networks/
+ standard: Standard | null;
+
+ // Whether or not the chain supports detailed blocks.
+ // Not all chains are equal, some uses RPC poller
+ // which only offer partial blocks.
+ // See whether or not RPC poller is ticked on the
+ // Blockchain Service Matrix (https://www.notion.so/pinaxnetwork/Blockchain-Service-Matrix).
+ is_detailed_blocks: boolean;
+
+ // Block Type
+ block_type: BlockType;
+};
+
+export type ___InternalTestnet = ChainBase & {
+ // Whether or not the chain supports our existing services
+ supported_services: ___InternalSupportedServices;
+
+ metadata?: {
+ // Chain ID that replaces this (deprecated) chain
+ deprecated_replacing_chain?: PinaxID;
+ };
+};
+
+export type ___InternalConsensusLayer = ChainBase & {
+ // Whether or not the chain supports our existing services
+ // Consensus Layers exist only for services built on top of RPC
+ // (Firehose, Substreams), and not for the RPC service itself.
+ supported_services: ___InternalConsensusLayerServices;
+};
+
+export type ___InternalEVM = ChainBase & {
+ // Whether or not the chain supports our existing services
+ supported_services: ___InternalSupportedServices;
+};
+
/**
* Describes the Data that needs to be provided for a Chain.
*
* The Chain type theb extends the Chain type to include
* the generated fields.
*/
-export type Chain = {
- // Pinax ID
- id: PinaxId;
+export interface ___InternalChain extends ChainBase {
+ icon: {
+ // Token Icon ID
+ // See if icon is available on https://tokenicons.io/, if not create PR to add it.
+ // Then go on the Github Repo and find the icon ID under /packages/core/src/metadata/
+ // https://github.com/0xa3k5/token-icons
+ id: string;
- // Verbose Name
- name: string;
+ // Theme of the Icon brand
+ // To avoid placing a dark icon on a dark background.
+ // If the brand is in midtones or some vibrant color, use 'both'.
+ brand_theme: 'light' | 'dark' | 'both';
- // The Graph ID
- // See graph.types.ts for instructions on how to retrieve Graph IDs
- graph_id: GraphId | null;
+ // Generated by ./scripts/generate/data_json.js
+ variants?: Array<'branded' | 'mono'>;
+ };
- // Display Priority
- index: number;
+ // Whether or not the chain supports our existing services
+ supported_services: ___InternalSupportedServices;
- // Alternative Names
- alt_names: string[];
+ // Merged by ./scripts/generate/data_json.js
+ testnets?: Array<___InternalTestnet>;
- // Mainnet ID
- mainnet: Mainnet;
+ // Merged by ./scripts/generate/data_json.js
+ consensus?: Array<___InternalConsensusLayer>;
- // Chain Standard (ie. ERC20)
- standard: Standard | null;
+ // Merge by ./scripts/generate/data_json.js
+ evms?: Array<___InternalEVM>;
- // Block Type
- block_type: BlockType;
+ // Any additional metadata we want to store (ie. Wagmi)
+ metadata?: {
+ // Layer of the chain
+ layer?: 'L0' | 'L1' | 'L2' | 'L3';
- // Image URL
- img: string;
+ // Website of the chain
+ website?: string;
- // Image URL (Inverted) if is_img_dt_invert is true
- img_invert?: string;
+ // Mainchain ID, if the chain is a sidechain
+ // Either a PinaxID or a string, as the mainchain may not be in the list of chains
+ mainchain_id?: PinaxID | string;
- // Whether or not the image should be inverted
- is_img_dt_invert: boolean;
+ // tags for the chain
+ tags?: string[];
- // Whether or not the chain is a testnet
- is_testnet: boolean;
+ // Chain ID that replaces this (deprecated) chain
+ deprecated_replacing_chain?: PinaxID;
+ };
+}
+export type Testnet = ChainBase & {
// Whether or not the chain supports our existing services
supported_services: SupportedServices;
- // Any additional metadata we want to store (ie. Wagmi)
- // metadata: any | null;
+ metadata?: {
+ // Chain ID that replaces this (deprecated) chain
+ deprecated_replacing_chain?: PinaxID;
+ };
};
+
+export type ConsensusLayer = ChainBase & {
+ // Whether or not the chain supports our existing services
+ // Consensus Layers exist only for services built on top of RPC
+ // (Firehose, Substreams), and not for the RPC service itself.
+ supported_services: ConsensusLayerServices;
+};
+
+export type EVM = ChainBase & {
+ // Whether or not the chain supports our existing services
+ supported_services: SupportedServices;
+};
+
+/**
+ * Describes the Data that needs to be provided for a Chain.
+ *
+ * The Chain type theb extends the Chain type to include
+ * the generated fields.
+ */
+export interface Chain extends ChainBase {
+ icon: {
+ // Token Icon ID
+ id: string;
+
+ // Theme of the Icon brand
+ brand_theme: 'light' | 'dark' | 'both';
+
+ // Generated by ./scripts/generate/data_json.js
+ variants?: Array<'branded' | 'mono'>;
+ };
+
+ // Whether or not the chain supports our existing services
+ supported_services: SupportedServices;
+
+ // Merged by ./scripts/generate/data_json.js
+ testnets?: Array;
+
+ // Merged by ./scripts/generate/data_json.js
+ consensus?: Array;
+
+ // Merge by ./scripts/generate/data_json.js
+ evms?: Array;
+
+ // Any additional metadata we want to store (ie. Wagmi)
+ metadata?: {
+ // Layer of the chain
+ layer?: 'L0' | 'L1' | 'L2' | 'L3';
+
+ // Website of the chain
+ website?: string;
+
+ // Mainchain ID, if the chain is a sidechain
+ // Either a PinaxID or a string, as the mainchain may not be in the list of chains
+ mainchain_id?: PinaxID | string;
+
+ // tags for the chain
+ tags?: string[];
+
+ // Chain ID that replaces this (deprecated) chain
+ deprecated_replacing_chain?: PinaxID;
+ };
+}
diff --git a/types/graph.types.ts b/types/graph.types.ts
index 4898e4b..af4c1b3 100644
--- a/types/graph.types.ts
+++ b/types/graph.types.ts
@@ -1,7 +1,7 @@
// This file is auto-generated on pre-commit to avoid maintaining it.
// Do not modify manually as it will be overwritten.
-// Last generation on 2024-05-03, 3:03:14 p.m..
-export type GraphId =
+// Last generation on 8/2/2024, 12:13:18 PM.
+export type GraphID =
| 'arbitrum-one'
| 'arbitrum-sepolia'
| 'arweave-mainnet'
@@ -19,8 +19,8 @@ export type GraphId =
| 'celo'
| 'celo-alfajores'
| 'chapel'
- | 'clover'
| 'cosmoshub-4'
+ | 'etherlink-mainnet'
| 'etherlink-testnet'
| 'fantom'
| 'fantom-testnet'
@@ -28,10 +28,13 @@ export type GraphId =
| 'fuse'
| 'gnosis'
| 'gnosis-chiado'
+ | 'gravity-mainnet'
+ | 'gravity-testnet'
| 'harmony'
| 'holesky'
+ | 'iotex'
+ | 'iotex-testnet'
| 'linea'
- | 'linea-goerli'
| 'linea-sepolia'
| 'mainnet'
| 'matic'
@@ -46,14 +49,17 @@ export type GraphId =
| 'optimism-sepolia'
| 'osmo-test-4'
| 'osmosis-1'
- | 'poa-core'
| 'polygon-amoy'
| 'polygon-zkevm'
- | 'polygon-zkevm-testnet'
+ | 'polygon-zkevm-cardona'
+ | 'rootstock'
| 'scroll'
| 'scroll-sepolia'
+ | 'sei-atlantic'
+ | 'sei-mainnet'
| 'sei-testnet'
| 'sepolia'
+ | 'solana-mainnet-beta'
| 'theta-testnet-001'
| 'xlayer-mainnet'
| 'xlayer-sepolia'
diff --git a/types/index.ts b/types/index.ts
new file mode 100644
index 0000000..8731225
--- /dev/null
+++ b/types/index.ts
@@ -0,0 +1,6 @@
+export * from './block.types';
+export * from './chain.types';
+export * from './graph.types';
+export * from './pinax.types';
+export * from './service.types';
+export * from './standard.types';
diff --git a/types/mainnet.types.ts b/types/mainnet.types.ts
deleted file mode 100644
index 3ab1b75..0000000
--- a/types/mainnet.types.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-export type Mainnet =
- | 'arbitrum'
- | 'arweave'
- | 'avalanche'
- | 'base'
- | 'bsc'
- | 'bitcoin'
- | 'celo'
- | 'cosmoshub'
- | 'decimal'
- | 'eth'
- | 'eos'
- | 'fantom'
- | 'gnosis'
- | 'juno'
- | 'kava'
- | 'moonbeam'
- | 'near'
- | 'optimism'
- | 'ore'
- | 'osmosis'
- | 'polygon'
- | 'scroll'
- | 'starknet'
- | 'telos'
- | 'ux'
- | 'wax'
- | 'zkatana';
diff --git a/types/pinax.types.ts b/types/pinax.types.ts
index f43afa0..7512d2c 100644
--- a/types/pinax.types.ts
+++ b/types/pinax.types.ts
@@ -1,39 +1,51 @@
// This file is auto-generated on pre-commit to avoid maintaining it / circular dependencies.
// Do not modify manually as it will be overwritten.
-// Last generation on 2024-05-03, 3:03:15 p.m..
-export type PinaxId =
- | 'alfajores'
- | 'amoy'
- | 'arbgoerli'
+// Last generation on 8/2/2024, 12:13:18 PM.
+export type PinaxID =
| 'arbone'
+ | 'arbgoerli'
| 'arbsepolia'
| 'arweave'
| 'avalanche'
| 'base'
| 'bitcoin'
+ | 'blast'
+ | 'blastsepolia'
+ | 'boba'
+ | 'bobasepolia'
| 'bsc'
- | 'celo'
| 'chapel'
- | 'chiado-cl'
- | 'chiado'
+ | 'cardano'
+ | 'celo'
+ | 'alfajores'
| 'cosmoshub'
+ | 'juno'
+ | 'theta'
+ | 'cronos'
| 'decimal'
+ | 'eosevm'
| 'eos'
+ | 'jungle4'
+ | 'kylin'
| 'eth-cl'
+ | 'goerli-cl'
+ | 'holesky-cl'
+ | 'sepolia-cl'
| 'eth'
+ | 'goerli'
+ | 'holesky'
+ | 'sepolia'
| 'fantom'
+ | 'fuse'
+ | 'chiado-cl'
| 'gnosis-cl'
| 'gnosis'
- | 'goerli-cl'
- | 'goerli'
- | 'holesky-cl'
- | 'holesky'
- | 'jungle4'
- | 'juno'
+ | 'chiado'
| 'kava'
- | 'kylin'
+ | 'linea'
+ | 'litecoin'
+ | 'mode'
| 'moonbeam'
- | 'mumbai'
| 'near'
| 'neartest'
| 'optimism'
@@ -41,14 +53,20 @@ export type PinaxId =
| 'orestage'
| 'osmosis'
| 'polygon'
+ | 'amoy'
+ | 'mumbai'
+ | 'ronin'
| 'scroll'
- | 'sepolia-cl'
- | 'sepolia'
+ | 'sei'
| 'starknet'
| 'telos'
| 'telostest'
- | 'theta'
- | 'ux'
| 'wax'
| 'waxtest'
- | 'zkatana';
+ | 'x-layer'
+ | 'xai'
+ | 'zkastar'
+ | 'zkatana'
+ | 'zkyoto'
+ | 'zksync'
+ | 'zora';
diff --git a/types/service.types.ts b/types/service.types.ts
index 8ac11a8..44b2f5f 100644
--- a/types/service.types.ts
+++ b/types/service.types.ts
@@ -1,7 +1,30 @@
-export type Service = 'substreams' | 'firehose' | 'rpc';
+export type ConsensusLayerServiceID = 'substreams' | 'firehose';
+export type ServiceID = ConsensusLayerServiceID | 'rpc';
export type ServiceEndpoint = {
- released_at: string | null;
+ name: string;
+ endpoint_slug: ServiceID;
+ port: number;
+};
+
+export type ___InternalConsensusLayerServices = {
+ [key in ConsensusLayerServiceID]: ServiceStatusDates;
+};
+
+export type ___InternalSupportedServices = {
+ [key in ServiceID]: ServiceStatusDates;
+};
+
+export type ServiceStatusDates = {
+ beta_released_at: string | null;
+ full_released_at: string | null;
deprecated_at: string | null;
};
-export type SupportedServices = { [key in Service]: ServiceEndpoint };
+
+export type ConsensusLayerServices = {
+ [key in ConsensusLayerServiceID]: ServiceStatusDates;
+};
+
+export type SupportedServices = {
+ [key in ServiceID]: ServiceStatusDates;
+};
diff --git a/types/standard.types.ts b/types/standard.types.ts
index 63d9a81..3404cf7 100644
--- a/types/standard.types.ts
+++ b/types/standard.types.ts
@@ -4,4 +4,8 @@ export type Standard =
| 'brc20'
| 'cosmos'
| 'erc20'
- | 'near';
+ | 'ltc20'
+ | 'near'
+ | 'rrc20'
+ | 'sei'
+ | 'cardano';
diff --git a/utils/case.ts b/utils/case.ts
new file mode 100644
index 0000000..46fd0d5
--- /dev/null
+++ b/utils/case.ts
@@ -0,0 +1,5 @@
+export const toCamelCase = (str: string): string => {
+ return str.replace(/([-_][a-z])/g, (group) =>
+ group.toUpperCase().replace('-', '').replace('_', ''),
+ );
+};
diff --git a/utils/chains.ts b/utils/chains.ts
new file mode 100644
index 0000000..3a422c6
--- /dev/null
+++ b/utils/chains.ts
@@ -0,0 +1,198 @@
+import {
+ ConsensusLayerServiceID,
+ ServiceID,
+ ServiceStatusDates,
+} from '../types';
+import {
+ Chain,
+ ChainBase,
+ ConsensusLayer,
+ EVM,
+ Testnet,
+} from '../types/chain.types';
+
+/**
+ * Checks whether a service is fully supported.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ * @param service ServiceID or ConsensusLayerServiceID
+ *
+ * @returns boolean
+ */
+const isServiceSupported = (
+ chain: Chain | Testnet | ConsensusLayer,
+ service: ConsensusLayerServiceID | ServiceID,
+) => {
+ // @ts-ignore
+ const serviceStatusDates = chain.supported_services[service] as
+ | ServiceStatusDates
+ | undefined;
+ return (
+ serviceStatusDates &&
+ serviceStatusDates.full_released_at !== null &&
+ serviceStatusDates.deprecated_at === null
+ );
+};
+
+/**
+ * Checks whether a service is in beta.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ * @param service ServiceID or ConsensusLayerServiceID
+ *
+ * @returns boolean
+ */
+const isServiceBeta = (
+ chain: Chain | Testnet | ConsensusLayer,
+ service: ConsensusLayerServiceID | ServiceID,
+) => {
+ // @ts-ignore
+ const serviceStatusDates = chain.supported_services[service] as
+ | ServiceStatusDates
+ | undefined;
+ return (
+ serviceStatusDates &&
+ serviceStatusDates.beta_released_at !== null &&
+ serviceStatusDates.deprecated_at === null &&
+ !isServiceSupported(chain, service)
+ );
+};
+
+/**
+ * Checks whether a service was once supported.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ * @param service ServiceID or ConsensusLayerServiceID
+ *
+ * @returns boolean
+ */
+const isServiceDeprecated = (
+ chain: Chain | Testnet | ConsensusLayer,
+ service: ConsensusLayerServiceID | ServiceID,
+) => {
+ // @ts-ignore
+ const serviceStatusDates = chain.supported_services[service] as
+ | ServiceStatusDates
+ | undefined;
+ return (
+ serviceStatusDates &&
+ (serviceStatusDates.beta_released_at !== null ||
+ serviceStatusDates.full_released_at !== null) &&
+ serviceStatusDates.deprecated_at !== null
+ );
+};
+
+/**
+ * Checks whether any service is fully supported for a given chain.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ *
+ * @returns boolean
+ */
+const isChainSupported = (chain: Chain | Testnet | ConsensusLayer) => {
+ return (
+ isServiceSupported(chain, 'firehose') ||
+ isServiceSupported(chain, 'substreams') ||
+ isServiceSupported(chain, 'rpc')
+ );
+};
+
+/**
+ * Checks whether any service is in beta for a given chain.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ *
+ * @returns boolean
+ */
+const isChainBeta = (chain: Chain | Testnet | ConsensusLayer) => {
+ return (
+ isServiceBeta(chain, 'firehose') ||
+ isServiceBeta(chain, 'substreams') ||
+ isServiceBeta(chain, 'rpc')
+ );
+};
+
+/**
+ * Checks whether any service was once supported for a given chain.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ *
+ * @returns boolean
+ */
+const isChainDeprecated = (chain: Chain | Testnet | ConsensusLayer) => {
+ return (
+ isServiceDeprecated(chain, 'firehose') ||
+ isServiceDeprecated(chain, 'substreams') ||
+ isServiceDeprecated(chain, 'rpc')
+ );
+};
+
+/**
+ * Checks whether a chain is a consensus layer.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ *
+ * @returns boolean
+ */
+const isChainConsensusLayer = (
+ chain: Chain | Testnet | ConsensusLayer,
+): boolean => {
+ return chain.id.slice(-3).includes('-cl');
+};
+
+/**
+ * Finds a chain by its ID by scanning mainnets, consensus layers, testnets and EVMs.
+ * Returns first match.
+ *
+ * @param db Array of Chains
+ * @param id Chain ID
+ *
+ * @returns Chain, Testnet or ConsensusLayer
+ */
+const findChainById = (
+ db: Array,
+ id: string,
+): Chain | Testnet | ConsensusLayer | EVM | undefined => {
+ for (const chain of db) {
+ if (chain.id === id) {
+ return chain;
+ }
+ const consensus = chain.consensus?.find((consensus) => consensus.id === id);
+ if (consensus) {
+ return consensus;
+ }
+ const testnet = chain.testnets?.find((testnet) => testnet.id === id);
+ if (testnet) {
+ return testnet;
+ }
+ const evm = chain.evms?.find((evm) => evm.id === id);
+ if (evm) {
+ return evm;
+ }
+ }
+ return undefined;
+};
+
+/**
+ * Checks whether a chain has full block support. Chains that use RPC poller only
+ * support partial blocks.
+ *
+ * @param chain Chain, Testnet or ConsensusLayer
+ *
+ * @returns boolean
+ */
+const hasChainFullBlockSupport = (chain: Chain | Testnet | ConsensusLayer) => {
+ return chain.is_detailed_blocks;
+};
+
+export {
+ isServiceSupported,
+ isServiceBeta,
+ isServiceDeprecated,
+ isChainSupported,
+ isChainBeta,
+ isChainDeprecated,
+ isChainConsensusLayer,
+ findChainById,
+ hasChainFullBlockSupport,
+};
diff --git a/utils/index.ts b/utils/index.ts
new file mode 100644
index 0000000..5a6d971
--- /dev/null
+++ b/utils/index.ts
@@ -0,0 +1,4 @@
+import * as chains from './chains';
+import * as services from './service_configs';
+
+export { chains, services };
diff --git a/utils/service_configs/firehose.ts b/utils/service_configs/firehose.ts
new file mode 100644
index 0000000..30a625f
--- /dev/null
+++ b/utils/service_configs/firehose.ts
@@ -0,0 +1,54 @@
+import services from '../../data/services';
+import { ServiceEndpoint } from '../../types/service.types';
+import { Chain } from '../../types/chain.types';
+
+const firehose = services.filter(
+ (s: ServiceEndpoint) => s.endpoint_slug.indexOf('firehose') > -1,
+)[0];
+
+const generateGRPCurlConfig = (chain: Chain, apiKey: string) => {
+ return [
+ `# Set your API Key`,
+ `export PINAX_KEY=${apiKey}`,
+ ``,
+ `# Set your JWT`,
+ `export FIREHOSE_API_TOKEN=$(curl https://auth.pinax.network/v1/auth/issue -s --data-binary '{"api_key":"'$PINAX_KEY'"}' | jq -r .token)`,
+ ``,
+ `# Run Firehose`,
+ `grpcurl -keepalive-time 30 -max-msg-sz 50241867 -d '{"start_block_num": -100}' -H 'Authorization: "$FIREHOSE_API_TOKEN"' ${chain.id}.firehose.pinax.network:443 sf.firehose.v2.Stream.Blocks`,
+ ].join('\n');
+};
+
+const generateTomlEnv = (chain: Chain, token: string) => {
+ return [
+ `PINAX_RPC_NODE=${chain.id}.rpc.pinax.network`,
+ `PINAX_JWT=${token}`,
+ ].join('\n');
+};
+
+const generateTomlConfig = (chain: Chain) => {
+ const getERC20ConfigLines = (chain: Chain) => {
+ if (chain.standard?.localeCompare('ERC-20') === 0)
+ return [
+ ` # Ethereum Based Chain`,
+ ` { label = "bootstrap", details = { type = "web3", url = "$PINAX_RPC_NODE", features = [ "archive" ] }},`,
+ ];
+ return [];
+ };
+
+ return [
+ `[chains.${chain.graph_id}]`,
+ `shard = "primary"`,
+ `provider = [`,
+ ...getERC20ConfigLines(chain),
+ ` # Firehose Configuration`,
+ ` { label = "firehose", details = { type = "firehose", url = "https://${chain.id}.firehose.pinax.network:443", token = "$PINAX_JWT" }},`,
+ ].join('\n');
+};
+
+export default {
+ service: firehose,
+ generateGRPCurlConfig,
+ generateTomlEnv,
+ generateTomlConfig,
+};
diff --git a/utils/service_configs/index.ts b/utils/service_configs/index.ts
new file mode 100644
index 0000000..464fdb8
--- /dev/null
+++ b/utils/service_configs/index.ts
@@ -0,0 +1,3 @@
+export * as firehose from './firehose';
+export * as rpc from './rpc';
+export * as substreams from './substreams';
diff --git a/utils/service_configs/rpc.ts b/utils/service_configs/rpc.ts
new file mode 100644
index 0000000..c321146
--- /dev/null
+++ b/utils/service_configs/rpc.ts
@@ -0,0 +1,16 @@
+import services from '../../data/services';
+import { ServiceEndpoint } from '../../types/service.types';
+import { Chain } from '../../types/chain.types';
+
+const rpc = services.filter(
+ (s: ServiceEndpoint) => s.endpoint_slug.indexOf('rpc') > -1,
+)[0];
+
+const generateCurlConfig = (chain: Chain, apiKey: string) => {
+ return `curl -4vsH 'Content-Type: application/json' -d '{"jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": ["latest", false], "id": 1}' https://${chain.id}.rpc.pinax.network/v1/${apiKey}/`;
+};
+
+export default {
+ service: rpc,
+ generateCurlConfig,
+};
diff --git a/utils/service_configs/substreams.ts b/utils/service_configs/substreams.ts
new file mode 100644
index 0000000..c5e74a9
--- /dev/null
+++ b/utils/service_configs/substreams.ts
@@ -0,0 +1,108 @@
+import services from '../../data/services';
+import { ServiceEndpoint } from '../../types/service.types';
+import { Chain } from '../../types/chain.types';
+
+const substreams = services.filter(
+ (s: ServiceEndpoint) => s.endpoint_slug.indexOf('substreams') > -1,
+)[0];
+
+const generateTomlEnv = (chain: Chain, token: string): string => {
+ const getEthBasedEnv = () => {
+ if (chain.standard?.localeCompare('ERC-20') === 0)
+ return `PINAX_RPC_NODE=${chain.id}.rpc.pinax.network\n`;
+ return '';
+ };
+
+ const getSubstreamsEnv = () => {
+ return `PINAX_JWT=${token}`;
+ };
+
+ return ['# ...\n', getEthBasedEnv(), getSubstreamsEnv()].join('');
+};
+
+const generateJavascriptEnv = (chain: Chain, apiKey: string): string => {
+ return `# ...
+MANIFEST=https://example.com/substreams.spkg
+SUBSTREAMS_URL=https://${chain.id}.${substreams.endpoint_slug}.pinax.network:${substreams.port}
+SUBSTREAMS_API_KEY=${apiKey}`;
+};
+
+const generateCurlConfig = (chain: Chain, api_key: string): string => {
+ return [
+ `# Set your API Key`,
+ `export PINAX_KEY=${api_key}`,
+ ``,
+ `# Set your JWT`,
+ `export SUBSTREAMS_API_TOKEN=$(curl https://auth.pinax.network/v1/auth/issue -s --data-binary '{"api_key":"'$PINAX_KEY'"}' | jq -r .token)`,
+ ``,
+ `# Run Substreams`,
+ `substreams run -e ${chain.id}.substreams.pinax.network:443 https://github.com/pinax-network/substreams/releases/download/blocks-v0.1.0/blocks-v0.1.0.spkg map_blocks -s -10`,
+ ].join('\n');
+};
+
+const generateTomlConfig = (chain: Chain): string => {
+ const getChainsLine = (chain: Chain) => `[chains.${chain.graph_id}]\n`;
+ const getShardLine = () => `shard = "primary"\n`;
+ const getEthConfigLines = (chain: Chain) => {
+ if (chain.standard?.localeCompare('ERC-20') === 0)
+ return ` # Ethereum Based Chain\n { label = "bootstrap", details = { type = "web3", url = "$PINAX_RPC_NODE", features = [ "archive" ] }},\n`;
+ return '';
+ };
+ const getSubstreamsConfigLines = (chain: Chain) =>
+ ` # Substreams Configuration\n { label = "substreams", details = { type = "substreams", url = "https://${chain.id}.${substreams.endpoint_slug}.pinax.network:${substreams.port}", token = "$PINAX_JWT" }},\n`;
+
+ let config = [
+ getChainsLine(chain),
+ getShardLine(),
+ 'provider = [\n',
+ getEthConfigLines(chain),
+ ].join('');
+ config += getSubstreamsConfigLines(chain);
+ config += ']\n';
+ return config;
+};
+
+const generateJavascriptConfig = (): string => {
+ return `import { createRegistry, createRequest } from “@substreams/core”;
+import { readPackage } from “@substreams/manifest”;
+import { BlockEmitter, createDefaultTransport } from “@substreams/node”;
+
+const { MANIFEST, SUBSTREAMS_URL, SUBSTREAMS_API_KEY } = process.env;
+
+// Read Substream
+const substreamPackage = await readPackage({MANIFEST});
+
+// Connect Transport
+const headers = new Headers({ “User-Agent”: “@substreams/node” });
+const registry = createRegistry(substreamPackage);
+const transport = createDefaultTransport({SUBSTREAMS_URL}, {SUBSTREAMS_API_KEY}, registry, headers);
+const request = createRequest({substreamPackage, outputModule: “graph_out”, startBlockNum: -1});
+
+// NodeJS Events
+const emitter = new BlockEmitter(transport, request, registry);
+
+// Session Trace ID
+emitter.on("session", (session) => {
+ console.dir(session);
+});
+
+// Stream Blocks
+emitter.on("anyMessage", (message, cursor, clock) => {
+ console.dir(message);
+ console.dir(cursor);
+ console.dir(clock);
+});
+
+// Start Emitter
+await emitter.start();
+console.log("✅ Done")`;
+};
+
+export default {
+ service: substreams,
+ generateTomlEnv,
+ generateJavascriptEnv,
+ generateCurlConfig,
+ generateTomlConfig,
+ generateJavascriptConfig,
+};