From 9f19edd9cc5eea10e44c145fd04885bf320e8f43 Mon Sep 17 00:00:00 2001 From: dzlk17 Date: Thu, 5 Dec 2024 15:45:58 +0100 Subject: [PATCH] branch_cleared --- hasura-api/metadata-json/README.md | 7 - hasura-api/metadata-json/unified.json | 2378 ---------------- .../metadata-json/unified_transition.json | 2427 ----------------- python/.dockerignore | 27 - python/Dockerfile | 17 - python/README.md | 77 - python/config.yaml.example | 15 - python/docker-compose.yml | 19 - python/poetry.lock | 1747 ------------ python/processors/README.md | 37 - python/processors/__init__.py | 0 python/processors/aptos-tontine | 1 - .../aptos_ambassador_token/processor.py | 92 - python/processors/coin_flip/README.md | 371 --- python/processors/coin_flip/models.py | 30 - python/processors/coin_flip/move/Move.toml | 21 - .../coin_flip/move/sources/coin_flip.move | 151 - .../move/sources/package_manager.move | 104 - python/processors/coin_flip/processor.py | 126 - .../example_event_processor/models.py | 26 - .../example_event_processor/processor.py | 79 - python/processors/main.py | 29 - .../marketplace_v2_parser.py | 355 --- .../marketplace_v2_utils.py | 58 - .../nft_marketplace_models.py | 230 -- .../nft_marketplace_v2/processor.py | 1221 --------- python/processors/nft_orderbooks/__init__.py | 0 .../nft_marketplace_activities_model.py | 36 - .../models/nft_marketplace_bid_models.py | 98 - .../models/nft_marketplace_listings_models.py | 57 - .../nft_marketplace_constants.py | 224 -- .../nft_orderbooks/nft_marketplace_enums.py | 86 - .../nft_marketplace_processor.py | 165 -- .../nft_orderbooks_parser_utils.py | 166 -- .../nft_orderbooks/parsers/bluemove_parser.py | 728 ----- .../nft_orderbooks/parsers/itsrare_parser.py | 114 - .../nft_orderbooks/parsers/okx_parser.py | 172 -- .../nft_orderbooks/parsers/ozozoz_parser.py | 111 - .../nft_orderbooks/parsers/souffle_parser.py | 291 -- .../nft_orderbooks/parsers/topaz_parser.py | 536 ---- python/pyproject.toml | 44 - python/scripts/__init__.py | 0 python/scripts/create_tables.py | 17 - python/utils/__init__.py | 0 python/utils/config.py | 86 - python/utils/event_utils.py | 15 - python/utils/general_utils.py | 37 - python/utils/logging.py | 74 - python/utils/metrics.py | 13 - python/utils/models/annotated_types.py | 43 - python/utils/models/general_models.py | 23 - python/utils/models/schema_names.py | 4 - python/utils/object_utils.py | 20 - python/utils/processor_name.py | 9 - python/utils/session.py | 3 - python/utils/token_utils.py | 62 - python/utils/transaction_utils.py | 77 - python/utils/transactions_processor.py | 63 - python/utils/worker.py | 728 ----- python/utils/write_set_change_utils.py | 31 - rust/processor/parser.yaml | 10 - typescript/README.md | 10 - typescript/examples/README.md | 7 - .../examples/event_processor/.eslintignore | 5 - .../examples/event_processor/.eslintrc.json | 37 - .../examples/event_processor/.gitignore | 65 - .../examples/event_processor/.prettierrc | 5 - typescript/examples/event_processor/README.md | 53 - .../event_processor/config.yaml.example | 5 - .../examples/event_processor/package.json | 31 - .../examples/event_processor/pnpm-lock.yaml | 2303 ---------------- .../examples/event_processor/src/index.ts | 29 - .../examples/event_processor/src/models.ts | 33 - .../examples/event_processor/src/processor.ts | 79 - .../examples/event_processor/tsconfig.json | 27 - typescript/sdk/.eslintignore | 3 - typescript/sdk/.eslintrc.json | 37 - typescript/sdk/.gitignore | 65 - typescript/sdk/.npmignore | 5 - typescript/sdk/.prettierrc | 5 - typescript/sdk/CHANGELOG.md | 14 - typescript/sdk/CONTRIBUTING.md | 25 - typescript/sdk/package.json | 50 - typescript/sdk/pnpm-lock.yaml | 2100 -------------- typescript/sdk/scripts/build.sh | 11 - typescript/sdk/src/config.ts | 23 - typescript/sdk/src/index.ts | 8 - typescript/sdk/src/models/base.ts | 19 - typescript/sdk/src/models/data_source.ts | 43 - typescript/sdk/src/models/index.ts | 3 - .../sdk/src/models/next_version_to_process.ts | 24 - typescript/sdk/src/processor.ts | 41 - typescript/sdk/src/utils.ts | 14 - typescript/sdk/src/worker.ts | 218 -- typescript/sdk/tsconfig.json | 27 - 95 files changed, 19212 deletions(-) delete mode 100644 hasura-api/metadata-json/README.md delete mode 100644 hasura-api/metadata-json/unified.json delete mode 100644 hasura-api/metadata-json/unified_transition.json delete mode 100644 python/.dockerignore delete mode 100644 python/Dockerfile delete mode 100644 python/README.md delete mode 100644 python/config.yaml.example delete mode 100644 python/docker-compose.yml delete mode 100644 python/poetry.lock delete mode 100644 python/processors/README.md delete mode 100644 python/processors/__init__.py delete mode 160000 python/processors/aptos-tontine delete mode 100644 python/processors/aptos_ambassador_token/processor.py delete mode 100644 python/processors/coin_flip/README.md delete mode 100644 python/processors/coin_flip/models.py delete mode 100644 python/processors/coin_flip/move/Move.toml delete mode 100644 python/processors/coin_flip/move/sources/coin_flip.move delete mode 100644 python/processors/coin_flip/move/sources/package_manager.move delete mode 100644 python/processors/coin_flip/processor.py delete mode 100644 python/processors/example_event_processor/models.py delete mode 100644 python/processors/example_event_processor/processor.py delete mode 100644 python/processors/main.py delete mode 100644 python/processors/nft_marketplace_v2/marketplace_v2_parser.py delete mode 100644 python/processors/nft_marketplace_v2/marketplace_v2_utils.py delete mode 100644 python/processors/nft_marketplace_v2/nft_marketplace_models.py delete mode 100644 python/processors/nft_marketplace_v2/processor.py delete mode 100644 python/processors/nft_orderbooks/__init__.py delete mode 100644 python/processors/nft_orderbooks/models/nft_marketplace_activities_model.py delete mode 100644 python/processors/nft_orderbooks/models/nft_marketplace_bid_models.py delete mode 100644 python/processors/nft_orderbooks/models/nft_marketplace_listings_models.py delete mode 100644 python/processors/nft_orderbooks/nft_marketplace_constants.py delete mode 100644 python/processors/nft_orderbooks/nft_marketplace_enums.py delete mode 100644 python/processors/nft_orderbooks/nft_marketplace_processor.py delete mode 100644 python/processors/nft_orderbooks/nft_orderbooks_parser_utils.py delete mode 100644 python/processors/nft_orderbooks/parsers/bluemove_parser.py delete mode 100644 python/processors/nft_orderbooks/parsers/itsrare_parser.py delete mode 100644 python/processors/nft_orderbooks/parsers/okx_parser.py delete mode 100644 python/processors/nft_orderbooks/parsers/ozozoz_parser.py delete mode 100644 python/processors/nft_orderbooks/parsers/souffle_parser.py delete mode 100644 python/processors/nft_orderbooks/parsers/topaz_parser.py delete mode 100644 python/pyproject.toml delete mode 100644 python/scripts/__init__.py delete mode 100644 python/scripts/create_tables.py delete mode 100644 python/utils/__init__.py delete mode 100644 python/utils/config.py delete mode 100644 python/utils/event_utils.py delete mode 100644 python/utils/general_utils.py delete mode 100644 python/utils/logging.py delete mode 100644 python/utils/metrics.py delete mode 100644 python/utils/models/annotated_types.py delete mode 100644 python/utils/models/general_models.py delete mode 100644 python/utils/models/schema_names.py delete mode 100644 python/utils/object_utils.py delete mode 100644 python/utils/processor_name.py delete mode 100644 python/utils/session.py delete mode 100644 python/utils/token_utils.py delete mode 100644 python/utils/transaction_utils.py delete mode 100644 python/utils/transactions_processor.py delete mode 100644 python/utils/worker.py delete mode 100644 python/utils/write_set_change_utils.py delete mode 100644 rust/processor/parser.yaml delete mode 100644 typescript/README.md delete mode 100644 typescript/examples/README.md delete mode 100644 typescript/examples/event_processor/.eslintignore delete mode 100644 typescript/examples/event_processor/.eslintrc.json delete mode 100644 typescript/examples/event_processor/.gitignore delete mode 100644 typescript/examples/event_processor/.prettierrc delete mode 100644 typescript/examples/event_processor/README.md delete mode 100644 typescript/examples/event_processor/config.yaml.example delete mode 100644 typescript/examples/event_processor/package.json delete mode 100644 typescript/examples/event_processor/pnpm-lock.yaml delete mode 100644 typescript/examples/event_processor/src/index.ts delete mode 100644 typescript/examples/event_processor/src/models.ts delete mode 100644 typescript/examples/event_processor/src/processor.ts delete mode 100644 typescript/examples/event_processor/tsconfig.json delete mode 100644 typescript/sdk/.eslintignore delete mode 100644 typescript/sdk/.eslintrc.json delete mode 100644 typescript/sdk/.gitignore delete mode 100644 typescript/sdk/.npmignore delete mode 100644 typescript/sdk/.prettierrc delete mode 100644 typescript/sdk/CHANGELOG.md delete mode 100644 typescript/sdk/CONTRIBUTING.md delete mode 100644 typescript/sdk/package.json delete mode 100644 typescript/sdk/pnpm-lock.yaml delete mode 100755 typescript/sdk/scripts/build.sh delete mode 100644 typescript/sdk/src/config.ts delete mode 100644 typescript/sdk/src/index.ts delete mode 100644 typescript/sdk/src/models/base.ts delete mode 100644 typescript/sdk/src/models/data_source.ts delete mode 100644 typescript/sdk/src/models/index.ts delete mode 100644 typescript/sdk/src/models/next_version_to_process.ts delete mode 100644 typescript/sdk/src/processor.ts delete mode 100644 typescript/sdk/src/utils.ts delete mode 100644 typescript/sdk/src/worker.ts delete mode 100644 typescript/sdk/tsconfig.json diff --git a/hasura-api/metadata-json/README.md b/hasura-api/metadata-json/README.md deleted file mode 100644 index c32f45d69..000000000 --- a/hasura-api/metadata-json/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Hasura Metadata -This directory contains the metadata we use for Hasura. The "metadata" is what Hasura calls the file that configures pretty much everything about a Hasura instance, including table schemas, relations, DB connection configuration, how metrics are exported, etc. - -> [!WARNING] -> (09/25/2024) We added a new unified_transition.json to facilitate Fungible Asset Migration. Please use this file in Hasura while the new table is backfilling. - -**Note for Labs folks**: Use the file in [internal-ops](https://github.com/aptos-labs/internal-ops/blob/main/infra/apps/aptos-indexer-processors/metadata) instead. See the README there. diff --git a/hasura-api/metadata-json/unified.json b/hasura-api/metadata-json/unified.json deleted file mode 100644 index 40fea42f0..000000000 --- a/hasura-api/metadata-json/unified.json +++ /dev/null @@ -1,2378 +0,0 @@ -{ - "resource_version": 38, - "metadata": { - "version": 3, - "sources": [ - { - "name": "indexer-v2", - "kind": "postgres", - "tables": [ - { - "table": { - "name": "address_version_from_move_resources", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "address_version_from_move_resources", - "custom_root_fields": {} - }, - "array_relationships": [ - { - "name": "coin_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "delegated_staking_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "delegated_staking_activities", - "schema": "public" - } - } - } - }, - { - "name": "token_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "token_activities_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "coin_activities", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "coin_info", - "using": { - "manual_configuration": { - "column_mapping": { - "coin_type": "coin_type" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_infos", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "array_relationships": [ - { - "name": "aptos_names", - "using": { - "manual_configuration": { - "column_mapping": { - "owner_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "activity_type", - "amount", - "block_height", - "coin_type", - "entry_function_id_str", - "event_account_address", - "event_creation_number", - "event_index", - "event_sequence_number", - "is_gas_fee", - "is_transaction_success", - "owner_address", - "storage_refund_amount", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "coin_balances", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "coin_balances", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "coin_type", - "coin_type_hash", - "owner_address", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "coin_infos", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "coin_infos", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "coin_type", - "coin_type_hash", - "creator_address", - "decimals", - "name", - "supply_aggregator_table_handle", - "supply_aggregator_table_key", - "symbol", - "transaction_created_timestamp", - "transaction_version_created" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "collection_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "collection_datas", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "description", - "description_mutable", - "maximum", - "maximum_mutable", - "metadata_uri", - "supply", - "table_handle", - "transaction_timestamp", - "transaction_version", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_ans_lookup", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_ans_lookup", - "custom_root_fields": {} - }, - "array_relationships": [ - { - "name": "all_token_ownerships", - "using": { - "manual_configuration": { - "column_mapping": { - "token_name": "name" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_ownerships", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "domain", - "expiration_timestamp", - "is_deleted", - "last_transaction_version", - "registered_address", - "subdomain", - "token_name" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_coin_balances", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_coin_balances", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "coin_info", - "using": { - "manual_configuration": { - "column_mapping": { - "coin_type_hash": "coin_type_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_infos", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "coin_type", - "coin_type_hash", - "last_transaction_timestamp", - "last_transaction_version", - "owner_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_collection_datas", - "custom_root_fields": { - "select": "current_collection_datas" - } - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "description", - "description_mutable", - "last_transaction_timestamp", - "last_transaction_version", - "maximum", - "maximum_mutable", - "metadata_uri", - "supply", - "table_handle", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_token_datas", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "current_collection_data", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_data_id_hash": "collection_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "default_properties", - "description", - "description_mutable", - "largest_property_version", - "last_transaction_timestamp", - "last_transaction_version", - "maximum", - "maximum_mutable", - "metadata_uri", - "name", - "payee_address", - "properties_mutable", - "royalty_mutable", - "royalty_points_denominator", - "royalty_points_numerator", - "supply", - "token_data_id_hash", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_ownerships", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_token_ownerships", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "aptos_name", - "using": { - "manual_configuration": { - "column_mapping": { - "name": "token_name" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "current_collection_data", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_data_id_hash": "collection_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "collection_data_id_hash", - "collection_name", - "creator_address", - "last_transaction_timestamp", - "last_transaction_version", - "name", - "owner_address", - "property_version", - "table_type", - "token_data_id_hash", - "token_properties" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "move_resources", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "move_resources", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "token_activities", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "array_relationships": [ - { - "name": "aptos_names_owner", - "using": { - "manual_configuration": { - "column_mapping": { - "event_account_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "aptos_names_to", - "using": { - "manual_configuration": { - "column_mapping": { - "to_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "coin_amount", - "coin_type", - "collection_data_id_hash", - "collection_name", - "creator_address", - "event_account_address", - "event_creation_number", - "event_index", - "event_sequence_number", - "from_address", - "name", - "property_version", - "to_address", - "token_amount", - "token_data_id_hash", - "transaction_timestamp", - "transaction_version", - "transfer_type" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "token_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "token_datas", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "default_properties", - "description", - "description_mutable", - "largest_property_version", - "maximum", - "maximum_mutable", - "metadata_uri", - "name", - "payee_address", - "properties_mutable", - "royalty_mutable", - "royalty_points_denominator", - "royalty_points_numerator", - "supply", - "token_data_id_hash", - "transaction_timestamp", - "transaction_version", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "token_ownerships", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "token_ownerships", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "collection_data_id_hash", - "collection_name", - "creator_address", - "name", - "owner_address", - "property_version", - "table_handle", - "table_type", - "token_data_id_hash", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "tokens", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "tokens", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "name", - "property_version", - "token_data_id_hash", - "token_properties", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "parsed_asset_uris", - "schema": "nft_metadata_crawler" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "animation_optimizer_retry_count", - "asset_uri", - "cdn_animation_uri", - "cdn_image_uri", - "cdn_json_uri", - "image_optimizer_retry_count", - "json_parser_retry_count", - "raw_animation_uri", - "raw_image_uri" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "account_transactions", - "schema": "public" - }, - "object_relationships": [ - { - "name": "user_transaction", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "version" - }, - "insertion_order": null, - "remote_table": { - "name": "user_transactions", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "coin_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "delegated_staking_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "delegated_staking_activities", - "schema": "public" - } - } - } - }, - { - "name": "fungible_asset_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "fungible_asset_activities", - "schema": "public" - } - } - } - }, - { - "name": "token_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "token_activities_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "account_address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "address_events_summary", - "schema": "public" - }, - "object_relationships": [ - { - "name": "block_metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "min_block_height": "block_height" - }, - "insertion_order": null, - "remote_table": { - "name": "block_metadata_transactions", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "min_block_height", - "num_distinct_versions", - "account_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "address_version_from_events", - "schema": "public" - }, - "array_relationships": [ - { - "name": "coin_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "delegated_staking_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "delegated_staking_activities", - "schema": "public" - } - } - } - }, - { - "name": "token_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "token_activities_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "account_address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "block_metadata_transactions", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "block_height", - "epoch", - "failed_proposer_indices", - "id", - "previous_block_votes_bitvec", - "proposer", - "round", - "timestamp", - "version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "coin_supply", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "coin_type", - "coin_type_hash", - "supply", - "transaction_epoch", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_ans_lookup_v2", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "domain", - "expiration_timestamp", - "is_deleted", - "last_transaction_version", - "registered_address", - "subdomain", - "token_name", - "token_standard" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_aptos_names", - "schema": "public" - }, - "object_relationships": [ - { - "name": "is_domain_owner", - "using": { - "manual_configuration": { - "column_mapping": { - "domain_with_suffix": "token_name", - "owner_address": "owner_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "domain", - "domain_expiration_timestamp", - "domain_with_suffix", - "expiration_timestamp", - "is_active", - "is_primary", - "last_transaction_version", - "owner_address", - "registered_address", - "subdomain", - "subdomain_expiration_policy", - "token_name", - "token_standard" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_collection_ownership_v2_view", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_collection", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_id": "collection_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collections_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "distinct_tokens", - "last_transaction_version", - "collection_id", - "collection_name", - "creator_address", - "owner_address", - "collection_uri", - "single_token_uri" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "current_collections_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "cdn_asset_uris", - "using": { - "manual_configuration": { - "column_mapping": { - "uri": "asset_uri" - }, - "insertion_order": null, - "remote_table": { - "name": "parsed_asset_uris", - "schema": "nft_metadata_crawler" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_id", - "collection_name", - "collection_properties", - "creator_address", - "current_supply", - "description", - "last_transaction_timestamp", - "last_transaction_version", - "max_supply", - "mutable_description", - "mutable_uri", - "table_handle_v1", - "token_standard", - "total_minted_v2", - "uri" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_delegated_staking_pool_balances", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "active_table_handle", - "inactive_table_handle", - "last_transaction_version", - "operator_commission_percentage", - "staking_pool_address", - "total_coins", - "total_shares" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_delegated_voter", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "delegation_pool_address", - "delegator_address", - "last_transaction_timestamp", - "last_transaction_version", - "pending_voter", - "table_handle", - "voter" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_delegator_balances", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_pool_balance", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_delegated_staking_pool_balances", - "schema": "public" - } - } - } - }, - { - "name": "staking_pool_metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_staking_pool_voter", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "delegator_address", - "last_transaction_version", - "parent_table_handle", - "pool_address", - "pool_type", - "shares", - "table_handle" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_fungible_asset_balances", - "schema": "public" - }, - "object_relationships": [ - { - "name": "metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "asset_type": "asset_type" - }, - "insertion_order": null, - "remote_table": { - "name": "fungible_asset_metadata", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "amount_v1", - "amount_v2", - "asset_type", - "asset_type_v1", - "asset_type_v2", - "is_frozen", - "is_primary", - "last_transaction_timestamp", - "last_transaction_timestamp_v1", - "last_transaction_timestamp_v2", - "last_transaction_version", - "last_transaction_version_v1", - "last_transaction_version_v2", - "owner_address", - "storage_id", - "token_standard" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_objects", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "allow_ungated_transfer", - "is_deleted", - "last_guid_creation_num", - "last_transaction_version", - "object_address", - "owner_address", - "state_key_hash" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_staking_pool_voter", - "schema": "public" - }, - "array_relationships": [ - { - "name": "operator_aptos_name", - "using": { - "manual_configuration": { - "column_mapping": { - "operator_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "last_transaction_version", - "operator_address", - "staking_pool_address", - "voter_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_table_items", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "decoded_key", - "decoded_value", - "is_deleted", - "key", - "key_hash", - "last_transaction_version", - "table_handle" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_datas_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "aptos_name", - "using": { - "manual_configuration": { - "column_mapping": { - "token_name": "token_name" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "cdn_asset_uris", - "using": { - "manual_configuration": { - "column_mapping": { - "token_uri": "asset_uri" - }, - "insertion_order": null, - "remote_table": { - "name": "parsed_asset_uris", - "schema": "nft_metadata_crawler" - } - } - } - }, - { - "name": "current_collection", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_id": "collection_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collections_v2", - "schema": "public" - } - } - } - }, - { - "name": "current_royalty_v1", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_royalty_v1", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "current_token_ownerships", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_ownerships_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_id", - "decimals", - "description", - "is_deleted_v2", - "is_fungible_v2", - "largest_property_version_v1", - "last_transaction_timestamp", - "last_transaction_version", - "maximum", - "supply", - "token_data_id", - "token_name", - "token_properties", - "token_standard", - "token_uri" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_ownerships_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas_v2", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "composed_nfts", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "owner_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_ownerships_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "is_fungible_v2", - "is_soulbound_v2", - "last_transaction_timestamp", - "last_transaction_version", - "non_transferrable_by_owner", - "owner_address", - "property_version_v1", - "storage_id", - "table_type_v1", - "token_data_id", - "token_properties_mutated_v1", - "token_standard" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "current_token_pending_claims", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_collection_data", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_data_id_hash": "collection_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "current_collection_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_id": "collection_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collections_v2", - "schema": "public" - } - } - } - }, - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "current_token_data_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas_v2", - "schema": "public" - } - } - } - }, - { - "name": "token", - "using": { - "manual_configuration": { - "column_mapping": { - "last_transaction_version": "transaction_version", - "property_version": "property_version", - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "tokens", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "collection_data_id_hash", - "collection_id", - "collection_name", - "creator_address", - "from_address", - "last_transaction_timestamp", - "last_transaction_version", - "name", - "property_version", - "table_handle", - "to_address", - "token_data_id", - "token_data_id_hash" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_royalty_v1", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "last_transaction_timestamp", - "last_transaction_version", - "payee_address", - "royalty_points_denominator", - "royalty_points_numerator", - "token_data_id" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "delegated_staking_activities", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "delegator_address", - "event_index", - "event_type", - "pool_address", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "delegated_staking_pool_balances", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "active_table_handle", - "inactive_table_handle", - "operator_commission_percentage", - "staking_pool_address", - "total_coins", - "total_shares", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "delegated_staking_pools", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_staking_pool", - "using": { - "manual_configuration": { - "column_mapping": { - "staking_pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_staking_pool_voter", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "first_transaction_version", - "staking_pool_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "delegator_distinct_pool", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_pool_balance", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_delegated_staking_pool_balances", - "schema": "public" - } - } - } - }, - { - "name": "staking_pool_metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_staking_pool_voter", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "delegator_address", - "pool_address" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "events", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "account_address", - "creation_number", - "data", - "event_index", - "sequence_number", - "transaction_block_height", - "transaction_version", - "type", - "indexed_type" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "fungible_asset_activities", - "schema": "public" - }, - "object_relationships": [ - { - "name": "metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "asset_type": "asset_type" - }, - "insertion_order": null, - "remote_table": { - "name": "fungible_asset_metadata", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "owner_aptos_names", - "using": { - "manual_configuration": { - "column_mapping": { - "owner_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "asset_type", - "block_height", - "entry_function_id_str", - "event_index", - "gas_fee_payer_address", - "is_frozen", - "is_gas_fee", - "is_transaction_success", - "owner_address", - "storage_id", - "storage_refund_amount", - "token_standard", - "transaction_timestamp", - "transaction_version", - "type" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "fungible_asset_metadata", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "asset_type", - "creator_address", - "decimals", - "icon_uri", - "last_transaction_timestamp", - "last_transaction_version", - "maximum_v2", - "name", - "project_uri", - "supply_aggregator_table_handle_v1", - "supply_aggregator_table_key_v1", - "supply_v2", - "symbol", - "token_standard" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "indexer_status", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "db", - "is_indexer_up" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "ledger_infos", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "chain_id" - ], - "filter": {} - } - } - ] - }, - { - "table": { - "name": "num_active_delegator_per_pool", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "num_active_delegator", - "pool_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "processor_status", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "last_success_version", - "last_transaction_timestamp", - "last_updated", - "processor" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "proposal_votes", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "num_votes", - "proposal_id", - "should_pass", - "staking_pool_address", - "transaction_timestamp", - "transaction_version", - "voter_address" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "signatures", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "is_sender_primary", - "multi_agent_index", - "multi_sig_index", - "public_key", - "public_key_indices", - "signature", - "signer", - "threshold", - "transaction_block_height", - "transaction_version", - "type" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "table_items", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "decoded_key", - "decoded_value", - "key", - "table_handle", - "transaction_version", - "write_set_change_index" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "table_metadatas", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "handle", - "key_type", - "value_type" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "token_activities_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas_v2", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "aptos_names_from", - "using": { - "manual_configuration": { - "column_mapping": { - "from_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "aptos_names_to", - "using": { - "manual_configuration": { - "column_mapping": { - "to_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "after_value", - "before_value", - "entry_function_id_str", - "event_account_address", - "event_index", - "from_address", - "is_fungible_v2", - "property_version_v1", - "to_address", - "token_amount", - "token_data_id", - "token_standard", - "transaction_timestamp", - "transaction_version", - "type" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "user_transactions", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "block_height", - "entry_function_id_str", - "epoch", - "expiration_timestamp_secs", - "gas_unit_price", - "max_gas_amount", - "parent_signature_type", - "sender", - "sequence_number", - "timestamp", - "version" - ], - "filter": {}, - "limit": 100 - } - } - ] - } - ], - "configuration": { - "connection_info": { - "database_url": { - "from_env": "INDEXER_V2_POSTGRES_URL" - }, - "isolation_level": "read-committed", - "pool_settings": { - "connection_lifetime": 600, - "max_connections": 100 - }, - "use_prepared_statements": false - } - } - } - ], - "api_limits": { - "depth_limit": { - "global": 5, - "per_role": {} - }, - "disabled": false, - "time_limit": { - "global": 10, - "per_role": {} - } - }, - "metrics_config": { - "analyze_query_variables": true, - "analyze_response_body": true - } - } -} \ No newline at end of file diff --git a/hasura-api/metadata-json/unified_transition.json b/hasura-api/metadata-json/unified_transition.json deleted file mode 100644 index 27b151bcb..000000000 --- a/hasura-api/metadata-json/unified_transition.json +++ /dev/null @@ -1,2427 +0,0 @@ -{ - "resource_version": 38, - "metadata": { - "version": 3, - "sources": [ - { - "name": "indexer-v2", - "kind": "postgres", - "tables": [ - { - "table": { - "name": "address_version_from_move_resources", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "address_version_from_move_resources", - "custom_root_fields": {} - }, - "array_relationships": [ - { - "name": "coin_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "delegated_staking_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "delegated_staking_activities", - "schema": "public" - } - } - } - }, - { - "name": "token_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "token_activities_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "coin_activities", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "coin_info", - "using": { - "manual_configuration": { - "column_mapping": { - "coin_type": "coin_type" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_infos", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "array_relationships": [ - { - "name": "aptos_names", - "using": { - "manual_configuration": { - "column_mapping": { - "owner_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "activity_type", - "amount", - "block_height", - "coin_type", - "entry_function_id_str", - "event_account_address", - "event_creation_number", - "event_index", - "event_sequence_number", - "is_gas_fee", - "is_transaction_success", - "owner_address", - "storage_refund_amount", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "coin_balances", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "coin_balances", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "coin_type", - "coin_type_hash", - "owner_address", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "coin_infos", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "coin_infos", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "coin_type", - "coin_type_hash", - "creator_address", - "decimals", - "name", - "supply_aggregator_table_handle", - "supply_aggregator_table_key", - "symbol", - "transaction_created_timestamp", - "transaction_version_created" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "collection_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "collection_datas", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "description", - "description_mutable", - "maximum", - "maximum_mutable", - "metadata_uri", - "supply", - "table_handle", - "transaction_timestamp", - "transaction_version", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_ans_lookup", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_ans_lookup", - "custom_root_fields": {} - }, - "array_relationships": [ - { - "name": "all_token_ownerships", - "using": { - "manual_configuration": { - "column_mapping": { - "token_name": "name" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_ownerships", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "domain", - "expiration_timestamp", - "is_deleted", - "last_transaction_version", - "registered_address", - "subdomain", - "token_name" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_coin_balances", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_coin_balances", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "coin_info", - "using": { - "manual_configuration": { - "column_mapping": { - "coin_type_hash": "coin_type_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_infos", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "coin_type", - "coin_type_hash", - "last_transaction_timestamp", - "last_transaction_version", - "owner_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_collection_datas", - "custom_root_fields": { - "select": "current_collection_datas" - } - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "description", - "description_mutable", - "last_transaction_timestamp", - "last_transaction_version", - "maximum", - "maximum_mutable", - "metadata_uri", - "supply", - "table_handle", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_token_datas", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "current_collection_data", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_data_id_hash": "collection_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "default_properties", - "description", - "description_mutable", - "largest_property_version", - "last_transaction_timestamp", - "last_transaction_version", - "maximum", - "maximum_mutable", - "metadata_uri", - "name", - "payee_address", - "properties_mutable", - "royalty_mutable", - "royalty_points_denominator", - "royalty_points_numerator", - "supply", - "token_data_id_hash", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_ownerships", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_token_ownerships", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "aptos_name", - "using": { - "manual_configuration": { - "column_mapping": { - "name": "token_name" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "current_collection_data", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_data_id_hash": "collection_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "collection_data_id_hash", - "collection_name", - "creator_address", - "last_transaction_timestamp", - "last_transaction_version", - "name", - "owner_address", - "property_version", - "table_type", - "token_data_id_hash", - "token_properties" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "move_resources", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "move_resources", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "token_activities", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "array_relationships": [ - { - "name": "aptos_names_owner", - "using": { - "manual_configuration": { - "column_mapping": { - "event_account_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "aptos_names_to", - "using": { - "manual_configuration": { - "column_mapping": { - "to_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "coin_amount", - "coin_type", - "collection_data_id_hash", - "collection_name", - "creator_address", - "event_account_address", - "event_creation_number", - "event_index", - "event_sequence_number", - "from_address", - "name", - "property_version", - "to_address", - "token_amount", - "token_data_id_hash", - "transaction_timestamp", - "transaction_version", - "transfer_type" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "token_datas", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "token_datas", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "default_properties", - "description", - "description_mutable", - "largest_property_version", - "maximum", - "maximum_mutable", - "metadata_uri", - "name", - "payee_address", - "properties_mutable", - "royalty_mutable", - "royalty_points_denominator", - "royalty_points_numerator", - "supply", - "token_data_id_hash", - "transaction_timestamp", - "transaction_version", - "uri_mutable" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "token_ownerships", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "token_ownerships", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "collection_data_id_hash", - "collection_name", - "creator_address", - "name", - "owner_address", - "property_version", - "table_handle", - "table_type", - "token_data_id_hash", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "tokens", - "schema": "legacy_migration_v1" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "tokens", - "custom_root_fields": {} - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_data_id_hash", - "collection_name", - "creator_address", - "name", - "property_version", - "token_data_id_hash", - "token_properties", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "parsed_asset_uris", - "schema": "nft_metadata_crawler" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "animation_optimizer_retry_count", - "asset_uri", - "cdn_animation_uri", - "cdn_image_uri", - "cdn_json_uri", - "image_optimizer_retry_count", - "json_parser_retry_count", - "raw_animation_uri", - "raw_image_uri" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "account_transactions", - "schema": "public" - }, - "object_relationships": [ - { - "name": "user_transaction", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "version" - }, - "insertion_order": null, - "remote_table": { - "name": "user_transactions", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "coin_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "delegated_staking_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "delegated_staking_activities", - "schema": "public" - } - } - } - }, - { - "name": "fungible_asset_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "fungible_asset_activities", - "schema": "public" - } - } - } - }, - { - "name": "token_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "token_activities_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "account_address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "address_events_summary", - "schema": "public" - }, - "object_relationships": [ - { - "name": "block_metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "min_block_height": "block_height" - }, - "insertion_order": null, - "remote_table": { - "name": "block_metadata_transactions", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "min_block_height", - "num_distinct_versions", - "account_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "address_version_from_events", - "schema": "public" - }, - "array_relationships": [ - { - "name": "coin_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "coin_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "delegated_staking_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "delegated_staking_activities", - "schema": "public" - } - } - } - }, - { - "name": "token_activities", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "token_activities_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "transaction_version": "transaction_version" - }, - "insertion_order": null, - "remote_table": { - "name": "token_activities_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "account_address", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "block_metadata_transactions", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "block_height", - "epoch", - "failed_proposer_indices", - "id", - "previous_block_votes_bitvec", - "proposer", - "round", - "timestamp", - "version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "coin_supply", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "coin_type", - "coin_type_hash", - "supply", - "transaction_epoch", - "transaction_timestamp", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_ans_lookup_v2", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "domain", - "expiration_timestamp", - "is_deleted", - "last_transaction_version", - "registered_address", - "subdomain", - "token_name", - "token_standard" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_aptos_names", - "schema": "public" - }, - "object_relationships": [ - { - "name": "is_domain_owner", - "using": { - "manual_configuration": { - "column_mapping": { - "domain_with_suffix": "token_name", - "owner_address": "owner_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "domain", - "domain_expiration_timestamp", - "domain_with_suffix", - "expiration_timestamp", - "is_active", - "is_primary", - "last_transaction_version", - "owner_address", - "registered_address", - "subdomain", - "subdomain_expiration_policy", - "token_name", - "token_standard" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_collection_ownership_v2_view", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_collection", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_id": "collection_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collections_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "distinct_tokens", - "last_transaction_version", - "collection_id", - "collection_name", - "creator_address", - "owner_address", - "collection_uri", - "single_token_uri" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "current_collections_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "cdn_asset_uris", - "using": { - "manual_configuration": { - "column_mapping": { - "uri": "asset_uri" - }, - "insertion_order": null, - "remote_table": { - "name": "parsed_asset_uris", - "schema": "nft_metadata_crawler" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_id", - "collection_name", - "collection_properties", - "creator_address", - "current_supply", - "description", - "last_transaction_timestamp", - "last_transaction_version", - "max_supply", - "mutable_description", - "mutable_uri", - "table_handle_v1", - "token_standard", - "total_minted_v2", - "uri" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_delegated_staking_pool_balances", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "active_table_handle", - "inactive_table_handle", - "last_transaction_version", - "operator_commission_percentage", - "staking_pool_address", - "total_coins", - "total_shares" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_delegated_voter", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "delegation_pool_address", - "delegator_address", - "last_transaction_timestamp", - "last_transaction_version", - "pending_voter", - "table_handle", - "voter" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_delegator_balances", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_pool_balance", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_delegated_staking_pool_balances", - "schema": "public" - } - } - } - }, - { - "name": "staking_pool_metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_staking_pool_voter", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "delegator_address", - "last_transaction_version", - "parent_table_handle", - "pool_address", - "pool_type", - "shares", - "table_handle" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_fungible_asset_balances", - "schema": "public" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_fungible_asset_balances_new", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "asset_type": "asset_type" - }, - "insertion_order": null, - "remote_table": { - "name": "fungible_asset_metadata", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "asset_type", - "is_frozen", - "is_primary", - "last_transaction_timestamp", - "last_transaction_version", - "owner_address", - "storage_id", - "token_standard" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_fungible_asset_balances_legacy", - "schema": "public" - }, - "configuration": { - "column_config": {}, - "custom_column_names": {}, - "custom_name": "current_fungible_asset_balances", - "custom_root_fields": {} - }, - "object_relationships": [ - { - "name": "metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "asset_type": "asset_type" - }, - "insertion_order": null, - "remote_table": { - "name": "fungible_asset_metadata", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "asset_type", - "is_frozen", - "is_primary", - "last_transaction_timestamp", - "last_transaction_version", - "owner_address", - "storage_id", - "token_standard" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "current_objects", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "allow_ungated_transfer", - "is_deleted", - "last_guid_creation_num", - "last_transaction_version", - "object_address", - "owner_address", - "state_key_hash" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_staking_pool_voter", - "schema": "public" - }, - "array_relationships": [ - { - "name": "operator_aptos_name", - "using": { - "manual_configuration": { - "column_mapping": { - "operator_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "last_transaction_version", - "operator_address", - "staking_pool_address", - "voter_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_table_items", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "decoded_key", - "decoded_value", - "is_deleted", - "key", - "key_hash", - "last_transaction_version", - "table_handle" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_datas_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "aptos_name", - "using": { - "manual_configuration": { - "column_mapping": { - "token_name": "token_name" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "cdn_asset_uris", - "using": { - "manual_configuration": { - "column_mapping": { - "token_uri": "asset_uri" - }, - "insertion_order": null, - "remote_table": { - "name": "parsed_asset_uris", - "schema": "nft_metadata_crawler" - } - } - } - }, - { - "name": "current_collection", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_id": "collection_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collections_v2", - "schema": "public" - } - } - } - }, - { - "name": "current_royalty_v1", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_royalty_v1", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "current_token_ownerships", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_ownerships_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "collection_id", - "decimals", - "description", - "is_deleted_v2", - "is_fungible_v2", - "largest_property_version_v1", - "last_transaction_timestamp", - "last_transaction_version", - "maximum", - "supply", - "token_data_id", - "token_name", - "token_properties", - "token_standard", - "token_uri" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_ownerships_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas_v2", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "composed_nfts", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "owner_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_ownerships_v2", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "is_fungible_v2", - "is_soulbound_v2", - "last_transaction_timestamp", - "last_transaction_version", - "non_transferrable_by_owner", - "owner_address", - "property_version_v1", - "storage_id", - "table_type_v1", - "token_data_id", - "token_properties_mutated_v1", - "token_standard" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "current_token_pending_claims", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_collection_data", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_data_id_hash": "collection_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collection_datas", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "current_collection_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "collection_id": "collection_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_collections_v2", - "schema": "public" - } - } - } - }, - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas", - "schema": "legacy_migration_v1" - } - } - } - }, - { - "name": "current_token_data_v2", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas_v2", - "schema": "public" - } - } - } - }, - { - "name": "token", - "using": { - "manual_configuration": { - "column_mapping": { - "last_transaction_version": "transaction_version", - "property_version": "property_version", - "token_data_id_hash": "token_data_id_hash" - }, - "insertion_order": null, - "remote_table": { - "name": "tokens", - "schema": "legacy_migration_v1" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "collection_data_id_hash", - "collection_id", - "collection_name", - "creator_address", - "from_address", - "last_transaction_timestamp", - "last_transaction_version", - "name", - "property_version", - "table_handle", - "to_address", - "token_data_id", - "token_data_id_hash" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "current_token_royalty_v1", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "last_transaction_timestamp", - "last_transaction_version", - "payee_address", - "royalty_points_denominator", - "royalty_points_numerator", - "token_data_id" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "delegated_staking_activities", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "delegator_address", - "event_index", - "event_type", - "pool_address", - "transaction_version" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "delegated_staking_pool_balances", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "active_table_handle", - "inactive_table_handle", - "operator_commission_percentage", - "staking_pool_address", - "total_coins", - "total_shares", - "transaction_version" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "delegated_staking_pools", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_staking_pool", - "using": { - "manual_configuration": { - "column_mapping": { - "staking_pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_staking_pool_voter", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "first_transaction_version", - "staking_pool_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "delegator_distinct_pool", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_pool_balance", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_delegated_staking_pool_balances", - "schema": "public" - } - } - } - }, - { - "name": "staking_pool_metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "pool_address": "staking_pool_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_staking_pool_voter", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "delegator_address", - "pool_address" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "events", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "account_address", - "creation_number", - "data", - "event_index", - "sequence_number", - "transaction_block_height", - "transaction_version", - "type", - "indexed_type" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "fungible_asset_activities", - "schema": "public" - }, - "object_relationships": [ - { - "name": "metadata", - "using": { - "manual_configuration": { - "column_mapping": { - "asset_type": "asset_type" - }, - "insertion_order": null, - "remote_table": { - "name": "fungible_asset_metadata", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "owner_aptos_names", - "using": { - "manual_configuration": { - "column_mapping": { - "owner_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "amount", - "asset_type", - "block_height", - "entry_function_id_str", - "event_index", - "gas_fee_payer_address", - "is_frozen", - "is_gas_fee", - "is_transaction_success", - "owner_address", - "storage_id", - "storage_refund_amount", - "token_standard", - "transaction_timestamp", - "transaction_version", - "type" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "fungible_asset_metadata", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "asset_type", - "creator_address", - "decimals", - "icon_uri", - "last_transaction_timestamp", - "last_transaction_version", - "maximum_v2", - "name", - "project_uri", - "supply_aggregator_table_handle_v1", - "supply_aggregator_table_key_v1", - "supply_v2", - "symbol", - "token_standard" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "indexer_status", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "db", - "is_indexer_up" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "ledger_infos", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "chain_id" - ], - "filter": {} - } - } - ] - }, - { - "table": { - "name": "num_active_delegator_per_pool", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "num_active_delegator", - "pool_address" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "processor_status", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "last_success_version", - "last_transaction_timestamp", - "last_updated", - "processor" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "proposal_votes", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "num_votes", - "proposal_id", - "should_pass", - "staking_pool_address", - "transaction_timestamp", - "transaction_version", - "voter_address" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "signatures", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "is_sender_primary", - "multi_agent_index", - "multi_sig_index", - "public_key", - "public_key_indices", - "signature", - "signer", - "threshold", - "transaction_block_height", - "transaction_version", - "type" - ], - "filter": {}, - "limit": 100 - }, - "comment": "" - } - ] - }, - { - "table": { - "name": "table_items", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "decoded_key", - "decoded_value", - "key", - "table_handle", - "transaction_version", - "write_set_change_index" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "table_metadatas", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "handle", - "key_type", - "value_type" - ], - "filter": {}, - "limit": 100 - } - } - ] - }, - { - "table": { - "name": "token_activities_v2", - "schema": "public" - }, - "object_relationships": [ - { - "name": "current_token_data", - "using": { - "manual_configuration": { - "column_mapping": { - "token_data_id": "token_data_id" - }, - "insertion_order": null, - "remote_table": { - "name": "current_token_datas_v2", - "schema": "public" - } - } - } - } - ], - "array_relationships": [ - { - "name": "aptos_names_from", - "using": { - "manual_configuration": { - "column_mapping": { - "from_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - }, - { - "name": "aptos_names_to", - "using": { - "manual_configuration": { - "column_mapping": { - "to_address": "registered_address" - }, - "insertion_order": null, - "remote_table": { - "name": "current_aptos_names", - "schema": "public" - } - } - } - } - ], - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "after_value", - "before_value", - "entry_function_id_str", - "event_account_address", - "event_index", - "from_address", - "is_fungible_v2", - "property_version_v1", - "to_address", - "token_amount", - "token_data_id", - "token_standard", - "transaction_timestamp", - "transaction_version", - "type" - ], - "filter": {}, - "limit": 100, - "allow_aggregations": true - } - } - ] - }, - { - "table": { - "name": "user_transactions", - "schema": "public" - }, - "select_permissions": [ - { - "role": "anonymous", - "permission": { - "columns": [ - "block_height", - "entry_function_id_str", - "epoch", - "expiration_timestamp_secs", - "gas_unit_price", - "max_gas_amount", - "parent_signature_type", - "sender", - "sequence_number", - "timestamp", - "version" - ], - "filter": {}, - "limit": 100 - } - } - ] - } - ], - "configuration": { - "connection_info": { - "database_url": { - "from_env": "INDEXER_V2_POSTGRES_URL" - }, - "isolation_level": "read-committed", - "pool_settings": { - "connection_lifetime": 600, - "max_connections": 100 - }, - "use_prepared_statements": false - } - } - } - ], - "api_limits": { - "depth_limit": { - "global": 5, - "per_role": {} - }, - "disabled": false, - "time_limit": { - "global": 10, - "per_role": {} - } - }, - "metrics_config": { - "analyze_query_variables": true, - "analyze_response_body": true - } - } -} \ No newline at end of file diff --git a/python/.dockerignore b/python/.dockerignore deleted file mode 100644 index 4273efd72..000000000 --- a/python/.dockerignore +++ /dev/null @@ -1,27 +0,0 @@ -# Specific things to ignore. -**/dist -scripts -**/.venv -*.example - -# Standard Python stuff. -**/__pycache__ -*.pyc -*.pyo -*.pyd -.Python -env -pip-log.txt -pip-delete-this-directory.txt -.tox -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.log -**/.git -.mypy_cache -.pytest_cache -.hypothesis diff --git a/python/Dockerfile b/python/Dockerfile deleted file mode 100644 index dba4d6f16..000000000 --- a/python/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM python:3.11 - -# System deps -RUN pip install "poetry==1.4.2" - -WORKDIR /app -COPY poetry.lock pyproject.toml /app/ - -# Project initialization -RUN poetry config virtualenvs.create false \ - && poetry install --only main - -# Copy files and folders -COPY /utils/ /app/utils -COPY /processors/ /app/processors - -CMD ["poetry", "run", "python", "-m", "processors.main", "--config", "/app/config/config.yaml"] diff --git a/python/README.md b/python/README.md deleted file mode 100644 index 63e45f19c..000000000 --- a/python/README.md +++ /dev/null @@ -1,77 +0,0 @@ -## Python Quickstart - -> [!WARNING] -> For production-grade indexers, we recommend the Rust processors. -> The Python implementation is known to have a grpc deserialization recursion limit. The issue is with the GRPC library and we haven't had a chance to look into this. Please proceed with caution. - -### Prerequisite - -- Python 3.7 or higher -- `pip` version 9.0.1 or higher - -### Basic Tutorial - -In this tutorial, we will be going over how to create and run the Example Event Processor. All source code is in `aptos-indexer-processors/python/processors/example_event_processor`. - -1. Download the example: - -``` -# Clone the repository to get the example code: -$ git clone https://github.com/aptos-labs/aptos-indexer-processors -# Navigate to the python folder -$ cd aptos-indexer-processors/python -``` - -2. Install all dependencies - -``` -poetry install -``` - -3. Prepare the `config.yaml` file. - Make sure to update the `config.yaml` file with the correct indexer settings and database credentials. - - ``` - $ cp config.yaml.example config.yaml - ``` - -4. Define the data model and create the table(s). - - - In this tutorial, we want to extract data about transaction events. In `models.py`, you can define an Events data model. - - The example uses Postgres. For now only Postgres is supported and we use SQLAlchemy ORM to interact with the Postgres database. - -5. Create a processor. - - - Extend `TransactionsProcessor`. - - In `process_transactions()`, implement the parsing logic and insert the rows into DB. - -6. Run `poetry run python -m processors.main -c config.yaml` to start indexing! - -7. (Optional) Run locally in Docker - - - The included `Dockerfile` is already set up for you to run the example event processor in Docker. - - Create `config.yaml` under the `python` folder - - Run `docker compose up --build --force-recreate`. - -8. Query the data from database in your dApp. It's recommended to use SQLAlchemy for this part. - -## Development - -### Install all dependencies - -```bash -poetry install -``` - -### Linting & autoformatting - -```bash -poetry run poe pyright # typecheck -poetry run poe format # autoformat via black -``` - -### Run locally in Docker - -```bash -docker compose up --build --force-recreate -``` diff --git a/python/config.yaml.example b/python/config.yaml.example deleted file mode 100644 index 1dc7e02ab..000000000 --- a/python/config.yaml.example +++ /dev/null @@ -1,15 +0,0 @@ -health_check_port: 8080 -server_config: - processor_config: - type: "python_example_event_processor" - indexer_grpc_data_service_address: "grpc.mainnet.aptoslabs.com:443" - auth_token: "" - postgres_connection_string: "postgresql://" - # Optional. Start processor at starting_version - starting_version: 100000 - # Optional. Stop processor after ending_version. - ending_version: 114000 - # Optional. HTTP2 ping interval in seconds to detect if the connection is still alive. Defaults to 30. - indexer_grpc_http2_ping_interval_in_secs: 30 - # Optional. HTTP2 ping timeout in seconds to detect if the connection is still alive. Defaults to 10 - indexer_grpc_http2_ping_timeout_in_secs: 10 \ No newline at end of file diff --git a/python/docker-compose.yml b/python/docker-compose.yml deleted file mode 100644 index 0a61733e2..000000000 --- a/python/docker-compose.yml +++ /dev/null @@ -1,19 +0,0 @@ -version: '3' -services: - index-processor: - build: . - environment: - DB_CONNECTION_URI: postgresql://postgres:postgres@db:5432/postgres - depends_on: - - db - volumes: - - ./config.yaml:/app/config/config.yaml - db: - image: postgres:15.2 - environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - volumes: - - db-data:/var/lib/postgresql/data -volumes: - db-data: diff --git a/python/poetry.lock b/python/poetry.lock deleted file mode 100644 index 681bd2642..000000000 --- a/python/poetry.lock +++ /dev/null @@ -1,1747 +0,0 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. - -[[package]] -name = "alembic" -version = "1.12.1" -description = "A database migration tool for SQLAlchemy." -optional = false -python-versions = ">=3.7" -files = [ - {file = "alembic-1.12.1-py3-none-any.whl", hash = "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb"}, - {file = "alembic-1.12.1.tar.gz", hash = "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"}, -] - -[package.dependencies] -Mako = "*" -SQLAlchemy = ">=1.3.0" -typing-extensions = ">=4" - -[package.extras] -tz = ["python-dateutil"] - -[[package]] -name = "aptos-protos" -version = "1.1.2" -description = "Code generated from protobuf definitions for the Aptos tech stack" -optional = false -python-versions = "^3.9" -files = [] -develop = false - -[package.dependencies] -grpcio = "^1.57.0" -grpclib = "^0.4.5" -protobuf = "^4.24.2" - -[package.source] -type = "git" -url = "https://github.com/aptos-labs/aptos-core.git" -reference = "aee306923da1fae533a91b4015e0a58443742d45" -resolved_reference = "aee306923da1fae533a91b4015e0a58443742d45" -subdirectory = "protos/python" - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "automat" -version = "22.10.0" -description = "Self-service finite-state machines for the programmer on the go." -optional = false -python-versions = "*" -files = [ - {file = "Automat-22.10.0-py2.py3-none-any.whl", hash = "sha256:c3164f8742b9dc440f3682482d32aaff7bb53f71740dd018533f9de286b64180"}, - {file = "Automat-22.10.0.tar.gz", hash = "sha256:e56beb84edad19dcc11d30e8d9b895f75deeb5ef5e96b84a467066b3b84bb04e"}, -] - -[package.dependencies] -attrs = ">=19.2.0" -six = "*" - -[package.extras] -visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] - -[[package]] -name = "black" -version = "23.11.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, - {file = "black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, - {file = "black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, - {file = "black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, - {file = "black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, - {file = "black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, - {file = "black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, - {file = "black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, - {file = "black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, - {file = "black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, - {file = "black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, - {file = "black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, - {file = "black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, - {file = "black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, - {file = "black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, - {file = "black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, - {file = "black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, - {file = "black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "cachetools" -version = "5.3.2" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, - {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, -] - -[[package]] -name = "certifi" -version = "2023.7.22" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "constantly" -version = "23.10.4" -description = "Symbolic constants in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9"}, - {file = "constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"}, -] - -[[package]] -name = "google-api-core" -version = "2.14.0" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.14.0.tar.gz", hash = "sha256:5368a4502b793d9bbf812a5912e13e4e69f9bd87f6efb508460c43f5bbd1ce41"}, - {file = "google_api_core-2.14.0-py3-none-any.whl", hash = "sha256:de2fb50ed34d47ddbb2bd2dcf680ee8fead46279f4ed6b16de362aca23a18952"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} -grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-auth" -version = "2.23.4" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, - {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-cloud-bigquery" -version = "3.13.0" -description = "Google BigQuery API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-3.13.0.tar.gz", hash = "sha256:794ccfc93ccb0e0ad689442f896f9c82de56da0fe18a195531bb37096c2657d6"}, - {file = "google_cloud_bigquery-3.13.0-py2.py3-none-any.whl", hash = "sha256:eda3dbcff676e17962c54e5224e415b55e4f6833a5c896c6c8902b69e7dba4b4"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.6.0,<3.0.0dev" -google-resumable-media = ">=0.6.0,<3.0dev" -grpcio = {version = ">=1.49.1,<2.0dev", markers = "python_version >= \"3.11\""} -packaging = ">=20.0.0" -proto-plus = ">=1.15.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -python-dateutil = ">=2.7.2,<3.0dev" -requests = ">=2.21.0,<3.0.0dev" - -[package.extras] -all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] -ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] -ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] -opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] -pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] -tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] - -[[package]] -name = "google-cloud-bigquery-storage" -version = "2.22.0" -description = "Google Cloud Bigquery Storage API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-storage-2.22.0.tar.gz", hash = "sha256:f6d8c7b3ab9b574c66977fcee9d336e334ad1a3843a722be19123640e7808ea3"}, - {file = "google_cloud_bigquery_storage-2.22.0-py2.py3-none-any.whl", hash = "sha256:7f11b2ae590a5b3874fb6ddf705a66a070340db238f971cf7b53349eee9ca317"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -fastavro = ["fastavro (>=0.21.2)"] -pandas = ["pandas (>=0.21.1)"] -pyarrow = ["pyarrow (>=0.15.0)"] - -[[package]] -name = "google-cloud-core" -version = "2.3.3" -description = "Google Cloud API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, - {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, -] - -[package.dependencies] -google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" - -[package.extras] -grpc = ["grpcio (>=1.38.0,<2.0dev)"] - -[[package]] -name = "google-crc32c" -version = "1.5.0" -description = "A python wrapper of the C library 'Google CRC32C'" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, - {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, - {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, - {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, - {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, - {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, - {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, - {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, - {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, - {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, - {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, - {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, - {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, - {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, - {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, - {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, -] - -[package.extras] -testing = ["pytest"] - -[[package]] -name = "google-resumable-media" -version = "2.6.0" -description = "Utilities for Google Media Downloads and Resumable Uploads" -optional = false -python-versions = ">= 3.7" -files = [ - {file = "google-resumable-media-2.6.0.tar.gz", hash = "sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7"}, - {file = "google_resumable_media-2.6.0-py2.py3-none-any.whl", hash = "sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b"}, -] - -[package.dependencies] -google-crc32c = ">=1.0,<2.0dev" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] -requests = ["requests (>=2.18.0,<3.0.0dev)"] - -[[package]] -name = "googleapis-common-protos" -version = "1.61.0" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, - {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, -] - -[package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] - -[[package]] -name = "greenlet" -version = "3.0.1" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, - {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, - {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, - {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, - {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, - {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, - {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, - {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, - {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, - {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, - {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, - {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, - {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, - {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, - {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, - {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, - {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, - {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, - {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, - {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, - {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, - {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, - {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, - {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, - {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, - {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, - {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, - {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, - {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, - {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, - {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, - {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, - {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, -] - -[package.extras] -docs = ["Sphinx"] -test = ["objgraph", "psutil"] - -[[package]] -name = "grpcio" -version = "1.59.2" -description = "HTTP/2-based RPC framework" -optional = false -python-versions = ">=3.7" -files = [ - {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, - {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, - {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, - {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, - {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, - {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, - {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, - {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, - {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, - {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, - {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, - {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, - {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, - {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, - {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, - {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, - {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, - {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, - {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, - {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, - {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, - {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, - {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, - {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, - {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, - {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, - {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, - {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, - {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, - {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, - {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, - {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, - {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, - {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, - {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, - {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.59.2)"] - -[[package]] -name = "grpcio-status" -version = "1.59.2" -description = "Status proto mapping for gRPC" -optional = false -python-versions = ">=3.6" -files = [ - {file = "grpcio-status-1.59.2.tar.gz", hash = "sha256:a2c2b146e66b73ba80d021ab34fce5db4dd9be67ca4566cda40d36b185ce54f4"}, - {file = "grpcio_status-1.59.2-py3-none-any.whl", hash = "sha256:24bdf3b3b83b9112f43bd0626f82510d12cc1d919a45028ac20eb6919218e508"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.59.2" -protobuf = ">=4.21.6" - -[[package]] -name = "grpcio-tools" -version = "1.59.2" -description = "Protobuf code generator for gRPC" -optional = false -python-versions = ">=3.7" -files = [ - {file = "grpcio-tools-1.59.2.tar.gz", hash = "sha256:75905266cf90f1866b322575c2edcd4b36532c33fc512bb1b380dc58d84b1030"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:9b2885c0e2c9a97bde33497a919032afbd8b5c6dc2f8d4dd4198e77226e0de05"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f410375830a9bb7140a07da4d75bf380e0958377bed50d77d1dae302de4314e"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e21fc172522d2dda815223a359b2aca9bc317a1b5e5dea5a58cd5079333af133"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:072a7ce979ea4f7579c3c99fcbde3d1882c3d1942a3b51d159f67af83b714cd8"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b38f8edb2909702c2478b52f6213982c21e4f66f739ac953b91f97863ba2c06a"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:12fdee2de80d83eadb1294e0f8a0cb6cefcd2e4988ed680038ab09cd04361ee4"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a3cb707da722a0b6c4021fc2cc1c005a8d4037d8ad0252f93df318b9b8a6b4f3"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-win32.whl", hash = "sha256:ec2fbb02ebb9f2ae1b1c69cccf913dee8c41f5acad94014d3ce11b53720376e3"}, - {file = "grpcio_tools-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0dc271a200dbab6547b2c73fcbdb7efe94c31cb633aa20d073f7cf4493493e1"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:d634b65cc8ee769edccf1647d8a16861a27e0d8cbd787c711168d2c5e9bddbd1"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:b0b712acec00a9cbc2204c271d638062a2cb8ce74f25d158b023ff6e93182659"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:dd5c78f8e7c6e721b9009c92481a0e3b30a9926ef721120723a03b8a34a34fb9"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:724f4f0eecc17fa66216eebfff145631070f04ed7fb4ddf7a7d1c4f954ecc2a1"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77ec33ddee691e60511e2a7c793aad4cf172ae20e08d95c786cbba395f6203a7"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fa1b9dee7811fad081816e884d063c4dd4946dba61aa54243b4c76c311090c48"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba8dba19e7b2b6f7369004533866f222ba483b9e14d2d152ecf9339c0df1283a"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-win32.whl", hash = "sha256:df35d145bc2f6e5f57b74cb69f66526675a5f2dcf7d54617ce0deff0c82cca0a"}, - {file = "grpcio_tools-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:99ddc0f5304071a355c261ae49ea5d29b9e9b6dcf422dfc55ada70a243e27e8f"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:670f5889853215999eb3511a623dd7dff01b1ce1a64610d13366e0fd337f8c79"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:1e949e66d4555ce319fd7acef90df625138078d8729c4dc6f6a9f05925034433"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:09d809ca88999b2578119683f9f0f6a9b42de95ea21550852114a1540b6a642c"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db0925545180223fabd6da9b34513efac83aa16673ef8b1cb0cc678e8cf0923c"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2ccb59dfbf2ebd668a5a7c4b7bb2b859859641d2b199114b557cd045aac6102"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:12cc7698fad48866f68fdef831685cb31ef5814ac605d248c4e5fc964a6fb3f6"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:55c401599d5093c4cfa83b8f0ee9757b4d6d3029b10bd67be2cffeada7a44961"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-win32.whl", hash = "sha256:896f5cdf58f658025a4f7e4ea96c81183b4b6a4b1b4d92ae66d112ac91f062f1"}, - {file = "grpcio_tools-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:b53db1523015a3acda75722357df6c94afae37f6023800c608e09a5c05393804"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:d08b398509ea4d544bcecddd9a21f59dc556396916c3915904cac206af2db72b"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:09749e832e06493841000275248b031f7154665900d1e1b0e42fc17a64bf904d"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:e972746000aa192521715f776fab617a3437bed29e90fe0e0fd0d0d6f498d7d4"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbeeb3d8ec4cb25c92e17bfbdcef3c3669e85c5ee787a6e581cb942bc0ae2b88"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed8e6632d8d839456332d97b96db10bd2dbf3078e728d063394ac2d54597ad80"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:531f87c8e884c6a2e58f040039dfbfe997a4e33baa58f7c7d9993db37b1f5ad0"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:feca316e17cfead823af6eae0fc20c0d5299a94d71cfb7531a0e92d050a5fb2f"}, - {file = "grpcio_tools-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:41b5dd6a06c2563ac3b3adda6d875b15e63eb7b1629e85fc9af608c3a76c4c82"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:7ec536cdae870a74080c665cfb1dca8d0784a931aa3c26376ef971a3a51b59d4"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:9c106ebbed0db446f59f0efe5c3fce33a0a21bf75b392966585e4b5934891b92"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:32141ef309543a446337e934f0b7a2565a6fca890ff4e543630a09ef72c8d00b"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f2ce5ecd63c492949b03af73b1dd6d502c567cc2f9c2057137e518b0c702a01"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9ce2a209871ed1c5ae2229e6f4f5a3ea96d83b7871df5d9773d72a72545683"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7f0e26af7c07bfa906c91ca9f5932514928a7f032f5f20aecad6b5541037de7e"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:48782727c5cff8b8c96e028a8a58614ff6a37eadc0db85866516210c7aafe9ae"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-win32.whl", hash = "sha256:4a1810bc5de51cc162a19ed3c11da8ddc64d8cfcba049ef337c20fcb397f048b"}, - {file = "grpcio_tools-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:3cf9949a2aadcece3c1e0dd59249aea53dbfc8cc94f7d707797acd67cf6cf931"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:f52e0ce8f2dcf1f160c847304016c446075a83ab925d98933d4681bfa8af2962"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:eb597d6bf9f5bfa54d00546e828f0d4e2c69250d1bc17c27903c0c7b66372135"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:17ef468836d7cf0b2419f4d5c7ac84ec2d598a1ae410773585313edacf7c393e"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dee5f7e7a56177234e61a483c70ca2ae34e73128372c801bb7039993870889f1"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f50ff312b88918c5a6461e45c5e03869749a066b1c24a7327e8e13e117efe4fc"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a85da4200295ee17e3c1ae068189a43844420ed7e9d531a042440f52de486dfb"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f518f22a3082de00f0d7a216e96366a87e6973111085ba1603c3bfa7dba2e728"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-win32.whl", hash = "sha256:6e735a26e8ea8bb89dc69343d1d00ea607449c6d81e21f339ee118562f3d1931"}, - {file = "grpcio_tools-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:3491cb69c909d586c23d7e6d0ac87844ca22f496f505ce429c0d3301234f2cf3"}, -] - -[package.dependencies] -grpcio = ">=1.59.2" -protobuf = ">=4.21.6,<5.0dev" -setuptools = "*" - -[[package]] -name = "grpclib" -version = "0.4.6" -description = "Pure-Python gRPC implementation for asyncio" -optional = false -python-versions = ">=3.7" -files = [ - {file = "grpclib-0.4.6.tar.gz", hash = "sha256:595d05236ca8b8f8e433f5bf6095e6354c1d8777d003ddaf5288efa9611e3fd6"}, -] - -[package.dependencies] -h2 = ">=3.1.0,<5" -multidict = "*" - -[package.extras] -protobuf = ["protobuf (>=3.20.0)"] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "hyperlink" -version = "21.0.0" -description = "A featureful, immutable, and correct URL for Python." -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, - {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, -] - -[package.dependencies] -idna = ">=2.5" - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "incremental" -version = "22.10.0" -description = "\"A small library that versions your Python projects.\"" -optional = false -python-versions = "*" -files = [ - {file = "incremental-22.10.0-py2.py3-none-any.whl", hash = "sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51"}, - {file = "incremental-22.10.0.tar.gz", hash = "sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0"}, -] - -[package.extras] -mypy = ["click (>=6.0)", "mypy (==0.812)", "twisted (>=16.4.0)"] -scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] - -[[package]] -name = "mako" -version = "1.3.0" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -optional = false -python-versions = ">=3.8" -files = [ - {file = "Mako-1.3.0-py3-none-any.whl", hash = "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9"}, - {file = "Mako-1.3.0.tar.gz", hash = "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"}, -] - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["Babel"] -lingua = ["lingua"] -testing = ["pytest"] - -[[package]] -name = "markupsafe" -version = "2.1.3" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "packaging" -version = "23.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] - -[[package]] -name = "pathspec" -version = "0.11.2" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - -[[package]] -name = "platformdirs" -version = "4.0.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, -] - -[package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] - -[[package]] -name = "poethepoet" -version = "0.19.0" -description = "A task runner that works well with poetry." -optional = false -python-versions = ">=3.7" -files = [ - {file = "poethepoet-0.19.0-py3-none-any.whl", hash = "sha256:87038be589077e4b407050a9da644d9cd9e4076ccfc8abc7f855cf6870d5c6c2"}, - {file = "poethepoet-0.19.0.tar.gz", hash = "sha256:897eb85ec15876d79befc7d19d4c80ce7c8b214d1bb0dcfec640abd81616bfed"}, -] - -[package.dependencies] -pastel = ">=0.2.1,<0.3.0" -tomli = ">=1.2.2" - -[package.extras] -poetry-plugin = ["poetry (>=1.0,<2.0)"] - -[[package]] -name = "postgres" -version = "4.0" -description = "postgres is a high-value abstraction over psycopg2." -optional = false -python-versions = "*" -files = [ - {file = "postgres-4.0-py2.py3-none-any.whl", hash = "sha256:d81f757acbde2ca12785b8a3d44c39f1e49782963e84eb67d3e029ad67d6b1d3"}, - {file = "postgres-4.0.tar.gz", hash = "sha256:67c57de10c0d39cd5e3437eef7ac895b2b53747603b3edcd261dedec5ac04d4c"}, -] - -[package.dependencies] -psycopg2-binary = ">=2.8" -psycopg2-pool = "*" - -[[package]] -name = "prometheus-client" -version = "0.17.1" -description = "Python client for the Prometheus monitoring system." -optional = false -python-versions = ">=3.6" -files = [ - {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, - {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, -] - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "proto-plus" -version = "1.22.3" -description = "Beautiful, Pythonic protocol buffers." -optional = false -python-versions = ">=3.6" -files = [ - {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, - {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] - -[[package]] -name = "protobuf" -version = "4.25.0" -description = "" -optional = false -python-versions = ">=3.8" -files = [ - {file = "protobuf-4.25.0-cp310-abi3-win32.whl", hash = "sha256:5c1203ac9f50e4853b0a0bfffd32c67118ef552a33942982eeab543f5c634395"}, - {file = "protobuf-4.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:c40ff8f00aa737938c5378d461637d15c442a12275a81019cc2fef06d81c9419"}, - {file = "protobuf-4.25.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:cf21faba64cd2c9a3ed92b7a67f226296b10159dbb8fbc5e854fc90657d908e4"}, - {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:32ac2100b0e23412413d948c03060184d34a7c50b3e5d7524ee96ac2b10acf51"}, - {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:683dc44c61f2620b32ce4927de2108f3ebe8ccf2fd716e1e684e5a50da154054"}, - {file = "protobuf-4.25.0-cp38-cp38-win32.whl", hash = "sha256:1a3ba712877e6d37013cdc3476040ea1e313a6c2e1580836a94f76b3c176d575"}, - {file = "protobuf-4.25.0-cp38-cp38-win_amd64.whl", hash = "sha256:b2cf8b5d381f9378afe84618288b239e75665fe58d0f3fd5db400959274296e9"}, - {file = "protobuf-4.25.0-cp39-cp39-win32.whl", hash = "sha256:63714e79b761a37048c9701a37438aa29945cd2417a97076048232c1df07b701"}, - {file = "protobuf-4.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:d94a33db8b7ddbd0af7c467475fb9fde0c705fb315a8433c0e2020942b863a1f"}, - {file = "protobuf-4.25.0-py3-none-any.whl", hash = "sha256:1a53d6f64b00eecf53b65ff4a8c23dc95df1fa1e97bb06b8122e5a64f49fc90a"}, - {file = "protobuf-4.25.0.tar.gz", hash = "sha256:68f7caf0d4f012fd194a301420cf6aa258366144d814f358c5b32558228afa7c"}, -] - -[[package]] -name = "psycopg2" -version = "2.9.9" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, - {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, - {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, - {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, - {file = "psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, - {file = "psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, - {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, - {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, - {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, - {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, - {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, - {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, - {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, -] - -[[package]] -name = "psycopg2-binary" -version = "2.9.9" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, -] - -[[package]] -name = "psycopg2-pool" -version = "1.1" -description = "Proper pooling of psycopg2 connections" -optional = false -python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*, != 3.4.*" -files = [ - {file = "psycopg2-pool-1.1.tar.gz", hash = "sha256:de88615c24ddfc7ee314c566976cfed4bbb009211255f2773ea09e5f938ff400"}, - {file = "psycopg2_pool-1.1-py2.py3-none-any.whl", hash = "sha256:529c4100db56a3522cf680ce8d89e71511e37c7e0b1f120ce0dde0f13c6e5844"}, -] - -[package.dependencies] -psycopg2-binary = "*" - -[[package]] -name = "pyasn1" -version = "0.5.0" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.3.0" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" - -[[package]] -name = "pydantic" -version = "1.10.13" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, - {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, - {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, - {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, - {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, - {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, - {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, - {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, - {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, - {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pyright" -version = "1.1.335" -description = "Command line wrapper for pyright" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyright-1.1.335-py3-none-any.whl", hash = "sha256:1149d99d5cea3997010a5ac39611534e0426125d5090913ae5cb1e0e2c9fbca3"}, - {file = "pyright-1.1.335.tar.gz", hash = "sha256:12c09c1644b223515cc342f7d383e55eefeedd730d7875e39a2cf338c2d99be4"}, -] - -[package.dependencies] -nodeenv = ">=1.6.0" - -[package.extras] -all = ["twine (>=3.4.1)"] -dev = ["twine (>=3.4.1)"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-json-logger" -version = "2.0.7" -description = "A python library adding a json log formatter" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, - {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "setuptools" -version = "68.2.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.23" -description = "Database Abstraction Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-win32.whl", hash = "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8"}, - {file = "SQLAlchemy-2.0.23-cp310-cp310-win_amd64.whl", hash = "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, - {file = "SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, - {file = "SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-win32.whl", hash = "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18"}, - {file = "SQLAlchemy-2.0.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-win32.whl", hash = "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306"}, - {file = "SQLAlchemy-2.0.23-cp38-cp38-win_amd64.whl", hash = "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-win32.whl", hash = "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884"}, - {file = "SQLAlchemy-2.0.23-cp39-cp39-win_amd64.whl", hash = "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b"}, - {file = "SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, - {file = "SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.2.0" - -[package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=8)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "twisted" -version = "22.10.0" -description = "An asynchronous networking framework written in Python" -optional = false -python-versions = ">=3.7.1" -files = [ - {file = "Twisted-22.10.0-py3-none-any.whl", hash = "sha256:86c55f712cc5ab6f6d64e02503352464f0400f66d4f079096d744080afcccbd0"}, - {file = "Twisted-22.10.0.tar.gz", hash = "sha256:32acbd40a94f5f46e7b42c109bfae2b302250945561783a8b7a059048f2d4d31"}, -] - -[package.dependencies] -attrs = ">=19.2.0" -Automat = ">=0.8.0" -constantly = ">=15.1" -hyperlink = ">=17.1.1" -incremental = ">=21.3.0" -twisted-iocpsupport = {version = ">=1.0.2,<2", markers = "platform_system == \"Windows\""} -typing-extensions = ">=3.6.5" -"zope.interface" = ">=4.4.2" - -[package.extras] -all-non-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] -conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] -conch-nacl = ["PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "cryptography (>=2.6)", "pyasn1"] -contextvars = ["contextvars (>=2.4,<3)"] -dev = ["coverage (>=6b1,<7)", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "python-subunit (>=1.4,<2.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)"] -dev-release = ["pydoctor (>=22.9.0,<22.10.0)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)"] -gtk-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pygobject", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] -http2 = ["h2 (>=3.0,<5.0)", "priority (>=1.1.0,<2.0)"] -macos-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] -mypy = ["PyHamcrest (>=1.9.0)", "PyNaCl", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "coverage (>=6b1,<7)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "mypy (==0.930)", "mypy-zope (==0.3.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pydoctor (>=22.9.0,<22.10.0)", "pyflakes (>=2.2,<3.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "readthedocs-sphinx-ext (>=2.1,<3.0)", "service-identity (>=18.1.0)", "sphinx (>=5.0,<6)", "sphinx-rtd-theme (>=1.0,<2.0)", "towncrier (>=22.8,<23.0)", "twistedchecker (>=0.7,<1.0)", "types-pyOpenSSL", "types-setuptools"] -osx-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyobjc-core", "pyobjc-framework-CFNetwork", "pyobjc-framework-Cocoa", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] -serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] -test = ["PyHamcrest (>=1.9.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "hypothesis (>=6.0,<7.0)"] -tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] -windows-platform = ["PyHamcrest (>=1.9.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.0.0)", "contextvars (>=2.4,<3)", "cryptography (>=2.6)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.0,<5.0)", "hypothesis (>=6.0,<7.0)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "pyasn1", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)"] - -[[package]] -name = "twisted-iocpsupport" -version = "1.0.4" -description = "An extension for use in the twisted I/O Completion Ports reactor." -optional = false -python-versions = "*" -files = [ - {file = "twisted-iocpsupport-1.0.4.tar.gz", hash = "sha256:858096c0d15e33f15ac157f455d8f86f2f2cdd223963e58c0f682a3af8362d89"}, - {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win32.whl", hash = "sha256:afa2b630797f9ed2f27f3d9f55e3f72b4244911e45a8c82756f44babbf0b243e"}, - {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:0058c963c8957bcd3deda62122e89953c9de1e867a274facc9b15dde1a9f31e8"}, - {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win32.whl", hash = "sha256:196f7c7ccad4ba4d1783b1c4e1d1b22d93c04275cd780bf7498d16c77319ad6e"}, - {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:4e5f97bcbabdd79cbaa969b63439b89801ea560f11d42b0a387634275c633623"}, - {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win32.whl", hash = "sha256:6081bd7c2f4fcf9b383dcdb3b3385d75a26a7c9d2be25b6950c3d8ea652d2d2d"}, - {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:76f7e67cec1f1d097d1f4ed7de41be3d74546e1a4ede0c7d56e775c4dce5dfb0"}, - {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:3d306fc4d88a6bcf61ce9d572c738b918578121bfd72891625fab314549024b5"}, - {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:391ac4d6002a80e15f35adc4ad6056f4fe1c17ceb0d1f98ba01b0f4f917adfd7"}, - {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:0c1b5cf37f0b2d96cc3c9bc86fff16613b9f5d0ca565c96cf1f1fb8cfca4b81c"}, - {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:3c5dc11d72519e55f727320e3cee535feedfaee09c0f0765ed1ca7badff1ab3c"}, - {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win32.whl", hash = "sha256:cc86c2ef598c15d824a243c2541c29459881c67fc3c0adb6efe2242f8f0ec3af"}, - {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c27985e949b9b1a1fb4c20c71d315c10ea0f93fdf3ccdd4a8c158b5926edd8c8"}, - {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win32.whl", hash = "sha256:e311dfcb470696e3c077249615893cada598e62fa7c4e4ca090167bd2b7d331f"}, - {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4574eef1f3bb81501fb02f911298af3c02fe8179c31a33b361dd49180c3e644d"}, - {file = "twisted_iocpsupport-1.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:872747a3b64e2909aee59c803ccd0bceb9b75bf27915520ebd32d69687040fa2"}, - {file = "twisted_iocpsupport-1.0.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c2712b778bacf1db434e3e065adfed3db300754186a29aecac1efae9ef4bcaff"}, - {file = "twisted_iocpsupport-1.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7c66fa0aa4236b27b3c61cb488662d85dae746a6d1c7b0d91cf7aae118445adf"}, - {file = "twisted_iocpsupport-1.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:300437af17396a945a58dcfffd77863303a8b6d9e65c6e81f1d2eed55b50d444"}, -] - -[[package]] -name = "typing-extensions" -version = "4.8.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] - -[[package]] -name = "urllib3" -version = "2.0.7" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.7" -files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "zope-interface" -version = "6.1" -description = "Interfaces for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zope.interface-6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43b576c34ef0c1f5a4981163b551a8781896f2a37f71b8655fd20b5af0386abb"}, - {file = "zope.interface-6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67be3ca75012c6e9b109860820a8b6c9a84bfb036fbd1076246b98e56951ca92"}, - {file = "zope.interface-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b9bc671626281f6045ad61d93a60f52fd5e8209b1610972cf0ef1bbe6d808e3"}, - {file = "zope.interface-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe81def9cf3e46f16ce01d9bfd8bea595e06505e51b7baf45115c77352675fd"}, - {file = "zope.interface-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dc998f6de015723196a904045e5a2217f3590b62ea31990672e31fbc5370b41"}, - {file = "zope.interface-6.1-cp310-cp310-win_amd64.whl", hash = "sha256:239a4a08525c080ff833560171d23b249f7f4d17fcbf9316ef4159f44997616f"}, - {file = "zope.interface-6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ffdaa5290422ac0f1688cb8adb1b94ca56cee3ad11f29f2ae301df8aecba7d1"}, - {file = "zope.interface-6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34c15ca9248f2e095ef2e93af2d633358c5f048c49fbfddf5fdfc47d5e263736"}, - {file = "zope.interface-6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b012d023b4fb59183909b45d7f97fb493ef7a46d2838a5e716e3155081894605"}, - {file = "zope.interface-6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97806e9ca3651588c1baaebb8d0c5ee3db95430b612db354c199b57378312ee8"}, - {file = "zope.interface-6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddbab55a2473f1d3b8833ec6b7ac31e8211b0aa608df5ab09ce07f3727326de"}, - {file = "zope.interface-6.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0da79117952a9a41253696ed3e8b560a425197d4e41634a23b1507efe3273f1"}, - {file = "zope.interface-6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8bb9c990ca9027b4214fa543fd4025818dc95f8b7abce79d61dc8a2112b561a"}, - {file = "zope.interface-6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b51b64432eed4c0744241e9ce5c70dcfecac866dff720e746d0a9c82f371dfa7"}, - {file = "zope.interface-6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa6fd016e9644406d0a61313e50348c706e911dca29736a3266fc9e28ec4ca6d"}, - {file = "zope.interface-6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c8cf55261e15590065039696607f6c9c1aeda700ceee40c70478552d323b3ff"}, - {file = "zope.interface-6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e30506bcb03de8983f78884807e4fd95d8db6e65b69257eea05d13d519b83ac0"}, - {file = "zope.interface-6.1-cp312-cp312-win_amd64.whl", hash = "sha256:e33e86fd65f369f10608b08729c8f1c92ec7e0e485964670b4d2633a4812d36b"}, - {file = "zope.interface-6.1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:2f8d89721834524a813f37fa174bac074ec3d179858e4ad1b7efd4401f8ac45d"}, - {file = "zope.interface-6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13b7d0f2a67eb83c385880489dbb80145e9d344427b4262c49fbf2581677c11c"}, - {file = "zope.interface-6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef43ee91c193f827e49599e824385ec7c7f3cd152d74cb1dfe02cb135f264d83"}, - {file = "zope.interface-6.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e441e8b7d587af0414d25e8d05e27040d78581388eed4c54c30c0c91aad3a379"}, - {file = "zope.interface-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89b28772fc2562ed9ad871c865f5320ef761a7fcc188a935e21fe8b31a38ca9"}, - {file = "zope.interface-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70d2cef1bf529bff41559be2de9d44d47b002f65e17f43c73ddefc92f32bf00f"}, - {file = "zope.interface-6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ad54ed57bdfa3254d23ae04a4b1ce405954969c1b0550cc2d1d2990e8b439de1"}, - {file = "zope.interface-6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef467d86d3cfde8b39ea1b35090208b0447caaabd38405420830f7fd85fbdd56"}, - {file = "zope.interface-6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af47f10cfc54c2ba2d825220f180cc1e2d4914d783d6fc0cd93d43d7bc1c78b"}, - {file = "zope.interface-6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9559138690e1bd4ea6cd0954d22d1e9251e8025ce9ede5d0af0ceae4a401e43"}, - {file = "zope.interface-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:964a7af27379ff4357dad1256d9f215047e70e93009e532d36dcb8909036033d"}, - {file = "zope.interface-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:387545206c56b0315fbadb0431d5129c797f92dc59e276b3ce82db07ac1c6179"}, - {file = "zope.interface-6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57d0a8ce40ce440f96a2c77824ee94bf0d0925e6089df7366c2272ccefcb7941"}, - {file = "zope.interface-6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ebc4d34e7620c4f0da7bf162c81978fce0ea820e4fa1e8fc40ee763839805f3"}, - {file = "zope.interface-6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a804abc126b33824a44a7aa94f06cd211a18bbf31898ba04bd0924fbe9d282d"}, - {file = "zope.interface-6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f294a15f7723fc0d3b40701ca9b446133ec713eafc1cc6afa7b3d98666ee1ac"}, - {file = "zope.interface-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a41f87bb93b8048fe866fa9e3d0c51e27fe55149035dcf5f43da4b56732c0a40"}, - {file = "zope.interface-6.1.tar.gz", hash = "sha256:2fdc7ccbd6eb6b7df5353012fbed6c3c5d04ceaca0038f75e601060e95345309"}, -] - -[package.dependencies] -setuptools = "*" - -[package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "22e5385ff4ec33841cfe834011112c2304f4f515d1fd6b524226bb10cc255f77" diff --git a/python/processors/README.md b/python/processors/README.md deleted file mode 100644 index 9ec068ba6..000000000 --- a/python/processors/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Examples: Python - -This directory contains examples of processors written in Python. Below you can find a brief description of each processor. - -## Example Event Processor - -This is a simple example that processes transaction events and inserts the event's data to a database. This example includes - -- Processor: Shows an example of processing and parsing events from a transaction -- Database: Writes event's data to a Postgres DB - -## Aptos Tontine - -This example demonstrates the simplest possible variant of a processor. There are three parts: - -- Processor: Processes transactions and writes to the DB based on events. -- Database: It uses sqlite so there are no external dependencies / processes. -- API: Exposes a Flask based API for querying data from the DB. - -It also demonstrates a parser function that outputs operations to create, update, and delete rows. - -This processor is part of a full Aptos project, so you can see the processor in context alongside the Move module and frontend. - -## Aptos Ambassador Token - -This example demonstrates how to track changes on the attribute (e.g., ambassador level) of the [Aptos ambassador token](https://github.com/aptos-labs/aptos-core/tree/main/aptos-move/move-examples/token_objects/ambassador/move). This example includes - -- Processor: Processes transactions and detects changes on the ambassador level in the events & writesets of the transactions -- Database: No database operation is demonstrated for the simplicity sake. The changes found are simply printed out in the console. - -When an existing token's level changes, the smart contract is programmed to emit an event (e.g., LevelUpdateEvent). So, the level change can be observed both in the transaction's event and writeset redundantly. - -To run: -``` -$ cd aptos-indexer-processors/python -$ poetry run python -m processors.aptos_ambassador_token.processor -c config.yaml -``` diff --git a/python/processors/__init__.py b/python/processors/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/python/processors/aptos-tontine b/python/processors/aptos-tontine deleted file mode 160000 index 88f20afd0..000000000 --- a/python/processors/aptos-tontine +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 88f20afd023d5b3b4313b4cbe2404c769513cff5 diff --git a/python/processors/aptos_ambassador_token/processor.py b/python/processors/aptos_ambassador_token/processor.py deleted file mode 100644 index 8d2e9d091..000000000 --- a/python/processors/aptos_ambassador_token/processor.py +++ /dev/null @@ -1,92 +0,0 @@ -import argparse -import grpc -import ast -import json - -from aptos_protos.aptos.indexer.v1 import raw_data_pb2_grpc -from aptos_protos.aptos.indexer.v1 import raw_data_pb2 -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from utils.processor_name import ProcessorName -from utils.config import Config -from utils.general_utils import standardize_address -from utils.transactions_processor import TransactionsProcessor, ProcessingResult -from utils.models.schema_names import EXAMPLE -from time import perf_counter - -qualified_module_name = ( - "0x9bfdd4efe15f4d8aa145bef5f64588c7c391bcddaf34f9e977f59bd93b498f2a::ambassador" -) -qualified_event_name = qualified_module_name + "::LevelUpdateEvent" -qualified_resource_name = qualified_module_name + "::AmbassadorLevel" - - -class AptosAmbassadorTokenProcessor(TransactionsProcessor): - def name(self) -> str: - return ProcessorName.EXAMPLE_AMBASSADOR_TOKEN_PROCESSOR.value - - def schema(self) -> str: - return EXAMPLE - - def process_transactions( - self, - transactions: list[transaction_pb2.Transaction], - start_version: int, - end_version: int, - ) -> ProcessingResult: - start_time = perf_counter() - for transaction in transactions: - found = False - if transaction.type == transaction_pb2.Transaction.TRANSACTION_TYPE_USER: - for event in transaction.user.events: - addr = standardize_address(event.key.account_address) - type = event.type_str - data = event.data - if type == qualified_event_name: - found = True - print("-------------") - print("Event emitted") - print("-------------") - print("ambassador token addr:", addr) - data_dic = ast.literal_eval(data) - print("old_level:", data_dic["old_level"]) - print("new_level:", data_dic["new_level"]) - print() - - for change in transaction.info.changes: - if ( - change.type - == transaction_pb2.WriteSetChange.TYPE_WRITE_RESOURCE - ): - addr = standardize_address(change.write_resource.address) - type = change.write_resource.type_str - data = change.write_resource.data - if type == qualified_resource_name: - found = True - print("-------------") - print("State changed") - print("-------------") - print("ambassador token addr:", addr) - data_dic = ast.literal_eval(data) - print("ambassador_level:", data_dic["ambassador_level"]) - print() - - if found: - print( - "Found from the transaction with:", - json.dumps( - { - "version": transaction.version, - "epoch": transaction.epoch, - "block_height": transaction.block_height, - } - ), - ) - print("\n\n") - duration_in_secs = perf_counter() - start_time - return ProcessingResult( - start_version=start_version, - end_version=end_version, - processing_duration_in_secs=duration_in_secs, - # No db insertion. - db_insertion_duration_in_secs=0, - ) diff --git a/python/processors/coin_flip/README.md b/python/processors/coin_flip/README.md deleted file mode 100644 index b5c3e70dd..000000000 --- a/python/processors/coin_flip/README.md +++ /dev/null @@ -1,371 +0,0 @@ -# Creating a Custom Indexer Processor - -In this tutorial, we're going to walk you through all the steps involved with creating a very basic custom indexer processor to track events and data on the Aptos blockchain. - -We use a very simple smart contract called **Coin Flip** that has already emitted events for us. - -The smart contract is already deployed, and you mostly don't need to understand it unless you're curious to mess with it or change things. It's located in the `python/processors/coin_flip/move` folder. - -We've provided the example code for the modules involved. This tutorial assumes you've set up your environment and already have the following: - -- An API key for the GRPC backend. If you do not have one, you should use your API gateway to obtain one [here](https://github.com/aptos-labs/aptos-indexer-processors) -- The [Aptos CLI](https://aptos.dev/tools/aptos-cli/) -- [Python](https://www.python.org/downloads/) and [Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer) -- This cloned repository on your local machine `https://github.com/aptos-labs/aptos-indexer-processors` - -We use postgresql as our database in this tutorial. You're free to use whatever you want, but this tutorial is geared towards postgresql for the sake of simplicity. We use the following database configuration and tools: -- [Postgresql](https://www.postgresql.org/download/) - - We will use a database hosted on `localhost` on the port `5432`, which should be the default - - When you create your username, keep track of it and the password you use for it - - You can view a tutorial for installing postgresql and psql [here](https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-22-04-quickstart) tool to set up your database more quickly - - If you want to easily view your database data, consider using a GUI like [DBeaver](https://dbeaver.io/) or [pgAdmin](https://www.pgadmin.org/) - -Explaining how to create a database is beyond the scope of this tutorial, so if you don't know how to do it, you could check out tutorials on how to create a database with the `psql` tool. - -## Setup your environment - -### Setup the postgresql database - -Make sure to start the `postgresql` service: - -The command for Linux/WSL might be something like: - -```shell -sudo service postgresql start -``` - -For mac, if you're using brew, start it up with: - -```shell -brew services start postgresql -``` - -Create your database with the name `coin_flip`, where our username is `user` and our password is `password`. - -If your database is set up correctly, and you have the `psql` tool, you should be able to run the command `psql -d coin_flip`. - -### Setup your local environment with poetry and grpc - -If you haven't yet, make sure to read the main indexer [README guide](https://github.com/aptos-labs/aptos-indexer-processors). - -You can also check out the python-specific broad overview of how to create an indexer processor [here](https://github.com/aptos-labs/aptos-indexer-processors/tree/main/python). - -At the very least, make sure to install these tools and setup your poetry environment: - -```shell -pip install grpcio-tools -poetry install - -python3 -m grpc_tools.protoc --proto_path=./proto --python_out=python --pyi_out=python --grpc_python_out=python \ - proto/aptos/bigquery_schema/v1/transaction.proto \ - proto/aptos/indexer/v1/raw_data.proto \ - proto/aptos/internal/fullnode/v1/fullnode_data.proto \ - proto/aptos/transaction/v1/transaction.proto \ - proto/aptos/util/timestamp/timestamp.proto -``` - -## Configure your indexer processor - -Now let's setup the configuration details for the actual indexer processor we're going to use. - -### Setup your config.yaml file - -Copy the contents below and save it to a file called `config.yaml`. Save it in the `coin_flip` folder. Your file directory structure should look something like this: - -``` -- indexer - - proto - - python - - aptos_ambassador_token - - aptos-tontine - - coin_flip - - move - - sources - - coin_flip.move - - package_manager.move - - Move.toml - - config.yaml <-------- Edit this config.yaml file - - models.py - - processor.py - - README.md - - example_event_processor - - nft_marketplace_v2 - - nft_orderbooks - __init__.py - main.py - README.md - - rust - - scripts - - typescript -``` - -Once you have your config.yaml file open, you only need to change one field, if you just want to run the processor as is: -```yaml -grpc_data_stream_api_key: "" -``` - -### More customization with config.yaml - -However, if you'd like to customize things further, you can change some of the other fields. - -If you'd like to start at a specific version, you can specify that in the config.yaml file with: -```yaml -starting_version_default: 123456789 -``` - -This is the transaction version the indexer starts looking for events at. If the indexer has already processed transactions past this version, **it will skip all of them and go to the latest version stored.** - -The rows in `next_versions_to_process` are the `indexer_name` as the primary key and the `next_version` to process field, along with the `updated_at`. - -If you want to **force** the indexer to backfill data (overwrite/rewrite data) from previous versions even though it's already indexed past it, you can specify this in the config.yaml file with: - -```yaml -starting_version_backfill: 123456789 -``` - -If you want to use a different network, change the `grpc_data_stream_endpoint` field to the corresponding desired value: - -```yaml -devnet: 35.225.218.95:50051 -testnet: 35.223.137.149:50051 # north america -testnet: 34.64.252.224:50051 # asia -mainnet: 34.30.218.153:50051 -``` - -If these ip addresses don't work for you, they might be outdated. Check out the `README.md` at the root folder of the repository for the latest endpoints. - -If you're using a different database name or processor name, change the `processor_name` field and the `db_connection_uri` to your specific needs. Here's the general structure of the field: - -```yaml -db_connection_uri: "postgresql://username:password@database_url:port_number/database_name" -``` - -### Add your processor & schema names to the configuration files - -First, let's create the name for the database schema we're going to use. We use `coin_flip` in our example, so we need to add it in two places: - -1. We need to add it to our `python/utils/processor_name.py` file: -```python - class ProcessorName(Enum): - EXAMPLE_EVENT_PROCESSOR = "python_example_event_processor" - NFT_MARKETPLACE_V1_PROCESSOR = "nft_marketplace_v1_processor" - NFT_MARKETPLACE_V2_PROCESSOR = "nft_marketplace_v2_processor" - COIN_FLIP = "coin_flip" -``` -2. Add it to the constructor in the `IndexerProcessorServer` match cases in `utils/worker.py`: - -```python -match self.config.processor_name: - case ProcessorName.EXAMPLE_EVENT_PROCESSOR.value: - self.processor = ExampleEventProcessor() - case ProcessorName.NFT_MARKETPLACE_V1_PROCESSOR.value: - self.processor = NFTMarketplaceProcesser() - case ProcessorName.NFT_MARKETPLACE_V2_PROCESSOR.value: - self.processor = NFTMarketplaceV2Processor() - case ProcessorName.COIN_FLIP.value: - self.processor = CoinFlipProcessor() -``` - -3. Add it to the `python/utils/models/schema_names.py` file: - -```python -EXAMPLE = "example" -NFT_MARKETPLACE_SCHEMA_NAME = "nft_marketplace" -NFT_MARKETPLACE_V2_SCHEMA_NAME = "nft_marketplace_v2" -COIN_FLIP_SCHEMA_NAME = "coin_flip" -``` - -### Explanation of the event emission in the Move contract - -In our Move contract (in `coin_flip/move/sources/coin_flip.move`), each user has an object associated with their account. The object has a `CoinFlipStats` resource on it that tracks the total number of wins and losses a user has and is in charge of emitting events. - -```rust -// CoinFlipStats object/resource definition -#[resource_group_member(group = aptos_framework::object::ObjectGroup)] -struct CoinFlipStats has key { - wins: u64, - losses: u64, - event_handle: EventHandle, // - delete_ref: DeleteRef, -} - -// event emission in `flip_coin` -fun flip_coin( - user: &signer, - prediction: bool, - nonce: u64, -) acquires CoinFlipStats { - // ... - let (heads, correct_prediction) = flip(prediction, nonce); - - if (correct_prediction) { - coin_flip_stats.wins = coin_flip_stats.wins + 1; - } else { - coin_flip_stats.losses = coin_flip_stats.losses + 1; - }; - - event::emit_event( - &mut coin_flip_stats.event_handle, - CoinFlipEvent { - prediction: prediction, - result: heads, - wins: coin_flip_stats.wins, - losses: coin_flip_stats.losses, - } - ); -} -``` -The events emitted are of type `CoinFlipEvent`, shown below: -```rust -struct CoinFlipEvent has copy, drop, store { - prediction: bool, // true = heads, false = tails - result: bool, - wins: u64, - losses: u64, -} -``` - -### Viewing and understanding how the event data is emitted and processed - -When we submit a transaction that calls the `coin_flip` entry function, the indexer parses the events and records the data of each event that occurred in the transaction. - -Within the `data` field of each `Event` type, we see the arbitrary event data emitted. We use this data to store the event data in our database. - -The processor loops over each event in each transaction to process all event data. There are a *lot* of various types of events that can occur in a transaction- so we need to write a filtering function to deal with various events we don't want to store in our database. - -This is the simple iterative structure for our event List: - -```python -for event_index, event in enumerate(user_transaction.events): - # Skip events that don't match our filter criteria - if not CoinFlipProcessor.included_event_type(event.type_str): - continue -``` - -where the `included_event_type` function is a static method in our `CoinFlipProcessor` class: - -```python -@staticmethod -def included_event_type(event_type: str) -> bool: - parsed_tag = event_type.split("::") - module_address = parsed_tag[0] - module_name = parsed_tag[1] - event_type = parsed_tag[2] - # Now we can filter out events that are not of type CoinFlipEvent - # We can filter by the module address, module name, and event type - # If someone deploys a different version of our contract with the same event type, we may want to index it one day. - # So we could only check the event type instead of the full string - # For our sake, check the full string - return ( - module_address - == "0xe57752173bc7c57e9b61c84895a75e53cd7c0ef0855acd81d31cb39b0e87e1d0" - and module_name == "coin_flip" - and event_type == "CoinFlipEvent" - ) -``` - -If you wanted to see the event data for yourself inside the processor loop, you could add something like this to your `processor.py` file: - -```python -for event_index, event in enumerate(user_transaction.events): - # Skip events that don't match our filter criteria - if not CoinFlipProcessor.included_event_type(event.type_str): - continue - - # ... - - # Load the data into a json object and then use/view it as a regular dictionary - data = json.loads(event.data) - print(json.dumps(data, indent=3)) -``` -In our case, a single event prints this out: - - -```json -{ - 'losses': '49', - 'prediction': False, - 'result': True, - 'wins': '51' -} -``` - -So we'll get our data like this: - -```python -prediction = bool(data["prediction"]) -result = bool(data["result"]) -wins = int(data["wins"]) -losses = int(data["losses"]) - -# We have extra data to insert into the database, because we want to process our data. -# Calculate the total -win_percentage = wins / (wins + losses) -``` - -And then we add it to our event list with this: - -```python -# Create an instance of CoinFlipEvent -event_db_obj = CoinFlipEvent( - sequence_number=sequence_number, - creation_number=creation_number, - account_address=account_address, - transaction_version=transaction_version, - transaction_timestamp=transaction_timestamp, - prediction=prediction, - result=result, - wins=wins, - losses=losses, - win_percentage=win_percentage, - inserted_at=datetime.now(), - event_index=event_index, # when multiple events of the same type are emitted in a single transaction, this is the index of the event in the transaction -) -event_db_objs.append(event_db_obj) -``` -### Creating your database model - -Now that we know how we store our CoinFlipEvents in our database, let's go backwards a bit and clarify how we *create* this model for the database to use. - -We need to structure the `CoinFlipEvent` class in `models.py` to reflect the structure in our Move contract: - -```python -class CoinFlipEvent(Base): - __tablename__ = "coin_flip_events" - __table_args__ = ({"schema": COIN_FLIP_SCHEMA_NAME},) - - sequence_number: BigIntegerPrimaryKeyType - creation_number: BigIntegerPrimaryKeyType - account_address: StringPrimaryKeyType - prediction: BooleanType # from (event.data["prediction"] - result: BooleanType # from (event.data["result"] - wins: BigIntegerType # from (event.data["wins"] - losses: BigIntegerType # from (event.data["losses"] - win_percentage: NumericType # calculated from the above - transaction_version: BigIntegerType - transaction_timestamp: TimestampType - inserted_at: InsertedAtType - event_index: BigIntegerType -``` - -The unmarked fields are from the default event data for every event emitted on Aptos. The marked fields are specifically from the fields we calculated above. - -The other fields, __tablename__ and __table_args__, are indications to the python SQLAlchemy library as to what database and schema name we are using. - -## Running the indexer processor - -Now that we have our configuration files and our database and the python database model set up, we can run our processor. - -Navigate to the `python` directory of your indexer repository: - -```shell -cd ~/indexer/python -``` - -And then run the following command: - -```shell -poetry run python -m processors.main -c processors/coin_flip/config.yaml -``` - -If you're processing events correctly, the events should now show up in your database. diff --git a/python/processors/coin_flip/models.py b/python/processors/coin_flip/models.py deleted file mode 100644 index abc9d5db9..000000000 --- a/python/processors/coin_flip/models.py +++ /dev/null @@ -1,30 +0,0 @@ -from utils.models.annotated_types import StringType -from utils.models.annotated_types import ( - BooleanType, - StringPrimaryKeyType, - BigIntegerType, - BigIntegerPrimaryKeyType, - InsertedAtType, - TimestampType, - NumericType, -) -from utils.models.general_models import Base -from utils.models.schema_names import COIN_FLIP_SCHEMA_NAME - - -class CoinFlipEvent(Base): - __tablename__ = "coin_flip_events" - __table_args__ = ({"schema": COIN_FLIP_SCHEMA_NAME},) - - sequence_number: BigIntegerPrimaryKeyType - creation_number: BigIntegerPrimaryKeyType - account_address: StringPrimaryKeyType - prediction: BooleanType - result: BooleanType - wins: BigIntegerType - losses: BigIntegerType - win_percentage: NumericType - transaction_version: BigIntegerType - transaction_timestamp: TimestampType - inserted_at: InsertedAtType - event_index: BigIntegerType diff --git a/python/processors/coin_flip/move/Move.toml b/python/processors/coin_flip/move/Move.toml deleted file mode 100644 index c7f0e5756..000000000 --- a/python/processors/coin_flip/move/Move.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "Coin Flip" -version = "0.0.1" - -[addresses] -deployer = "_" -coin_flip = "_" - -[dev-addresses] -deployer = "0x2b9b1704c56ae52555383c2d0bd16bedacb761bbda67dc63f9d234ab79399c95" -coin_flip = "0x33cf54b3cb66c618d7eb830e79d2d01a57112bc87b86d87d60630b7a0a5ad4a6" - -[dependencies.AptosFramework] -git = "https://github.com/aptos-labs/aptos-core.git" -rev = "devnet" -subdir = "aptos-move/framework/aptos-framework" - -[dependencies.AptosTokenObjects] -git = "https://github.com/aptos-labs/aptos-core.git" -rev = "devnet" -subdir = "aptos-move/framework/aptos-token-objects" diff --git a/python/processors/coin_flip/move/sources/coin_flip.move b/python/processors/coin_flip/move/sources/coin_flip.move deleted file mode 100644 index 39e80fcb2..000000000 --- a/python/processors/coin_flip/move/sources/coin_flip.move +++ /dev/null @@ -1,151 +0,0 @@ -module coin_flip::coin_flip { - use aptos_framework::object::{Self, Object, DeleteRef}; - use aptos_framework::timestamp; - use aptos_framework::account; - use aptos_framework::transaction_context; - use std::event::{Self, EventHandle}; - use std::signer; - use std::error; - use std::vector; - use coin_flip::package_manager; - - /// The contract should never be able to reach this state. - const EINVALID_CONTRACT_STATE: u64 = 0; - - #[resource_group_member(group = aptos_framework::object::ObjectGroup)] - /// A resource stored at an object that tracks a user's coin flip stats - /// It also handles the event emission of each flip. - struct CoinFlipStats has key { - wins: u64, - losses: u64, - event_handle: EventHandle, - delete_ref: DeleteRef, - } - - struct CoinFlipEvent has copy, drop, store { - prediction: bool, // true = heads, false = tails - result: bool, - wins: u64, - losses: u64, - } - - /// Private entry to disallow gaming the results by aborting in a Move script - entry fun flip_many( - user: &signer, - prediction: vector, - ) acquires CoinFlipStats { - vector::enumerate_ref(&prediction, |i, pred| { - flip_coin(user, *pred, i); - }); - } - - /// Private entry to disallow gaming the results by aborting in a Move script - entry fun flip_once( - user: &signer, - prediction: bool, - ) acquires CoinFlipStats { - flip_coin(user, prediction, 0); - } - - fun flip_coin( - user: &signer, - prediction: bool, - nonce: u64, - ) acquires CoinFlipStats { - let user_address = signer::address_of(user); - let stats_object = get_user_stats(user_address); - let coin_flip_stats = borrow_global_mut(object::object_address(&stats_object)); - - let (heads, correct_prediction) = flip(prediction, nonce); - - if (correct_prediction) { - coin_flip_stats.wins = coin_flip_stats.wins + 1; - } else { - coin_flip_stats.losses = coin_flip_stats.losses + 1; - }; - - event::emit_event( - &mut coin_flip_stats.event_handle, - CoinFlipEvent { - prediction: prediction, - result: heads, - wins: coin_flip_stats.wins, - losses: coin_flip_stats.losses, - } - ); - } - - inline fun flip( - prediction: bool, - nonce: u64, - ): (bool, bool) { - let txn_hash = transaction_context::get_transaction_hash(); - let now = timestamp::now_microseconds(); - - // Pseudo-random number calculated by current microseconds + the first byte of the transaction hash + the nonce to allow for multiple flips in a single tx. - let prng = now + nonce + (*vector::borrow(&txn_hash, 0) as u64); - - // Even = heads, odd = tails - let result = prng % 2 == 0; - - (result, prediction == result) - } - - #[view] - public fun get_user_stats(user_address: address): Object { - // look up the user's address and see if a corresponding object address exists already - let named_address = package_manager::address_to_string(user_address); - - // if it does, return the object - if (package_manager::named_address_exists(named_address)) { - let obj_address = package_manager::get_named_address(named_address); - assert!(exists(obj_address), error::invalid_state(EINVALID_CONTRACT_STATE)); - object::address_to_object(obj_address) - } else { - // otherwise create it and return it - let stats_object = create_user_stats(user_address); - package_manager::add_named_address(named_address, object::object_address(&stats_object)); - stats_object - - } - } - - fun create_user_stats(user_address: address): Object { - let constructor_ref = object::create_object(user_address); - let delete_ref = object::generate_delete_ref(&constructor_ref); - let obj_signer = object::generate_signer(&constructor_ref); - - // object needs to have an Account resource so it can create an event handle successfully - aptos_framework::aptos_account::create_account(signer::address_of(&obj_signer)); - move_to( - &obj_signer, - CoinFlipStats { - wins: 0, - losses: 0, - event_handle: account::new_event_handle(&obj_signer), - delete_ref: delete_ref, - } - ); - - let stats_object = object::object_from_constructor_ref(&constructor_ref); - stats_object - } - - #[test(deployer = @deployer, resource_signer = @coin_flip, aptos_framework = @0x1)] - fun test( - deployer: &signer, - resource_signer: &signer, - aptos_framework: &signer, - ) acquires CoinFlipStats { - timestamp::set_time_has_started_for_testing(aptos_framework); - package_manager::enable_auids_for_test(aptos_framework); - package_manager::init_for_test(deployer, resource_signer); - - flip_many(deployer, vector [true, false, true, false, true, false, true, false, true, false]); - flip_many(deployer, vector [true, false, true, false, true, false, true, false, true, false]); - flip_many(deployer, vector [true, false, true, false, true, false, true, false, true, false]); - flip_many(deployer, vector [true, false, true, false, true, false, true, false, true, false]); - std::debug::print(&get_user_stats(signer::address_of(deployer))); - std::debug::print(borrow_global(object::object_address(&get_user_stats(signer::address_of(deployer))))); - } -} \ No newline at end of file diff --git a/python/processors/coin_flip/move/sources/package_manager.move b/python/processors/coin_flip/move/sources/package_manager.move deleted file mode 100644 index c09d37da1..000000000 --- a/python/processors/coin_flip/move/sources/package_manager.move +++ /dev/null @@ -1,104 +0,0 @@ -module coin_flip::package_manager { - use aptos_framework::account::{Self, SignerCapability}; - use aptos_framework::resource_account; - use aptos_std::smart_table::{Self, SmartTable}; - use std::string::String; - use aptos_std::code; - use std::error; - use std::signer; - friend coin_flip::coin_flip; - - /// The signer is not authorized to deploy this module. - const ENOT_AUTHORIZED: u64 = 0; - - /// Stores permission config such as SignerCapability for controlling the resource account. - struct PermissionConfig has key { - /// Required to obtain the resource account signer. - signer_cap: SignerCapability, - /// Track the addresses created by the modules in this package. - addresses: SmartTable, - } - - /// Initialize PermissionConfig to establish control over the resource account. - /// This function is invoked only when this package is deployed the first time. - fun init_module(resource_signer: &signer) { - let signer_cap = resource_account::retrieve_resource_account_cap(resource_signer, @deployer); - move_to(resource_signer, PermissionConfig { - addresses: smart_table::new(), - signer_cap, - }); - } - - public entry fun publish_package( - deployer: &signer, - package_metadata: vector, - code: vector>, - ) acquires PermissionConfig { - assert!(signer::address_of(deployer) == @deployer, error::permission_denied(ENOT_AUTHORIZED)); - code::publish_package_txn(&get_signer(), package_metadata, code); - } - - /// Can be called by friended modules to obtain the resource account signer. - public(friend) fun get_signer(): signer acquires PermissionConfig { - let signer_cap = &borrow_global(@coin_flip).signer_cap; - account::create_signer_with_capability(signer_cap) - } - - /// Can be called by friended modules to keep track of a system address. - public(friend) fun add_named_address(name: String, object: address) acquires PermissionConfig { - let addresses = &mut borrow_global_mut(@coin_flip).addresses; - smart_table::add(addresses, name, object); - } - - /// Can be called by friended modules to keep track of a system address. - public(friend) fun remove_named_address(name: String) acquires PermissionConfig { - let addresses = &mut borrow_global_mut(@coin_flip).addresses; - smart_table::remove(addresses, name); - } - - public fun address_to_string(addr: address): String { - std::string_utils::to_string_with_canonical_addresses(&addr) - } - - public fun named_address_exists(name: String): bool acquires PermissionConfig { - smart_table::contains(&safe_permission_config().addresses, name) - } - - #[view] - public fun get_named_address(name: String): address acquires PermissionConfig { - let addresses = &borrow_global(@coin_flip).addresses; - *smart_table::borrow(addresses, name) - } - - inline fun safe_permission_config(): &PermissionConfig acquires PermissionConfig { - borrow_global(@coin_flip) - } - - public(friend) inline fun assert_deployer(deployer: &signer) { - assert!(signer::address_of(deployer) == @deployer, error::permission_denied(ENOT_AUTHORIZED)); - } - - public(friend) inline fun assert_deployer_and_get_signer(deployer: &signer): signer { - assert_deployer(deployer); - get_signer() - } - - #[test_only] - public fun enable_auids_for_test(aptos_framework: &signer) { - use std::features; - - let feature = features::get_auids(); - features::change_feature_flags(aptos_framework, vector[feature], vector[]); - } - - #[test_only] - public fun init_for_test( - deployer: &signer, - resource_signer: &signer, - ) { - account::create_account_for_test(signer::address_of(deployer)); - account::create_account_for_test(signer::address_of(resource_signer)); - resource_account::create_resource_account(deployer, b"", b""); - init_module(resource_signer); - } -} diff --git a/python/processors/coin_flip/processor.py b/python/processors/coin_flip/processor.py deleted file mode 100644 index ee7731181..000000000 --- a/python/processors/coin_flip/processor.py +++ /dev/null @@ -1,126 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from processors.coin_flip.models import CoinFlipEvent -from typing import List -from utils.transactions_processor import ProcessingResult -from utils import general_utils -from utils.transactions_processor import TransactionsProcessor -from utils.models.schema_names import COIN_FLIP_SCHEMA_NAME -from utils.session import Session -from utils.processor_name import ProcessorName -import json -from datetime import datetime -from time import perf_counter - -MODULE_ADDRESS = general_utils.standardize_address( - "0xe57752173bc7c57e9b61c84895a75e53cd7c0ef0855acd81d31cb39b0e87e1d0" -) - - -class CoinFlipProcessor(TransactionsProcessor): - def name(self) -> str: - return ProcessorName.COIN_FLIP.value - - def schema(self) -> str: - return COIN_FLIP_SCHEMA_NAME - - def process_transactions( - self, - transactions: list[transaction_pb2.Transaction], - start_version: int, - end_version: int, - ) -> ProcessingResult: - event_db_objs: List[CoinFlipEvent] = [] - start_time = perf_counter() - for transaction in transactions: - # Custom filtering - # Here we filter out all transactions that are not of type TRANSACTION_TYPE_USER - if transaction.type != transaction_pb2.Transaction.TRANSACTION_TYPE_USER: - continue - - # Parse Transaction struct - transaction_version = transaction.version - transaction_block_height = transaction.block_height - transaction_timestamp = general_utils.parse_pb_timestamp( - transaction.timestamp - ) - user_transaction = transaction.user - - # Parse CoinFlipEvent struct - for event_index, event in enumerate(user_transaction.events): - # Skip events that don't match our filter criteria - if not CoinFlipProcessor.included_event_type(event.type_str): - continue - - creation_number = event.key.creation_number - sequence_number = event.sequence_number - account_address = general_utils.standardize_address( - event.key.account_address - ) - - # Convert your on-chain data scheme to database-friendly values - # Our on-chain struct looks like this: - # struct CoinFlipEvent has copy, drop, store { - # prediction: bool, - # result: bool, - # timestamp: u64, - # } - # These values are stored in the `data` field of the event as JSON fields/values - # Load the data into a json object and then use it as a regular dictionary - data = json.loads(event.data) - prediction = bool(data["prediction"]) - result = bool(data["result"]) - wins = int(data["wins"]) - losses = int(data["losses"]) - - # We have extra data to insert into the database, because we want to process our data. - # Calculate the total - win_percentage = wins / (wins + losses) - - # Create an instance of CoinFlipEvent - event_db_obj = CoinFlipEvent( - sequence_number=sequence_number, - creation_number=creation_number, - account_address=account_address, - transaction_version=transaction_version, - transaction_timestamp=transaction_timestamp, - losses=losses, - prediction=prediction, - result=result, - wins=wins, - win_percentage=win_percentage, - event_index=event_index, # when multiple events of the same type are emitted in a single transaction, this is the index of the event in the transaction - ) - event_db_objs.append(event_db_obj) - - processing_duration_in_secs = perf_counter() - start_time - start_time = perf_counter() - self.insert_to_db(event_db_objs) - db_insertion_duration_in_secs = perf_counter() - start_time - return ProcessingResult( - start_version=start_version, - end_version=end_version, - processing_duration_in_secs=processing_duration_in_secs, - db_insertion_duration_in_secs=db_insertion_duration_in_secs, - ) - - def insert_to_db(self, parsed_objs: List[CoinFlipEvent]) -> None: - with Session() as session, session.begin(): - for obj in parsed_objs: - session.merge(obj) - - @staticmethod - def included_event_type(event_type: str) -> bool: - parsed_tag = event_type.split("::") - module_address = general_utils.standardize_address(parsed_tag[0]) - module_name = parsed_tag[1] - event_type = parsed_tag[2] - # Now we can filter out events that are not of type CoinFlipEvent - # We can filter by the module address, module name, and event type - # If someone deploys a different version of our contract with the same event type, we may want to index it one day. - # So we could only check the event type instead of the full string - # For our sake, check the full string - return ( - module_address == MODULE_ADDRESS - and module_name == "coin_flip" - and event_type == "CoinFlipEvent" - ) diff --git a/python/processors/example_event_processor/models.py b/python/processors/example_event_processor/models.py deleted file mode 100644 index 42c94bbd4..000000000 --- a/python/processors/example_event_processor/models.py +++ /dev/null @@ -1,26 +0,0 @@ -from utils.models.annotated_types import StringType -from utils.models.annotated_types import ( - StringPrimaryKeyType, - BigIntegerType, - BigIntegerPrimaryKeyType, - InsertedAtType, - TimestampType, -) -from utils.models.general_models import Base -from utils.models.schema_names import EXAMPLE - - -class Event(Base): - __tablename__ = "events" - __table_args__ = ({"schema": EXAMPLE},) - - sequence_number: BigIntegerPrimaryKeyType - creation_number: BigIntegerPrimaryKeyType - account_address: StringPrimaryKeyType - transaction_version: BigIntegerType - transaction_block_height: BigIntegerType - transaction_timestamp: TimestampType - type: StringType - data: StringType - inserted_at: InsertedAtType - event_index: BigIntegerType diff --git a/python/processors/example_event_processor/processor.py b/python/processors/example_event_processor/processor.py deleted file mode 100644 index 3f0dbc5c8..000000000 --- a/python/processors/example_event_processor/processor.py +++ /dev/null @@ -1,79 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from processors.example_event_processor.models import Event -from typing import List -from utils.transactions_processor import ProcessingResult -from utils import general_utils -from utils.transactions_processor import TransactionsProcessor -from utils.models.schema_names import EXAMPLE -from utils.session import Session -from utils.processor_name import ProcessorName -from time import perf_counter - - -class ExampleEventProcessor(TransactionsProcessor): - def name(self) -> str: - return ProcessorName.EXAMPLE_EVENT_PROCESSOR.value - - def schema(self) -> str: - return EXAMPLE - - def process_transactions( - self, - transactions: list[transaction_pb2.Transaction], - start_version: int, - end_version: int, - ) -> ProcessingResult: - event_db_objs: List[Event] = [] - start_time = perf_counter() - for transaction in transactions: - # Custom filtering - # Here we filter out all transactions that are not of type TRANSACTION_TYPE_USER - if transaction.type != transaction_pb2.Transaction.TRANSACTION_TYPE_USER: - continue - - # Parse Transaction struct - transaction_version = transaction.version - transaction_block_height = transaction.block_height - transaction_timestamp = general_utils.parse_pb_timestamp( - transaction.timestamp - ) - user_transaction = transaction.user - - # Parse Event struct - for event_index, event in enumerate(user_transaction.events): - creation_number = event.key.creation_number - sequence_number = event.sequence_number - account_address = general_utils.standardize_address( - event.key.account_address - ) - type = event.type_str - data = event.data - - # Create an instance of Event - event_db_obj = Event( - creation_number=creation_number, - sequence_number=sequence_number, - account_address=account_address, - transaction_version=transaction_version, - transaction_block_height=transaction_block_height, - type=type, - data=data, - transaction_timestamp=transaction_timestamp, - event_index=event_index, - ) - event_db_objs.append(event_db_obj) - processing_duration_in_secs = perf_counter() - start_time - start_time = perf_counter() - self.insert_to_db(event_db_objs) - db_insertion_duration_in_secs = perf_counter() - start_time - return ProcessingResult( - start_version=start_version, - end_version=end_version, - processing_duration_in_secs=processing_duration_in_secs, - db_insertion_duration_in_secs=db_insertion_duration_in_secs, - ) - - def insert_to_db(self, parsed_objs: List[Event]) -> None: - with Session() as session, session.begin(): - for obj in parsed_objs: - session.merge(obj) diff --git a/python/processors/main.py b/python/processors/main.py deleted file mode 100644 index f2a0f1ac6..000000000 --- a/python/processors/main.py +++ /dev/null @@ -1,29 +0,0 @@ -import argparse -import logging -from pythonjsonlogger import jsonlogger -from utils.config import Config -from utils.worker import IndexerProcessorServer -from utils.logging import JsonFormatter, CustomLogger - -if __name__ == "__main__": - # Configure the logger - logger = CustomLogger("default_python_logger") - logger.setLevel(logging.INFO) - - # Create a stream handler for stdout - stream_handler = logging.StreamHandler() - stream_handler.setFormatter(JsonFormatter()) - - # Add the stream handler to the logger - logger.addHandler(stream_handler) - logging.root = logger - - parser = argparse.ArgumentParser() - parser.add_argument("-c", "--config", help="Path to config file", required=True) - args = parser.parse_args() - config = Config.from_yaml_file(args.config) - - indexer_server = IndexerProcessorServer( - config, - ) - indexer_server.run() diff --git a/python/processors/nft_marketplace_v2/marketplace_v2_parser.py b/python/processors/nft_marketplace_v2/marketplace_v2_parser.py deleted file mode 100644 index 73a16d186..000000000 --- a/python/processors/nft_marketplace_v2/marketplace_v2_parser.py +++ /dev/null @@ -1,355 +0,0 @@ -from typing import Optional -from typing_extensions import TypedDict -from utils.token_utils import TokenStandard, TokenDataIdType, CollectionDataIdType -from utils.general_utils import standardize_address - - -class TokenMetadata(TypedDict): - collection_id: str - token_data_id: str - creator_address: str - collection_name: str - token_name: str - property_version: Optional[int] - token_standard: TokenStandard - - -class CollectionMetadata(TypedDict): - collection_id: str - creator_address: str - collection_name: str - token_standard: TokenStandard - - -def get_token_metadata_from_event(data: dict) -> Optional[TokenMetadata]: - token_metadata = data.get("token_metadata", {}) - if not token_metadata: - return None - token_v2 = token_metadata.get("token", {}).get("vec", []) - creator_address = standardize_address(token_metadata["creator_address"]) - maybe_property_version = token_metadata.get("property_version", {}).get("vec", []) - property_version = maybe_property_version[0] if maybe_property_version else None - - # For token v2, token struct will contain token address - if token_v2: - return { - "collection_id": standardize_address( - token_metadata.get("collection", {}).get("vec", [])[0]["inner"] - ), - "token_data_id": standardize_address(token_v2[0]["inner"]), - "creator_address": creator_address, - "collection_name": token_metadata["collection_name"], - "token_name": token_metadata["token_name"], - "property_version": property_version, - "token_standard": TokenStandard.V2, - } - - # Token v1 parsing - token_data_id_type = TokenDataIdType( - creator_address, - token_metadata["collection_name"], - token_metadata["token_name"], - ) - return { - "collection_id": token_data_id_type.get_collection_data_id_hash(), - "token_data_id": token_data_id_type.to_hash(), - "creator_address": creator_address, - "collection_name": token_metadata["collection_name"], - "token_name": token_metadata["token_name"], - "property_version": property_version, - "token_standard": TokenStandard.V1, - } - - -def get_collection_metadata_from_event(data: dict) -> Optional[CollectionMetadata]: - collection_metadata = data.get("collection_metadata", {}) - if not collection_metadata: - return None - creator_address = standardize_address(collection_metadata["creator_address"]) - collection_v2 = collection_metadata.get("collection", {}).get("vec", []) - - # For token v2, collection struct will contain collection address - if collection_v2: - return { - "collection_id": standardize_address(collection_v2[0].get("inner")), - "creator_address": creator_address, - "collection_name": collection_metadata["collection_name"], - "token_standard": TokenStandard.V2, - } - - # Token v1 parsing - collection = CollectionDataIdType( - creator_address, - collection_metadata["collection_name"], - ) - return { - "collection_id": collection.to_hash(), - "creator_address": creator_address, - "collection_name": collection_metadata["collection_name"], - "token_standard": TokenStandard.V1, - } - - -# Listing models -class FixedPriceListing(TypedDict): - price: int - - -class ListingMetadata(TypedDict): - seller: str - fee_schedule_id: str - # Either the token v2 address or the token v1 container address - token_address: str - - -class ListingTokenV1Container(TypedDict): - token_metadata: TokenMetadata - amount: int - - -def get_listing_metadata( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[ListingMetadata]: - if move_resource_type != f"{marketplace_contract_address}::listing::Listing": - return None - - return { - "seller": standardize_address(data["seller"]), - "fee_schedule_id": standardize_address(data["fee_schedule"]["inner"]), - "token_address": standardize_address(data["object"]["inner"]), - } - - -def get_fixed_priced_listing( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[FixedPriceListing]: - if ( - f"{marketplace_contract_address}::coin_listing::FixedPriceListing" - not in move_resource_type - ): - return None - - return {"price": data["price"]} - - -def get_listing_token_v1_container( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[ListingTokenV1Container]: - if ( - move_resource_type - != f"{marketplace_contract_address}::listing::TokenV1Container" - ): - return None - - token = data.get("token", {}) - amount = token["amount"] - property_version = token.get("id", {}).get("property_version") - token_data_id_struct = token.get("id", {}).get("token_data_id", {}) - token_data_id_type = TokenDataIdType( - token_data_id_struct["creator"], - token_data_id_struct["collection"], - token_data_id_struct["name"], - ) - - return { - "token_metadata": { - "collection_id": token_data_id_type.get_collection_data_id_hash(), - "token_data_id": token_data_id_type.to_hash(), - "creator_address": token_data_id_type.get_creator(), - "collection_name": token_data_id_type.get_collection_trunc(), - "token_name": token_data_id_type.get_name_trunc(), - "property_version": property_version, - "token_standard": TokenStandard.V1, - }, - "amount": amount, - } - - -# Token offer models and helpers -class TokenOfferMetadata(TypedDict): - expiration_time: int - price: int - fee_schedule_id: str - - -class TokenOfferV2(TypedDict): - token_address: str - - -class TokenOfferV1(TypedDict): - token_metadata: TokenMetadata - - -def get_token_offer_metadata( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[TokenOfferMetadata]: - if move_resource_type != f"{marketplace_contract_address}::token_offer::TokenOffer": - return None - - return { - "expiration_time": data["expiration_time"], - "price": data["item_price"], - "fee_schedule_id": standardize_address(data["fee_schedule"]["inner"]), - } - - -def get_token_offer_v2( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[TokenOfferV2]: - if ( - move_resource_type - != f"{marketplace_contract_address}::token_offer::TokenOfferTokenV2" - ): - return None - - return { - "token_address": standardize_address(data["token"]["inner"]), - } - - -def get_token_offer_v1( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[TokenOfferV1]: - if ( - move_resource_type - != f"{marketplace_contract_address}::token_offer::TokenOfferTokenV1" - ): - return None - - property_version = data.get("property_version") - token_data_id_type = TokenDataIdType( - data["creator_address"], - data["collection_name"], - data["token_name"], - ) - - return { - "token_metadata": { - "collection_id": token_data_id_type.get_collection_data_id_hash(), - "token_data_id": token_data_id_type.to_hash(), - "creator_address": token_data_id_type.get_creator(), - "collection_name": token_data_id_type.get_collection_trunc(), - "token_name": token_data_id_type.get_name_trunc(), - "property_version": property_version, - "token_standard": TokenStandard.V1, - }, - } - - -# Collection offer models and helpers - - -class CollectionOfferMetadata(TypedDict): - expiration_time: int - item_price: int - remaining_token_amount: int - fee_schedule_id: str - - -class CollectionOfferV1(TypedDict): - collection_metadata: CollectionMetadata - - -class CollectionOfferV2(TypedDict): - collection_address: str - - -class CollectionOfferEventMetadata(TypedDict): - collection_offer_id: str - collection_metadata: CollectionMetadata - item_price: int - buyer: str - fee_schedule_id: str - - -def get_collection_offer_metadata( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[CollectionOfferMetadata]: - if ( - move_resource_type - != f"{marketplace_contract_address}::collection_offer::CollectionOffer" - ): - return None - - return { - "expiration_time": data["expiration_time"], - "item_price": data["item_price"], - "remaining_token_amount": data["remaining"], - "fee_schedule_id": standardize_address(data["fee_schedule"]["inner"]), - } - - -def get_collection_offer_v1( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[CollectionOfferV1]: - if ( - move_resource_type - != f"{marketplace_contract_address}::collection_offer::CollectionOfferTokenV1" - ): - return None - - collection_data_id_type = CollectionDataIdType( - data["creator_address"], - data["collection_name"], - ) - - return { - "collection_metadata": { - "collection_id": collection_data_id_type.to_hash(), - "creator_address": collection_data_id_type.get_creator(), - "collection_name": collection_data_id_type.get_name_trunc(), - "token_standard": TokenStandard.V1, - }, - } - - -def get_collection_offer_v2( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[CollectionOfferV2]: - if ( - move_resource_type - != f"{marketplace_contract_address}::collection_offer::CollectionOfferTokenV2" - ): - return None - - return { - "collection_address": standardize_address(data["collection"]["inner"]), - } - - -# Auction models and helpers -class AuctionListing(TypedDict): - auction_end_time: int - starting_bid_price: int - current_bid_price: Optional[int] - current_bidder: Optional[str] - buy_it_now_price: Optional[int] - - -def get_auction_listing( - move_resource_type: str, data: dict, marketplace_contract_address: str -) -> Optional[AuctionListing]: - if ( - f"{marketplace_contract_address}::coin_listing::AuctionListing" - not in move_resource_type - ): - return None - - maybe_buy_it_now_price = data.get("buy_it_now_price", {}).get("vec", []) - buy_it_now_price = maybe_buy_it_now_price[0] if maybe_buy_it_now_price else None - - current_bid_price = None - current_bidder = None - maybe_current_bid = data.get("current_bid", {}).get("vec", []) - if maybe_current_bid: - current_bid = maybe_current_bid[0] - current_bid_price = current_bid["coins"]["value"] - current_bidder = standardize_address(current_bid["bidder"]) - - return { - "auction_end_time": data["auction_end_time"], - "starting_bid_price": data["starting_bid"], - "current_bid_price": current_bid_price, - "current_bidder": current_bidder, - "buy_it_now_price": buy_it_now_price, - } diff --git a/python/processors/nft_marketplace_v2/marketplace_v2_utils.py b/python/processors/nft_marketplace_v2/marketplace_v2_utils.py deleted file mode 100644 index 646629bf8..000000000 --- a/python/processors/nft_marketplace_v2/marketplace_v2_utils.py +++ /dev/null @@ -1,58 +0,0 @@ -import datetime -import re - -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from dataclasses import dataclass -from typing import List -from processors.nft_orderbooks.nft_marketplace_constants import ( - MARKETPLACE_SMART_CONTRACT_ADDRESSES, - MARKETPLACE_ENTRY_FUNCTIONS, - MARKETPLACE_ADDRESS_MATCH_REGEX_STRINGS, -) -from processors.nft_orderbooks.nft_marketplace_enums import ( - MarketplaceName, - TransactionMetadata, - ListingTableMetadata, - BidMetadata, -) -from processors.nft_marketplace_v2.nft_marketplace_models import ( - CurrentNFTMarketplaceListing, -) -from processors.nft_orderbooks.models.nft_marketplace_bid_models import ( - CurrentNFTMarketplaceBid, - CurrentNFTMarketplaceCollectionBid, -) -from utils import general_utils, transaction_utils -from utils.session import Session - - -def lookup_v2_current_listing_in_db( - listing_id: str, -) -> CurrentNFTMarketplaceListing | None: - listing = None - - with Session() as session, session.begin(): - listing_from_db = ( - session.query(CurrentNFTMarketplaceListing) - .filter(CurrentNFTMarketplaceListing.listing_id == listing_id) - .one_or_none() - ) - - if listing_from_db: - listing = CurrentNFTMarketplaceListing( - token_data_id=listing_from_db.token_data_id, - listing_id=listing_from_db.listing_id, - price=listing_from_db.price, - token_amount=listing_from_db.token_amount, - token_standard=listing_from_db.token_standard, - seller=listing_from_db.seller, - is_deleted=listing_from_db.is_deleted, - marketplace=listing_from_db.marketplace, - contract_address=listing_from_db.contract_address, - entry_function_id_str=listing_from_db.entry_function_id_str, - last_transaction_version=listing_from_db.last_transaction_version, - last_transaction_timestamp=listing_from_db.last_transaction_timestamp, - inserted_at=listing_from_db.inserted_at, - ) - - return listing diff --git a/python/processors/nft_marketplace_v2/nft_marketplace_models.py b/python/processors/nft_marketplace_v2/nft_marketplace_models.py deleted file mode 100644 index b3eab4c61..000000000 --- a/python/processors/nft_marketplace_v2/nft_marketplace_models.py +++ /dev/null @@ -1,230 +0,0 @@ -from utils.models.annotated_types import ( - NullableStringType, - StringType, - BigIntegerType, - BigIntegerPrimaryKeyType, - BooleanType, - InsertedAtType, - NumericType, - StringPrimaryKeyType, - TimestampType, - NullableNumericType, - UpdatedAtType, -) -from utils.models.general_models import Base -from utils.models.schema_names import NFT_MARKETPLACE_V2_SCHEMA_NAME -from sqlalchemy import Index - - -class NFTMarketplaceActivities(Base): - __tablename__ = "nft_marketplace_activities" - __table_args__ = ( - (Index("ev_offer_or_listing_index", "offer_or_listing_id")), - (Index("ev_token_data_id_index", "token_data_id")), - (Index("ev_collection_id_index", "collection_id")), - (Index("ev_fee_schedule_index", "fee_schedule_id")), - {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME}, - ) - - transaction_version: BigIntegerPrimaryKeyType - event_index: BigIntegerPrimaryKeyType - offer_or_listing_id: StringType - fee_schedule_id: StringType - collection_id: StringType - token_data_id: NullableStringType - creator_address: StringType - collection_name: StringType - token_name: NullableStringType - property_version: NullableStringType - price: NumericType - token_amount: NumericType - token_standard: StringType - seller: NullableStringType - buyer: NullableStringType - coin_type: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - event_type: StringType - transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -class CurrentNFTMarketplaceListing(Base): - __tablename__ = "current_nft_marketplace_listings" - __table_args__ = ( - (Index("curr_list_collection_index", "collection_id")), - (Index("curr_list_fee_schedule_index", "fee_schedule_id")), - (Index("curr_list_collection_price_index", "collection_id", "price")), - (Index("curr_list_seller_index", "seller")), - {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME}, - ) - - listing_id: StringPrimaryKeyType - token_data_id: StringPrimaryKeyType - collection_id: StringType - fee_schedule_id: StringType - price: NumericType - token_amount: NumericType - token_standard: StringType - seller: StringType - is_deleted: BooleanType - coin_type: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - last_transaction_version: BigIntegerType - last_transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -# class NFTMarketplaceListing(Base): -# __tablename__ = "nft_marketplace_listings" -# __table_args__ = {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME} - -# transaction_version: BigIntegerPrimaryKeyType -# write_set_index: BigIntegerPrimaryKeyType -# token_data_id: StringPrimaryKeyType -# listing_address: NullableStringType -# price: NumericType -# token_amount: NumericType -# token_standard: StringType -# seller: StringType -# is_deleted: BooleanType -# marketplace: StringType -# contract_address: StringType -# entry_function_id_str: StringType -# transaction_timestamp: TimestampType -# inserted_at: InsertedAtType - - -class CurrentNFTMarketplaceTokenOffer(Base): - __tablename__ = "current_nft_marketplace_token_offers" - __table_args__ = ( - (Index("curr_tok_offer_collection_index", "collection_id")), - (Index("curr_tok_offer_fee_schedule_index", "fee_schedule_id")), - (Index("curr_tok_offer_buyer_index", "buyer")), - {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME}, - ) - - offer_id: StringPrimaryKeyType - token_data_id: StringPrimaryKeyType - collection_id: StringType - fee_schedule_id: StringType - buyer: StringType - price: NumericType - token_amount: NumericType - expiration_time: NumericType - is_deleted: BooleanType - token_standard: StringType - coin_type: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - last_transaction_version: BigIntegerType - last_transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -# class NFTMarketplaceOffer(Base): -# __tablename__ = "nft_marketplace_token_offers" -# __table_args__ = {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME} - -# transaction_version: BigIntegerPrimaryKeyType -# index: BigIntegerPrimaryKeyType -# creator_address: StringType -# token_name: StringType -# token_data_id: StringType -# collection: StringType -# collection_id: StringType -# price: NumericType -# token_amount: NumericType -# expirationTime: NumericType -# buyer: StringType -# seller: NullableStringType -# marketplace: StringType -# contract_address: StringType -# entry_function_id_str: StringType -# event_type: StringType -# transaction_timestamp: TimestampType -# inserted_at: InsertedAtType - - -class CurrentNFTMarketplaceCollectionOffer(Base): - __tablename__ = "current_nft_marketplace_collection_offers" - __table_args__ = ( - (Index("curr_coll_off_fee_schedule_index", "fee_schedule_id")), - (Index("curr_coll_off_buyer_index", "buyer")), - (Index("curr_coll_off_price_index", "item_price")), - {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME}, - ) - - collection_offer_id: StringPrimaryKeyType - collection_id: StringPrimaryKeyType - fee_schedule_id: StringType - buyer: StringType - item_price: NumericType - remaining_token_amount: NumericType - expiration_time: NumericType - is_deleted: BooleanType - token_standard: StringType - coin_type: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - last_transaction_version: BigIntegerType - last_transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -# class NFTMarketplaceCollectionBid(Base): -# __tablename__ = "nft_marketplace_collection_bids" -# __table_args__ = {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME} - -# transaction_version: BigIntegerPrimaryKeyType -# index: BigIntegerPrimaryKeyType -# creator_address: StringType -# collection: StringType -# collection_id: StringType -# price: NumericType -# token_amount: NumericType -# buyer: StringType -# seller: NullableStringType -# marketplace: StringType -# contract_address: StringType -# entry_function_id_str: StringType -# event_type: StringType -# transaction_timestamp: TimestampType -# inserted_at: InsertedAtType - - -class CurrentNFTMarketplaceAuction(Base): - __tablename__ = "current_nft_marketplace_auctions" - __table_args__ = ( - (Index("curr_auc_collection_index", "collection_id")), - (Index("curr_auc_fee_schedule_index", "fee_schedule_id")), - (Index("curr_auc_seller_index", "seller")), - (Index("curr_auc_bidder_index", "current_bidder")), - {"schema": NFT_MARKETPLACE_V2_SCHEMA_NAME}, - ) - - listing_id: StringPrimaryKeyType - token_data_id: StringPrimaryKeyType - collection_id: StringType - fee_schedule_id: StringType - seller: StringType - current_bid_price: NullableNumericType - current_bidder: NullableStringType - starting_bid_price: NumericType - buy_it_now_price: NullableNumericType - token_amount: NumericType - expiration_time: NumericType - is_deleted: BooleanType - token_standard: StringType - coin_type: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - last_transaction_version: BigIntegerType - last_transaction_timestamp: TimestampType - inserted_at: InsertedAtType diff --git a/python/processors/nft_marketplace_v2/processor.py b/python/processors/nft_marketplace_v2/processor.py deleted file mode 100644 index 5d67a4c42..000000000 --- a/python/processors/nft_marketplace_v2/processor.py +++ /dev/null @@ -1,1221 +0,0 @@ -import json - -from typing import Dict, List -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from processors.nft_orderbooks.nft_marketplace_enums import MarketplaceName -from processors.nft_marketplace_v2.nft_marketplace_models import ( - CurrentNFTMarketplaceListing, - CurrentNFTMarketplaceTokenOffer, - CurrentNFTMarketplaceCollectionOffer, - CurrentNFTMarketplaceAuction, - NFTMarketplaceActivities, -) -from utils.object_utils import get_object_core, ObjectCore -from utils.token_utils import TokenStandard -from utils.transactions_processor import TransactionsProcessor, ProcessingResult -from utils import event_utils, transaction_utils, write_set_change_utils -from utils.general_utils import standardize_address -from processors.nft_orderbooks.nft_orderbooks_parser_utils import ( - parse_transaction_metadata, -) -from processors.nft_marketplace_v2.marketplace_v2_parser import ( - get_token_metadata_from_event, - get_collection_metadata_from_event, - get_listing_metadata, - get_fixed_priced_listing, - get_listing_token_v1_container, - get_token_offer_metadata, - get_token_offer_v1, - get_token_offer_v2, - get_collection_offer_metadata, - get_collection_offer_v1, - get_collection_offer_v2, - get_auction_listing, - ListingMetadata, - FixedPriceListing, - ListingTokenV1Container, - TokenMetadata, - CollectionMetadata, - TokenOfferMetadata, - TokenOfferV1, - TokenOfferV2, - CollectionOfferMetadata, - CollectionOfferV1, - CollectionOfferV2, - CollectionOfferEventMetadata, - AuctionListing, -) -from processors.nft_orderbooks.nft_marketplace_enums import ( - StandardMarketplaceEventType, - MarketplaceName, -) -from utils.processor_name import ProcessorName -from utils.token_utils import TokenStandard -from utils.models.schema_names import NFT_MARKETPLACE_V2_SCHEMA_NAME -from utils.session import Session -from sqlalchemy.dialects.postgresql import insert -from utils.config import NFTMarketplaceV2Config -from time import perf_counter - - -class NFTMarketplaceV2Processor(TransactionsProcessor): - config: NFTMarketplaceV2Config - - def name(self) -> str: - return ProcessorName.NFT_MARKETPLACE_V2_PROCESSOR.value - - def schema(self) -> str: - return NFT_MARKETPLACE_V2_SCHEMA_NAME - - def __init__(self, nft_marketplace_v2_config: NFTMarketplaceV2Config): - self.config = nft_marketplace_v2_config - - def process_transactions( - self, - transactions: list[transaction_pb2.Transaction], - start_version: int, - end_version: int, - ) -> ProcessingResult: - marketplace_contract_address = str(self.config.marketplace_contract_address) - processing_duration_in_secs = 0.0 - db_insertion_duration_in_secs = 0.0 - for transaction in transactions: - start_time = perf_counter() - user_transaction = transaction_utils.get_user_transaction(transaction) - - if not user_transaction: - continue - - # Token metadatas parsed from events. The key is generated token_data_id for token v1, - # and token address for token v2. - token_metadatas: Dict[str, TokenMetadata] = {} - # Collection metaddatas parsed from events. The key is generated collection_id for token v1, - # and collection address for token v2. - collection_metadatas: Dict[str, CollectionMetadata] = {} - - nft_marketplace_activities: List[NFTMarketplaceActivities] = [] - current_nft_marketplace_listings: List[CurrentNFTMarketplaceListing] = [] - current_token_offers: List[CurrentNFTMarketplaceTokenOffer] = [] - current_collection_offers: List[CurrentNFTMarketplaceCollectionOffer] = [] - current_auctions: List[CurrentNFTMarketplaceAuction] = [] - - collection_offer_filled_metadatas: Dict[ - str, CollectionOfferEventMetadata - ] = {} - - transaction_metadata = parse_transaction_metadata(transaction) - events = user_transaction.events - write_set_changes = transaction_utils.get_write_set_changes(transaction) - - # Get coin type - type_args = ( - user_transaction.request.payload.entry_function_payload.type_arguments - ) - coin_type = type_args[0] if type_args else None - if coin_type: - coin_type = transaction_utils.get_move_type_str(coin_type) - - # Loop 1 - # Parse all activities related to token listings, token and collection offers - # The contract actually gives token/collection related metadata so we don't have to - # look up anything - for event_index, event in enumerate(events): - qualified_event_type = str(event.type_str) - - if marketplace_contract_address not in qualified_event_type: - continue - - event_type_short = event_utils.get_event_type_short(event) - if event_type_short not in [ - "events::ListingFilledEvent", - "events::ListingCanceledEvent", - "events::ListingPlacedEvent", - "events::CollectionOfferPlacedEvent", - "events::CollectionOfferCanceledEvent", - "events::CollectionOfferFilledEvent", - "events::TokenOfferPlacedEvent", - "events::TokenOfferCanceledEvent", - "events::TokenOfferFilledEvent", - "events::AuctionBidEvent", - ]: - continue - - data = json.loads(event.data) - price = data.get("price") - offer_or_listing_id = standardize_address( - data.get("listing") - or data.get("collection_offer") - or data.get("token_offer") - ) - fee_schedule_id = event.key.account_address - - activity = None - current_listing = None - current_token_offer = None - current_auction = None - - token_metadata = get_token_metadata_from_event(data) - collection_metadata = get_collection_metadata_from_event(data) - - if token_metadata: - token_metadatas[token_metadata["token_data_id"]] = token_metadata - - if collection_metadata: - collection_metadatas[ - collection_metadata["collection_id"] - ] = collection_metadata - - match event_type_short: - case "events::ListingFilledEvent": - assert token_metadata - - listing_type = data.get("type") - assert listing_type - - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=price, - token_amount=1, - token_standard=token_metadata["token_standard"].value, - seller=standardize_address(data.get("seller")), - buyer=standardize_address(data.get("purchaser")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.LISTING_FILLED.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - if listing_type == "auction": - current_auction = CurrentNFTMarketplaceAuction( - listing_id=offer_or_listing_id, - token_data_id=token_metadata["token_data_id"], - collection_id=token_metadata["collection_id"], - fee_schedule_id=fee_schedule_id, - seller=standardize_address(data.get("seller")), - current_bid_price=price, - current_bidder=standardize_address( - data.get("purchaser") - ), - starting_bid_price=0, - buy_it_now_price=None, - token_amount=1, - expiration_time=0, - is_deleted=True, - token_standard=TokenStandard.V2.value, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - coin_type=coin_type, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - else: - current_listing = CurrentNFTMarketplaceListing( - token_data_id=token_metadata["token_data_id"], - listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - price=price, - token_amount=0, - token_standard=token_metadata["token_standard"].value, - seller=standardize_address(data.get("seller")), - is_deleted=True, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case "events::ListingCanceledEvent": - assert token_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=price, - token_amount=1, - token_standard=token_metadata["token_standard"].value, - seller=standardize_address(data.get("seller")), - buyer=None, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.LISTING_CANCEL.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_listing = CurrentNFTMarketplaceListing( - token_data_id=token_metadata["token_data_id"], - listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - price=price, - token_amount=0, - token_standard=token_metadata["token_standard"].value, - seller=standardize_address(data.get("seller")), - is_deleted=True, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case "events::ListingPlacedEvent": - assert token_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=price, - token_amount=1, - token_standard=token_metadata["token_standard"].value, - seller=standardize_address(data.get("seller")), - buyer=None, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.LISTING_PLACE.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case "events::CollectionOfferPlacedEvent": - assert collection_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=collection_metadata["collection_id"], - token_data_id=None, - creator_address=collection_metadata["creator_address"], - collection_name=collection_metadata["collection_name"], - token_name=None, - property_version=None, - price=price, - token_amount=data.get("token_amount"), - token_standard=collection_metadata["token_standard"].value, - seller=None, - buyer=standardize_address(data.get("purchaser")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.BID_PLACE.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case "events::CollectionOfferCanceledEvent": - assert collection_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=collection_metadata["collection_id"], - token_data_id=None, - creator_address=collection_metadata["creator_address"], - collection_name=collection_metadata["collection_name"], - token_name=None, - property_version=None, - price=price, - token_amount=data.get("remaining_token_amount"), - token_standard=collection_metadata["token_standard"].value, - seller=None, - buyer=standardize_address(data.get("purchaser")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.BID_CHANGE.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_collection_offer = CurrentNFTMarketplaceCollectionOffer( - collection_offer_id=offer_or_listing_id, - collection_id=collection_metadata["collection_id"], - fee_schedule_id=fee_schedule_id, - buyer=standardize_address(data.get("purchaser")), - item_price=price, - remaining_token_amount=data.get("remaining_token_amount"), - expiration_time=0, - is_deleted=True, - token_standard=collection_metadata["token_standard"].value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_collection_offers.append(current_collection_offer) - case "events::CollectionOfferFilledEvent": - assert token_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - collection_id=token_metadata["collection_id"], - fee_schedule_id=fee_schedule_id, - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=price, - token_amount=data.get("remaining_token_amount", 0), - token_standard=token_metadata["token_standard"].value, - seller=standardize_address(data.get("seller")), - buyer=standardize_address(data.get("purchaser")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.BID_CHANGE.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - # The collection offer resource may be deleted after it is filled, - # so we need to parse collection offer metadata from the event - collection_offer_filled_metadata: CollectionOfferEventMetadata = { - "collection_offer_id": offer_or_listing_id, - "collection_metadata": { - "collection_id": token_metadata["collection_id"], - "creator_address": token_metadata["creator_address"], - "collection_name": token_metadata["collection_name"], - "token_standard": token_metadata["token_standard"], - }, - "item_price": price, - "buyer": standardize_address(data.get("purchaser")), - "fee_schedule_id": fee_schedule_id, - } - collection_offer_filled_metadatas[ - offer_or_listing_id - ] = collection_offer_filled_metadata - case "events::TokenOfferPlacedEvent": - assert token_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=price, - token_amount=1, - token_standard=token_metadata["token_standard"].value, - seller=None, - buyer=standardize_address(data.get("purchaser")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.BID_PLACE.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case "events::TokenOfferCanceledEvent": - assert token_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=price, - token_amount=0, - token_standard=token_metadata["token_standard"].value, - seller=None, - buyer=standardize_address(data.get("purchaser")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.BID_CHANGE.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_token_offer = CurrentNFTMarketplaceTokenOffer( - offer_id=offer_or_listing_id, - token_data_id=token_metadata["token_data_id"], - collection_id=token_metadata["collection_id"], - fee_schedule_id=fee_schedule_id, - buyer=standardize_address(data.get("purchaser")), - price=price, - token_amount=0, - expiration_time=0, - is_deleted=True, - token_standard=token_metadata["token_standard"].value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case "events::TokenOfferFilledEvent": - assert token_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=price, - token_amount=1, - token_standard=token_metadata["token_standard"].value, - seller=standardize_address(data.get("seller")), - buyer=standardize_address(data.get("purchaser")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.BID_FILLED.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_token_offer = CurrentNFTMarketplaceTokenOffer( - offer_id=offer_or_listing_id, - token_data_id=token_metadata["token_data_id"], - collection_id=token_metadata["collection_id"], - fee_schedule_id=fee_schedule_id, - buyer=standardize_address(data.get("purchaser")), - price=price, - token_amount=0, - expiration_time=0, - is_deleted=True, - token_standard=token_metadata["token_standard"].value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case "events::AuctionBidEvent": - assert token_metadata - activity = NFTMarketplaceActivities( - transaction_version=transaction.version, - event_index=event_index, - offer_or_listing_id=offer_or_listing_id, - fee_schedule_id=fee_schedule_id, - collection_id=token_metadata["collection_id"], - token_data_id=token_metadata["token_data_id"], - creator_address=token_metadata["creator_address"], - collection_name=token_metadata["collection_name"], - token_name=token_metadata["token_name"], - property_version=token_metadata["property_version"], - price=data.get("new_bid"), - token_amount=1, - token_standard=token_metadata["token_standard"].value, - seller=None, - buyer=standardize_address(data.get("new_bidder")), - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - event_type=StandardMarketplaceEventType.BID_PLACE.value, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - case _: - continue - - nft_marketplace_activities.append(activity) - if current_listing: - current_nft_marketplace_listings.append(current_listing) - if current_token_offer: - current_token_offers.append(current_token_offer) - if current_auction: - current_auctions.append(current_auction) - - # Object, listing and offer models. The key is the resource address - object_metadatas: Dict[str, ObjectCore] = {} - listing_metadatas: Dict[str, ListingMetadata] = {} - fixed_price_listings: Dict[str, FixedPriceListing] = {} - listing_token_v1_containers: Dict[str, ListingTokenV1Container] = {} - token_offer_metadatas: Dict[str, TokenOfferMetadata] = {} - token_offer_v1s: Dict[str, TokenOfferV1] = {} - token_offer_v2s: Dict[str, TokenOfferV2] = {} - collection_offer_metadatas: Dict[str, CollectionOfferMetadata] = {} - collection_offer_v1s: Dict[str, CollectionOfferV1] = {} - collection_offer_v2s: Dict[str, CollectionOfferV2] = {} - auction_listings: Dict[str, AuctionListing] = {} - - # Loop 2 - # Parse out all the listing, auction, bid, and offer data from write set changes. - # This is a bit more complicated than the other parsers because the data is spread out across multiple write set changes, - # so we need a first loop to get all the data. - for wsc_index, wsc in enumerate(write_set_changes): - write_resource = write_set_change_utils.get_write_resource(wsc) - if write_resource: - move_resource_address = standardize_address(write_resource.address) - move_resource_type = write_resource.type_str - move_resource_type_address = write_resource.type.address - data = json.loads(write_resource.data) - - # Parse object metadata - object_core = get_object_core(move_resource_type, data) - - if object_core: - object_metadatas[move_resource_address] = object_core - - if move_resource_type_address != marketplace_contract_address: - continue - - # Parse listing metadata - listing_metadata = get_listing_metadata( - move_resource_type, data, marketplace_contract_address - ) - fixed_price_listing = get_fixed_priced_listing( - move_resource_type, data, marketplace_contract_address - ) - listing_token_v1_container = get_listing_token_v1_container( - move_resource_type, data, marketplace_contract_address - ) - - if listing_metadata: - listing_metadatas[move_resource_address] = listing_metadata - if fixed_price_listing: - fixed_price_listings[ - move_resource_address - ] = fixed_price_listing - if listing_token_v1_container: - listing_token_v1_containers[ - move_resource_address - ] = listing_token_v1_container - - # Parse token offer metadata - token_offer_metadata = get_token_offer_metadata( - move_resource_type, data, marketplace_contract_address - ) - token_offer_v1 = get_token_offer_v1( - move_resource_type, data, marketplace_contract_address - ) - token_offer_v2 = get_token_offer_v2( - move_resource_type, data, marketplace_contract_address - ) - - if token_offer_metadata: - token_offer_metadatas[ - move_resource_address - ] = token_offer_metadata - if token_offer_v1: - token_offer_v1s[move_resource_address] = token_offer_v1 - if token_offer_v2: - token_offer_v2s[move_resource_address] = token_offer_v2 - - # Parse collection offer metadata - collection_offer_metadata = get_collection_offer_metadata( - move_resource_type, data, marketplace_contract_address - ) - collection_offer_v1 = get_collection_offer_v1( - move_resource_type, data, marketplace_contract_address - ) - collection_offer_v2 = get_collection_offer_v2( - move_resource_type, data, marketplace_contract_address - ) - - if collection_offer_metadata: - collection_offer_metadatas[ - move_resource_address - ] = collection_offer_metadata - if collection_offer_v1: - collection_offer_v1s[ - move_resource_address - ] = collection_offer_v1 - if collection_offer_v2: - collection_offer_v2s[ - move_resource_address - ] = collection_offer_v2 - - # Parse auction metadata - auction_listing = get_auction_listing( - move_resource_type, data, marketplace_contract_address - ) - - if auction_listing: - auction_listings[move_resource_address] = auction_listing - - # Loop 3 - # Reconstruct the full listing and offer models and create DB objects - for _, wsc in enumerate(write_set_changes): - write_resource = write_set_change_utils.get_write_resource(wsc) - if write_resource: - move_type_address = write_resource.type.address - if move_type_address != marketplace_contract_address: - continue - - move_resource_address = standardize_address(write_resource.address) - move_resource_type = write_resource.type_str - - if ( - move_resource_type - == f"{marketplace_contract_address}::listing::Listing" - ): - # Get the data related to this listing that was parsed from loop 2 - listing_metadata = listing_metadatas.get(move_resource_address) - fixed_price_listing = fixed_price_listings.get( - move_resource_address - ) - auction_listing = auction_listings.get(move_resource_address) - - assert ( - listing_metadata - ), f"Listing metadata not found for txn {transaction.version}" - - # If the listing is an auction, it will have an coin_listing::AuctionListing resource, otherwise - # it's a fixed price listing. - if auction_listing: - token_metadata = token_metadatas.get( - listing_metadata["token_address"] - ) - assert ( - token_metadata - ), f"Token metadata not found for txn {transaction.version}" - - # Parses when auction is placed and when a bid is placed on an auction - current_auction = CurrentNFTMarketplaceAuction( - listing_id=move_resource_address, - token_data_id=listing_metadata["token_address"], - collection_id=token_metadata["collection_id"], - fee_schedule_id=listing_metadata["fee_schedule_id"], - seller=listing_metadata["seller"], - current_bid_price=auction_listing["current_bid_price"], - current_bidder=auction_listing["current_bidder"], - starting_bid_price=auction_listing[ - "starting_bid_price" - ], - buy_it_now_price=auction_listing["buy_it_now_price"], - token_amount=1, - expiration_time=auction_listing["auction_end_time"], - is_deleted=False, - token_standard=TokenStandard.V2.value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_auctions.append(current_auction) - else: - assert ( - fixed_price_listing - ), f"Fixed price listing not found for txn {transaction.version}" - - token_address = listing_metadata["token_address"] - token_v1_container = listing_token_v1_containers.get( - token_address - ) - - current_listing = None - - if token_v1_container: - token_v1_metadata = token_v1_container["token_metadata"] - current_listing = CurrentNFTMarketplaceListing( - token_data_id=token_v1_metadata["token_data_id"], - listing_id=move_resource_address, - fee_schedule_id=listing_metadata["fee_schedule_id"], - collection_id=token_v1_metadata["collection_id"], - price=fixed_price_listing["price"], - token_amount=token_v1_container["amount"], - token_standard=TokenStandard.V1.value, - seller=listing_metadata["seller"], - is_deleted=False, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - else: - token_v2_metadata = token_metadatas.get(token_address) - - assert ( - token_v2_metadata - ), f"Token v2 metadata not found for txn {transaction.version}" - - current_listing = CurrentNFTMarketplaceListing( - token_data_id=token_v2_metadata["token_data_id"], - listing_id=move_resource_address, - fee_schedule_id=listing_metadata["fee_schedule_id"], - collection_id=token_v2_metadata["collection_id"], - price=fixed_price_listing["price"], - token_amount=1, - token_standard=TokenStandard.V2.value, - seller=listing_metadata["seller"], - is_deleted=False, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - current_nft_marketplace_listings.append(current_listing) - - elif ( - move_resource_type - == f"{marketplace_contract_address}::token_offer::TokenOffer" - ): - # Get the data related to this token offer that was parsed from loop 2 - token_offer_object = object_metadatas.get(move_resource_address) - token_offer_metadata = token_offer_metadatas.get( - move_resource_address - ) - token_offer_v1 = token_offer_v1s.get(move_resource_address) - - assert ( - token_offer_object - ), f"Token offer object not found for txn {transaction.version}" - assert ( - token_offer_metadata - ), f"Token offer metadata not found for txn {transaction.version}" - - current_token_offer = None - - if token_offer_v1: - token_metadata = token_offer_v1["token_metadata"] - current_token_offer = CurrentNFTMarketplaceTokenOffer( - offer_id=move_resource_address, - token_data_id=token_metadata["token_data_id"], - collection_id=token_metadata["collection_id"], - fee_schedule_id=token_offer_metadata["fee_schedule_id"], - buyer=token_offer_object["owner"], - price=token_offer_metadata["price"], - token_amount=1, - expiration_time=token_offer_metadata["expiration_time"], - is_deleted=False, - token_standard=TokenStandard.V1.value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - else: - token_offer_v2 = token_offer_v2s.get(move_resource_address) - - assert ( - token_offer_v2 - ), f"Token offer v2 metadata not found for txn {transaction.version}" - - token_v2_metadata = token_metadatas.get( - token_offer_v2["token_address"] - ) - assert ( - token_v2_metadata - ), f"Token v2 metadata not found for txn {transaction.version}" - - current_token_offer = CurrentNFTMarketplaceTokenOffer( - offer_id=move_resource_address, - token_data_id=token_offer_v2["token_address"], - collection_id=token_v2_metadata["collection_id"], - fee_schedule_id=token_offer_metadata["fee_schedule_id"], - buyer=token_offer_object["owner"], - price=token_offer_metadata["price"], - token_amount=1, - expiration_time=token_offer_metadata["expiration_time"], - is_deleted=False, - token_standard=TokenStandard.V2.value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - current_token_offers.append(current_token_offer) - elif ( - move_resource_type - == f"{marketplace_contract_address}::collection_offer::CollectionOffer" - ): - # Get the data related to this collection offer that was parsed from loop 2 - collection_offer_metadata = collection_offer_metadatas.get( - move_resource_address - ) - collection_object = object_metadatas.get(move_resource_address) - collection_offer_v1 = collection_offer_v1s.get( - move_resource_address - ) - - assert ( - collection_offer_metadata - ), f"Collection offer metadata not found for txn {transaction.version}" - assert ( - collection_object - ), f"Collection object not found for txn {transaction.version}" - - current_collection_offer = None - - if collection_offer_v1: - current_collection_offer = CurrentNFTMarketplaceCollectionOffer( - collection_offer_id=move_resource_address, - collection_id=collection_offer_v1[ - "collection_metadata" - ]["collection_id"], - fee_schedule_id=collection_offer_metadata[ - "fee_schedule_id" - ], - buyer=collection_object["owner"], - item_price=collection_offer_metadata["item_price"], - remaining_token_amount=collection_offer_metadata[ - "remaining_token_amount" - ], - expiration_time=collection_offer_metadata[ - "expiration_time" - ], - is_deleted=False, - token_standard=TokenStandard.V1.value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - else: - collection_offer_v2 = collection_offer_v2s.get( - move_resource_address - ) - assert ( - collection_offer_v2 - ), f"Collection offer v2 not found for txn {transaction.version}" - - current_collection_offer = CurrentNFTMarketplaceCollectionOffer( - collection_offer_id=move_resource_address, - collection_id=collection_offer_v2["collection_address"], - fee_schedule_id=collection_offer_metadata[ - "fee_schedule_id" - ], - buyer=collection_object["owner"], - item_price=collection_offer_metadata["item_price"], - remaining_token_amount=collection_offer_metadata[ - "remaining_token_amount" - ], - expiration_time=collection_offer_metadata[ - "expiration_time" - ], - is_deleted=False, - token_standard=TokenStandard.V2.value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_collection_offers.append(current_collection_offer) - - delete_resource = write_set_change_utils.get_delete_resource(wsc) - if delete_resource: - move_resource_address = standardize_address(delete_resource.address) - - # If a collection offer resource gets deleted, that means it the offer was filled completely - # and we handle that here. - maybe_collection_offer_filled_metadata = ( - collection_offer_filled_metadatas.get(move_resource_address) - ) - if maybe_collection_offer_filled_metadata: - collection_metadata = maybe_collection_offer_filled_metadata[ - "collection_metadata" - ] - current_collection_offer = CurrentNFTMarketplaceCollectionOffer( - collection_offer_id=move_resource_address, - collection_id=collection_metadata["collection_id"], - fee_schedule_id=maybe_collection_offer_filled_metadata[ - "fee_schedule_id" - ], - buyer=maybe_collection_offer_filled_metadata["buyer"], - item_price=maybe_collection_offer_filled_metadata[ - "item_price" - ], - remaining_token_amount=0, - expiration_time=0, - is_deleted=True, - token_standard=collection_metadata["token_standard"].value, - coin_type=coin_type, - marketplace=MarketplaceName.EXAMPLE_V2_MARKETPLACE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction.version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_collection_offers.append(current_collection_offer) - - processing_duration_in_secs += perf_counter() - start_time - - start_time = perf_counter() - self.insert_nft_activities(nft_marketplace_activities) - self.insert_nft_listings(current_nft_marketplace_listings) - self.insert_nft_token_offers(current_token_offers) - self.insert_nft_collection_offers(current_collection_offers) - self.insert_nft_auctions(current_auctions) - - db_insertion_duration_in_secs += perf_counter() - start_time - - return ProcessingResult( - start_version=start_version, - end_version=end_version, - processing_duration_in_secs=processing_duration_in_secs, - db_insertion_duration_in_secs=db_insertion_duration_in_secs, - ) - - def insert_nft_activities( - self, - activities: List[NFTMarketplaceActivities], - ) -> None: - if not activities: - return - - # Sort by pk to avoid postgres deadlock since we're doing multi threaded db writes - activities = sorted( - activities, key=lambda x: (x.transaction_version, x.event_index) - ) - activites_dict = [ - { - "transaction_version": activity.transaction_version, - "event_index": activity.event_index, - "offer_or_listing_id": activity.offer_or_listing_id, - "fee_schedule_id": activity.fee_schedule_id, - "collection_id": activity.collection_id, - "token_data_id": activity.token_data_id, - "creator_address": activity.creator_address, - "collection_name": activity.collection_name, - "token_name": activity.token_name, - "property_version": activity.property_version, - "price": activity.price, - "token_amount": activity.token_amount, - "token_standard": activity.token_standard, - "seller": activity.seller, - "buyer": activity.buyer, - "coin_type": activity.coin_type, - "marketplace": activity.marketplace, - "contract_address": activity.contract_address, - "entry_function_id_str": activity.entry_function_id_str, - "event_type": activity.event_type, - "transaction_timestamp": activity.transaction_timestamp, - } - for activity in activities - ] - with Session() as session, session.begin(): - insert_stmt = insert(NFTMarketplaceActivities).values(activites_dict) - do_update_stmt = insert_stmt.on_conflict_do_update( - constraint="nft_marketplace_activities_pkey", - set_=dict(insert_stmt.excluded.items()), - ) - session.execute(do_update_stmt) - - def insert_nft_listings( - self, - listings: List[CurrentNFTMarketplaceListing], - ) -> None: - if not listings: - return - - # Sort by pk to avoid postgres deadlock since we're doing multi threaded db writes - listings = sorted(listings, key=lambda x: (x.listing_id, x.token_data_id)) - listings_dict = [ - { - "listing_id": listing.listing_id, - "token_data_id": listing.token_data_id, - "collection_id": listing.collection_id, - "fee_schedule_id": listing.fee_schedule_id, - "seller": listing.seller, - "price": listing.price, - "token_amount": listing.token_amount, - "is_deleted": listing.is_deleted, - "token_standard": listing.token_standard, - "coin_type": listing.coin_type, - "marketplace": listing.marketplace, - "contract_address": listing.contract_address, - "entry_function_id_str": listing.entry_function_id_str, - "last_transaction_version": listing.last_transaction_version, - "last_transaction_timestamp": listing.last_transaction_timestamp, - } - for listing in listings - ] - with Session() as session, session.begin(): - insert_stmt = insert(CurrentNFTMarketplaceListing).values(listings_dict) - # Only update if the new transaction version is greater than the current one - do_update_stmt = insert_stmt.on_conflict_do_update( - constraint="current_nft_marketplace_listings_pkey", - set_=dict(insert_stmt.excluded.items()), - where=( - insert_stmt.excluded["last_transaction_version"] - > CurrentNFTMarketplaceListing.last_transaction_version - ), - ) - session.execute(do_update_stmt) - - def insert_nft_token_offers( - self, - offers: List[CurrentNFTMarketplaceTokenOffer], - ) -> None: - if not offers: - return - - # Sort by pk to avoid postgres deadlock since we're doing multi threaded db writes - offers = sorted(offers, key=lambda x: (x.offer_id, x.token_data_id)) - offers_dict = [ - { - "offer_id": offer.offer_id, - "token_data_id": offer.token_data_id, - "collection_id": offer.collection_id, - "fee_schedule_id": offer.fee_schedule_id, - "buyer": offer.buyer, - "price": offer.price, - "token_amount": offer.token_amount, - "expiration_time": offer.expiration_time, - "is_deleted": offer.is_deleted, - "token_standard": offer.token_standard, - "coin_type": offer.coin_type, - "marketplace": offer.marketplace, - "contract_address": offer.contract_address, - "entry_function_id_str": offer.entry_function_id_str, - "last_transaction_version": offer.last_transaction_version, - "last_transaction_timestamp": offer.last_transaction_timestamp, - } - for offer in offers - ] - with Session() as session, session.begin(): - insert_stmt = insert(CurrentNFTMarketplaceTokenOffer).values(offers_dict) - # Only update if the new transaction version is greater than the current one - do_update_stmt = insert_stmt.on_conflict_do_update( - constraint="current_nft_marketplace_token_offers_pkey", - set_=dict(insert_stmt.excluded.items()), - where=( - insert_stmt.excluded["last_transaction_version"] - > CurrentNFTMarketplaceTokenOffer.last_transaction_version - ), - ) - session.execute(do_update_stmt) - - def insert_nft_collection_offers( - self, - offers: List[CurrentNFTMarketplaceCollectionOffer], - ) -> None: - if not offers: - return - - # Sort by pk to avoid postgres deadlock since we're doing multi threaded db writes - offers = sorted(offers, key=lambda x: (x.collection_offer_id, x.collection_id)) - offers_dict = [ - { - "collection_offer_id": offer.collection_offer_id, - "collection_id": offer.collection_id, - "fee_schedule_id": offer.fee_schedule_id, - "buyer": offer.buyer, - "item_price": offer.item_price, - "remaining_token_amount": offer.remaining_token_amount, - "expiration_time": offer.expiration_time, - "is_deleted": offer.is_deleted, - "token_standard": offer.token_standard, - "coin_type": offer.coin_type, - "marketplace": offer.marketplace, - "contract_address": offer.contract_address, - "entry_function_id_str": offer.entry_function_id_str, - "last_transaction_version": offer.last_transaction_version, - "last_transaction_timestamp": offer.last_transaction_timestamp, - } - for offer in offers - ] - with Session() as session, session.begin(): - insert_stmt = insert(CurrentNFTMarketplaceCollectionOffer).values( - offers_dict - ) - # Only update if the new transaction version is greater than the current one - do_update_stmt = insert_stmt.on_conflict_do_update( - constraint="current_nft_marketplace_collection_offers_pkey", - set_=dict(insert_stmt.excluded.items()), - where=( - insert_stmt.excluded["last_transaction_version"] - > CurrentNFTMarketplaceCollectionOffer.last_transaction_version - ), - ) - session.execute(do_update_stmt) - - def insert_nft_auctions( - self, - auctions: List[CurrentNFTMarketplaceAuction], - ) -> None: - if not auctions: - return - - # Sort by pk to avoid postgres deadlock since we're doing multi threaded db writes - auctions = sorted(auctions, key=lambda x: (x.listing_id, x.token_data_id)) - auctions_dict = [ - { - "listing_id": auction.listing_id, - "token_data_id": auction.token_data_id, - "collection_id": auction.collection_id, - "fee_schedule_id": auction.fee_schedule_id, - "seller": auction.seller, - "current_bid_price": auction.current_bid_price, - "current_bidder": auction.current_bidder, - "starting_bid_price": auction.starting_bid_price, - "buy_it_now_price": auction.buy_it_now_price, - "token_amount": auction.token_amount, - "expiration_time": auction.expiration_time, - "is_deleted": auction.is_deleted, - "token_standard": auction.token_standard, - "coin_type": auction.coin_type, - "marketplace": auction.marketplace, - "contract_address": auction.contract_address, - "entry_function_id_str": auction.entry_function_id_str, - "last_transaction_version": auction.last_transaction_version, - "last_transaction_timestamp": auction.last_transaction_timestamp, - } - for auction in auctions - ] - with Session() as session, session.begin(): - insert_stmt = insert(CurrentNFTMarketplaceAuction).values(auctions_dict) - # Only update if the new transaction version is greater than the current one - do_update_stmt = insert_stmt.on_conflict_do_update( - constraint="current_nft_marketplace_auctions_pkey", - set_=dict(insert_stmt.excluded.items()), - where=( - insert_stmt.excluded["last_transaction_version"] - > CurrentNFTMarketplaceAuction.last_transaction_version - ), - ) - session.execute(do_update_stmt) diff --git a/python/processors/nft_orderbooks/__init__.py b/python/processors/nft_orderbooks/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/python/processors/nft_orderbooks/models/nft_marketplace_activities_model.py b/python/processors/nft_orderbooks/models/nft_marketplace_activities_model.py deleted file mode 100644 index 4a82e5a1a..000000000 --- a/python/processors/nft_orderbooks/models/nft_marketplace_activities_model.py +++ /dev/null @@ -1,36 +0,0 @@ -from utils.models.annotated_types import ( - StringType, - BigIntegerPrimaryKeyType, - InsertedAtType, - JsonType, - NullableNumericType, - NullableStringType, - TimestampType, -) -from utils.models.general_models import Base -from utils.models.schema_names import NFT_MARKETPLACE_SCHEMA_NAME - - -class NFTMarketplaceEvent(Base): - __tablename__ = "nft_marketplace_activities" - __table_args__ = {"schema": NFT_MARKETPLACE_SCHEMA_NAME} - - transaction_version: BigIntegerPrimaryKeyType - event_index: BigIntegerPrimaryKeyType - event_type: StringType - standard_event_type: StringType - creator_address: NullableStringType - collection: NullableStringType - token_name: NullableStringType - token_data_id: NullableStringType - collection_id: NullableStringType - price: NullableNumericType - token_amount: NullableNumericType - buyer: NullableStringType - seller: NullableStringType - json_data: JsonType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - transaction_timestamp: TimestampType - inserted_at: InsertedAtType diff --git a/python/processors/nft_orderbooks/models/nft_marketplace_bid_models.py b/python/processors/nft_orderbooks/models/nft_marketplace_bid_models.py deleted file mode 100644 index cb155b3e0..000000000 --- a/python/processors/nft_orderbooks/models/nft_marketplace_bid_models.py +++ /dev/null @@ -1,98 +0,0 @@ -from utils.models.annotated_types import ( - StringType, - StringPrimaryKeyType, - NullableStringType, - BigIntegerType, - BigIntegerPrimaryKeyType, - BooleanType, - InsertedAtType, - NumericType, - NumericPrimaryKeyType, - TimestampType, -) -from utils.models.general_models import Base -from utils.models.schema_names import NFT_MARKETPLACE_SCHEMA_NAME - - -class CurrentNFTMarketplaceBid(Base): - __tablename__ = "current_nft_marketplace_bids" - __table_args__ = {"schema": NFT_MARKETPLACE_SCHEMA_NAME} - - token_data_id: StringPrimaryKeyType - buyer: StringPrimaryKeyType - price: NumericPrimaryKeyType - creator_address: StringType - token_amount: NumericType - token_name: StringType - collection: StringType - collection_id: StringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - is_deleted: BooleanType - last_transaction_version: BigIntegerType - last_transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -class NFTMarketplaceBid(Base): - __tablename__ = "nft_marketplace_bids" - __table_args__ = {"schema": NFT_MARKETPLACE_SCHEMA_NAME} - - transaction_version: BigIntegerPrimaryKeyType - index: BigIntegerPrimaryKeyType - creator_address: StringType - token_name: StringType - token_data_id: StringType - collection: StringType - collection_id: StringType - price: NumericType - token_amount: NumericType - buyer: StringType - seller: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - event_type: StringType - transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -class CurrentNFTMarketplaceCollectionBid(Base): - __tablename__ = "current_nft_marketplace_collection_bids" - __table_args__ = {"schema": NFT_MARKETPLACE_SCHEMA_NAME} - - collection_id: StringPrimaryKeyType - buyer: StringPrimaryKeyType - price: NumericPrimaryKeyType - creator_address: StringType - token_amount: NumericType - collection: StringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - is_deleted: BooleanType - last_transaction_version: BigIntegerType - last_transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -class NFTMarketplaceCollectionBid(Base): - __tablename__ = "nft_marketplace_collection_bids" - __table_args__ = {"schema": NFT_MARKETPLACE_SCHEMA_NAME} - - transaction_version: BigIntegerPrimaryKeyType - index: BigIntegerPrimaryKeyType - creator_address: StringType - collection: StringType - collection_id: StringType - price: NumericType - token_amount: NumericType - buyer: StringType - seller: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - event_type: StringType - transaction_timestamp: TimestampType - inserted_at: InsertedAtType diff --git a/python/processors/nft_orderbooks/models/nft_marketplace_listings_models.py b/python/processors/nft_orderbooks/models/nft_marketplace_listings_models.py deleted file mode 100644 index c9aee54ba..000000000 --- a/python/processors/nft_orderbooks/models/nft_marketplace_listings_models.py +++ /dev/null @@ -1,57 +0,0 @@ -from utils.models.annotated_types import ( - NullableStringType, - StringType, - BigIntegerType, - BigIntegerPrimaryKeyType, - BooleanType, - InsertedAtType, - NumericType, - StringPrimaryKeyType, - TimestampType, -) -from utils.models.general_models import Base -from utils.models.schema_names import NFT_MARKETPLACE_SCHEMA_NAME - - -class CurrentNFTMarketplaceListing(Base): - __tablename__ = "current_nft_marketplace_listings" - __table_args__ = {"schema": NFT_MARKETPLACE_SCHEMA_NAME} - - token_data_id: StringPrimaryKeyType - creator_address: StringType - token_name: StringType - collection: StringType - collection_id: StringType - price: NumericType - token_amount: NumericType - seller: StringType - is_deleted: BooleanType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - last_transaction_version: BigIntegerType - last_transaction_timestamp: TimestampType - inserted_at: InsertedAtType - - -class NFTMarketplaceListing(Base): - __tablename__ = "nft_marketplace_listings" - __table_args__ = {"schema": NFT_MARKETPLACE_SCHEMA_NAME} - - transaction_version: BigIntegerPrimaryKeyType - index: BigIntegerPrimaryKeyType - creator_address: StringType - token_name: StringType - token_data_id: StringType - collection: StringType - collection_id: StringType - price: NumericType - token_amount: NumericType - seller: StringType - buyer: NullableStringType - marketplace: StringType - contract_address: StringType - entry_function_id_str: StringType - event_type: StringType - transaction_timestamp: TimestampType - inserted_at: InsertedAtType diff --git a/python/processors/nft_orderbooks/nft_marketplace_constants.py b/python/processors/nft_orderbooks/nft_marketplace_constants.py deleted file mode 100644 index 95c7117ba..000000000 --- a/python/processors/nft_orderbooks/nft_marketplace_constants.py +++ /dev/null @@ -1,224 +0,0 @@ -from processors.nft_orderbooks.nft_marketplace_enums import MarketplaceName - -MARKETPLACE_SMART_CONTRACT_ADDRESSES = { - MarketplaceName.TOPAZ: set( - [ - "0x2c7bccf7b31baf770fdbcc768d9e9cb3d87805e255355df5db32ac9a669010a2", - "0xd4c70815e9d245a097646af821ecf87a073039e71e93c8cd04a0da082134d296", - ] - ), - MarketplaceName.SOUFFLE: set( - ["0xf6994988bd40261af9431cd6dd3fcf765569719e66322c7a05cc78a89cd366d4"] - ), - MarketplaceName.BLUEMOVE: set( - ["0xd1fd99c1944b84d1670a2536417e997864ad12303d19eac725891691b04d614e"] - ), - MarketplaceName.OKX: set( - ["0x1e6009ce9d288f3d5031c06ca0b19a334214ead798a0cb38808485bd6d997a43"] - ), - MarketplaceName.OZOZOZ: set( - ["0xded0c1249b522cecb11276d2fad03e6635507438fef042abeea3097846090bcd"] - ), - MarketplaceName.ITSRARE: set( - ["0x143f6a7a07c76eae1fc9ea030dbd9be3c2d46e538c7ad61fe64529218ff44bc4"] - ), - MarketplaceName.APTOMINGOS_AUCTION: set( - ["0x98937acca8bc2c164dff158156ab06f9c99bbbb050129d7a514a37ccb1b8e49e"] - ), -} - -MARKETPLACE_SMART_CONTRACT_ADDRESSES_INV = { - vv: k for k, v in MARKETPLACE_SMART_CONTRACT_ADDRESSES.items() for vv in v -} - -MARKETPLACE_ENTRY_FUNCTIONS = { - MarketplaceName.TOPAZ: set( - [ - "bid_any::bid", - "bid_any::cancel_bid", - "bid_any::sell", - "collection_marketplace::bid", - "collection_marketplace::cancel", - "collection_marketplace::fill", - "collection_marketplace::fill_many", - "marketplace_v2::buy", - "marketplace_v2::buy_many", - "marketplace_v2::delist", - "marketplace_v2::list", - "marketplace_v2::list_many", - "edit_listing::edit", - ] - ), - MarketplaceName.SOUFFLE: set( - [ - "FixedPriceMarket::batch_buy_script", - "FixedPriceMarket::batch_cancel_list_script", - "FixedPriceMarket::batch_change_price_script", - "FixedPriceMarket::batch_list_script", - ] - ), - MarketplaceName.BLUEMOVE: set( - [ - "marketplaceV2::accept_offer", - "marketplaceV2::accept_offer_collection", - "marketplaceV2::batch_buy_script", - "marketplaceV2::batch_delist_script", - "marketplaceV2::batch_list_script", - "marketplaceV2::cancel_offer_collection", - "marketplaceV2::cancel_offer_token", - "marketplaceV2::change_price_token", - "marketplaceV2::inittialize_offer", - "marketplaceV2::inittialize_offer_collection", - ] - ), - MarketplaceName.OKX: set( - [ - "okx_fixed_price::create_direct_listing", - "okx_fixed_price::buy_direct_listing", - "Aggregator::batch_delist_script_V2", - "markets::list_tokens_v2", - "markets::buy_tokens_v2", - "okx_fixed_price::cancel_direct_listing", - "Aggregator::batch_change_price_script_V2", - ] - ), - MarketplaceName.OZOZOZ: set( - [ - "OzozozMarketplace::buyNFT", - "OzozozMarketplace::delist", - "OzozozMarketplace::buy", - "OzozozMarketplace::updatePrice", - "OzozozMarketplace::list", - ] - ), - MarketplaceName.ITSRARE: set( - [ - "MarketPlace::buy", - "MarketPlace::delist", - "MarketPlace::list", - ] - ), -} - - -MARKETPLACE_ADDRESS_MATCH_REGEX_STRINGS = { - MarketplaceName.TOPAZ: "^0x2c7bccf7b31baf770fdbcc768d9e9cb3d87805e255355df5db32ac9a669010a2.*$", - MarketplaceName.SOUFFLE: "^0xf6994988bd40261af9431cd6dd3fcf765569719e66322c7a05cc78a89cd366d4.*FixedPriceMarket.*$", - MarketplaceName.BLUEMOVE: "^0xd1fd99c1944b84d1670a2536417e997864ad12303d19eac725891691b04d614e.*$", - MarketplaceName.OKX: "^0x1e6009ce9d288f3d5031c06ca0b19a334214ead798a0cb38808485bd6d997a43.*$", - MarketplaceName.OZOZOZ: "^0xded0c1249b522cecb11276d2fad03e6635507438fef042abeea3097846090bcd.*OzozozMarketplace.*$", - MarketplaceName.ITSRARE: "^0x143f6a7a07c76eae1fc9ea030dbd9be3c2d46e538c7ad61fe64529218ff44bc4.*$", - MarketplaceName.APTOMINGOS_AUCTION: "^0x98937acca8bc2c164dff158156ab06f9c99bbbb050129d7a514a37ccb1b8e49e.*$", -} - -# Topaz -TOPAZ_MARKETPLACE_EVENT_TYPES = set( - [ - # these are trade-related events - # trade-related events are by nature also orderbook-related events - "events::BuyEvent", - "events::SellEvent", - "events::FillCollectionBidEvent", - # these are orderbook-related events - "events::ListEvent", - "events::DelistEvent", - "events::BidEvent", - "events::CancelBidEvent", - "events::CollectionBidEvent", - "events::CancelCollectionBidEvent" - # unrelated to order book; these are filtered out (included here in comments for documentation) - # "token_coin_swap::TokenListingEvent" -- redundant with events::ListEvent - # "token_coin_swap::TokenSwapEvent" -- redundant with events::BuyEvent - # "events::SendEvent" -- transfer events do not affect order book - # "events::ClaimEvent" -- transfer events do not affect order book - ] -) -TOPAZ_LISTINGS_TABLE_HANDLE = ( - "0xe32a79149395a3cb3611fd30f748be07c49adb10c36e4ff7cda52708e7ac025a" -) -TOPAZ_BID_COIN_STORE_TABLE_HANDLE = ( - "0x094ec7243415588f97de9765562a7057a528180110e10513951e64d27d5f6612" -) -TOPAZ_BIDS_TABLE_HANDLE = ( - "0x9e13f27559a044dcdcbc262e9c9f32a3e21d2bcb15ca1952d8f4d374e3210bdf" -) -TOPAZ_COLLECTION_BIDS_TABLE_HANDLE = ( - "0x8f89a3d01d95119fbbb49e416a04394da369792b620536fcc9aa797589b18e5b" -) - -# Souffle -SOUFFLE_MARKETPLACE_EVENT_TYPES = set( - [ - # these are trade-related events - # trade-related events are by nature also orderbook-related events - "FixedPriceMarket::BuyTokenEvent", - # these are orderbook-related events - "FixedPriceMarket::ListTokenEvent", - "FixedPriceMarket::CancelListTokenEvent", - ] -) -SOUFFLE_LISTINGS_TABLE_HANDLE = ( - "0xa8426491baaed45f0d13bdf687e9f55959bdf297b685cbf61c6e968c81380d5f" -) - -# Bluemove -BLUEMOVE_MARKETPLACE_EVENT_TYPES = set( - [ - # these are trade-related events - "marketplaceV2::BuyEvent", # purchase - "offer_lib::AcceptOfferCollectionEvent", # accept global bid - "offer_lib::AcceptOfferEvent", # accept bid - # these are orderbook related events - "offer_lib::OfferCollectionEvent", # global bid - "offer_lib::CancelOfferCollectionEvent", # cancelled global bid - "offer_lib::OfferEvent", # bid - "offer_lib::CancelOfferEvent", # cancelled bid - "marketplaceV2::ListEvent", # listing - "marketplaceV2::ChangePriceEvent", # change price of listing - "marketplaceV2::DelistEvent" # cancel listing - # # all auctions on bluemove look unsuccessful - # ,'marketplaceV2::AuctionEvent' - # ,'marketplaceV2::BidEvent' # bids on unsuccessful auctions - # # unrelated to order book; these are filtered out (included here in comments for documentation) - # ,'marketplaceV2::ClaimTokenEvent' - # ,'marketplaceV2::ClaimCoinsEvent' - # ,'offer_lib::ClaimTokenOffer' - # ,'offer_lib::ClaimTokenOfferCollectionEvent' - ] -) - -BLUEMOVE_LISTINGS_TABLE_HANDLE = ( - "0x7ccc0aa7c30736fbc1f4ba34f4e8fab4a5cad3d1bd520af716716087affb67f9" -) - -BLUEMOVE_BIDS_TABLE_HANDLE = ( - "0x6e5cefeb3c74d6fbfb559cda6b173024de2a8e3e0598e96c3e090e675a306fd6" -) - -BLUEMOVE_COLLECTION_BIDS_TABLE_HANDLE = ( - "0x892b432784f8147bfd1ed4cea039783d48a5a4d317ee14b334518ec6d899e3a5" -) - -# Marketplace table handles -MARKETPLACE_TABLE_HANDLES = { - MarketplaceName.TOPAZ: set( - [ - TOPAZ_LISTINGS_TABLE_HANDLE, - TOPAZ_BID_COIN_STORE_TABLE_HANDLE, - TOPAZ_BIDS_TABLE_HANDLE, - TOPAZ_COLLECTION_BIDS_TABLE_HANDLE, - ] - ), - MarketplaceName.SOUFFLE: set([SOUFFLE_LISTINGS_TABLE_HANDLE]), - MarketplaceName.BLUEMOVE: set( - [ - BLUEMOVE_LISTINGS_TABLE_HANDLE, - BLUEMOVE_BIDS_TABLE_HANDLE, - BLUEMOVE_COLLECTION_BIDS_TABLE_HANDLE, - ] - ), -} - -MARKETPLACE_TABLE_HANDLES_INV = { - vv: k for k, v in MARKETPLACE_TABLE_HANDLES.items() for vv in v -} diff --git a/python/processors/nft_orderbooks/nft_marketplace_enums.py b/python/processors/nft_orderbooks/nft_marketplace_enums.py deleted file mode 100644 index cf5ed89e8..000000000 --- a/python/processors/nft_orderbooks/nft_marketplace_enums.py +++ /dev/null @@ -1,86 +0,0 @@ -import datetime - -from dataclasses import dataclass -from enum import Enum -from typing import Optional - - -class MarketplaceName(Enum): - TOPAZ = "topaz" - SOUFFLE = "souffle" - BLUEMOVE = "bluemove" - OKX = "okx" - OZOZOZ = "ozozoz" - ITSRARE = "itsrare" - APTOMINGOS_AUCTION = "aptomingos_auction" - EXAMPLE_V2_MARKETPLACE = "example_v2_marketplace" - - -class StandardMarketplaceEventType(Enum): - BID_CANCEL = "bid cancel" - BID_CHANGE = "bid change" - BID_FILLED = "bid filled" - BID_PLACE = "bid place" - LISTING_CANCEL = "listing cancel" - LISTING_CHANGE = "listing change" - LISTING_FILLED = "listing filled" - LISTING_PLACE = "listing place" - UNKNOWN = "unknown" - - -@dataclass -class ListingTableMetadata: - creator_address: Optional[str] - token_data_id: Optional[str] - token_name: Optional[str] - collection: Optional[str] - collection_id: Optional[str] - price: Optional[float] - amount: Optional[float] - seller: Optional[str] - - -@dataclass -class MarketplaceEventMetadata: - creator_address: Optional[str] - token_data_id: Optional[str] - token_name: Optional[str] - collection: Optional[str] - collection_id: Optional[str] - price: Optional[float] - amount: Optional[float] - buyer: Optional[str] - seller: Optional[str] - - -@dataclass -class BidMetadata: - creator_address: Optional[str] - token_data_id: Optional[str] - token_name: Optional[str] - collection: Optional[str] - collection_id: Optional[str] - price: Optional[float] - amount: Optional[float] - buyer: Optional[str] - seller: Optional[str] - - -@dataclass -class CollectionBidMetadata: - creator_address: Optional[str] - collection: Optional[str] - collection_id: Optional[str] - price: Optional[float] - amount: Optional[float] # Amount of tokens left in the collection bid - buyer: Optional[str] - seller: Optional[str] - is_cancelled: Optional[bool] - - -@dataclass -class TransactionMetadata: - transaction_version: int - transaction_timestamp: datetime.datetime - contract_address: str - entry_function_id_str_short: str diff --git a/python/processors/nft_orderbooks/nft_marketplace_processor.py b/python/processors/nft_orderbooks/nft_marketplace_processor.py deleted file mode 100644 index 4f260ef77..000000000 --- a/python/processors/nft_orderbooks/nft_marketplace_processor.py +++ /dev/null @@ -1,165 +0,0 @@ -from typing import List -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from processors.nft_orderbooks.nft_marketplace_enums import MarketplaceName -from processors.nft_orderbooks.nft_marketplace_constants import ( - MARKETPLACE_ENTRY_FUNCTIONS, - MARKETPLACE_SMART_CONTRACT_ADDRESSES_INV, - MARKETPLACE_TABLE_HANDLES_INV, -) -from processors.nft_orderbooks.parsers import ( - bluemove_parser, - itsrare_parser, - okx_parser, - ozozoz_parser, - souffle_parser, - topaz_parser, -) -from processors.nft_orderbooks.models.nft_marketplace_activities_model import ( - NFTMarketplaceEvent, -) -from processors.nft_orderbooks.models.nft_marketplace_bid_models import ( - NFTMarketplaceBid, - CurrentNFTMarketplaceBid, - NFTMarketplaceCollectionBid, - CurrentNFTMarketplaceCollectionBid, -) -from processors.nft_orderbooks.models.nft_marketplace_listings_models import ( - CurrentNFTMarketplaceListing, - NFTMarketplaceListing, -) -from processors.nft_orderbooks.nft_orderbooks_parser_utils import MarketplaceName -from sqlalchemy.dialects.postgresql import insert -from sqlalchemy.orm import Session -from utils.transactions_processor import TransactionsProcessor, ProcessingResult -from utils import event_utils, general_utils, transaction_utils, write_set_change_utils -from utils.models.schema_names import NFT_MARKETPLACE_SCHEMA_NAME -from utils.session import Session -from utils.processor_name import ProcessorName -from time import perf_counter - - -class NFTMarketplaceProcesser(TransactionsProcessor): - def name(self) -> str: - return ProcessorName.NFT_MARKETPLACE_V1_PROCESSOR.value - - def schema(self) -> str: - return NFT_MARKETPLACE_SCHEMA_NAME - - def process_transactions( - self, - transactions: list[transaction_pb2.Transaction], - start_version: int, - end_version: int, - ) -> ProcessingResult: - parsed_objs = [] - start_time = perf_counter() - for transaction in transactions: - user_transaction = transaction_utils.get_user_transaction(transaction) - - # Filter user transactions - if not user_transaction: - continue - - events = user_transaction.events - for event_index, event in enumerate(events): - contract_address = general_utils.standardize_address( - event_utils.get_event_type_address(event) - ) - - if contract_address not in MARKETPLACE_SMART_CONTRACT_ADDRESSES_INV: - continue - - marketplace_name = MARKETPLACE_SMART_CONTRACT_ADDRESSES_INV[ - contract_address - ] - - # TODO: Optimize this; there's too many loops - match (marketplace_name): - case MarketplaceName.TOPAZ: - parsed_objs.extend( - topaz_parser.parse_event(transaction, event, event_index) - ) - case MarketplaceName.SOUFFLE: - parsed_objs.extend( - souffle_parser.parse_event(transaction, event, event_index) - ) - case MarketplaceName.BLUEMOVE: - parsed_objs.extend( - bluemove_parser.parse_event(transaction, event, event_index) - ) - case MarketplaceName.OKX: - parsed_objs.extend( - okx_parser.parse_marketplace_events(transaction) - ) - case MarketplaceName.OZOZOZ: - parsed_objs.extend( - ozozoz_parser.parse_marketplace_events(transaction) - ) - case MarketplaceName.ITSRARE: - parsed_objs.extend( - itsrare_parser.parse_marketplace_events(transaction) - ) - - write_set_changes = transaction_utils.get_write_set_changes(transaction) - for wsc_index, wsc in enumerate(write_set_changes): - write_table_item = write_set_change_utils.get_write_table_item(wsc) - - if write_table_item: - table_handle = str(write_table_item.handle) - - if table_handle not in MARKETPLACE_TABLE_HANDLES_INV: - continue - - marketplace_name = MARKETPLACE_TABLE_HANDLES_INV[table_handle] - - match (marketplace_name): - case MarketplaceName.TOPAZ: - parsed_objs.extend( - topaz_parser.parse_write_table_item( - transaction, write_table_item, wsc_index - ) - ) - case MarketplaceName.SOUFFLE: - parsed_objs.extend( - souffle_parser.parse_write_table_item( - transaction, write_table_item, wsc_index - ) - ) - case MarketplaceName.BLUEMOVE: - parsed_objs.extend( - bluemove_parser.parse_write_table_item( - transaction, write_table_item, wsc_index - ) - ) - - # TODO: Sort by pk for multi threaded postgres insert - processing_duration_in_secs = perf_counter() - start_time - - start_time = perf_counter() - self.insert_to_db( - parsed_objs, - ) - db_insertion_duration_in_secs = perf_counter() - start_time - return ProcessingResult( - start_version=start_version, - end_version=end_version, - processing_duration_in_secs=processing_duration_in_secs, - db_insertion_duration_in_secs=db_insertion_duration_in_secs, - ) - - def insert_to_db( - self, - parsed_objs: List[ - NFTMarketplaceEvent - | NFTMarketplaceListing - | CurrentNFTMarketplaceListing - | NFTMarketplaceBid - | CurrentNFTMarketplaceBid - | NFTMarketplaceCollectionBid - | CurrentNFTMarketplaceCollectionBid - ], - ) -> None: - with Session() as session, session.begin(): - # TODO: Turn this into on conflict, update, to support backfilling - for obj in parsed_objs: - session.merge(obj) diff --git a/python/processors/nft_orderbooks/nft_orderbooks_parser_utils.py b/python/processors/nft_orderbooks/nft_orderbooks_parser_utils.py deleted file mode 100644 index 451cb2125..000000000 --- a/python/processors/nft_orderbooks/nft_orderbooks_parser_utils.py +++ /dev/null @@ -1,166 +0,0 @@ -import datetime -import re - -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from dataclasses import dataclass -from typing import List -from processors.nft_orderbooks.nft_marketplace_constants import ( - MARKETPLACE_SMART_CONTRACT_ADDRESSES, - MARKETPLACE_ENTRY_FUNCTIONS, - MARKETPLACE_ADDRESS_MATCH_REGEX_STRINGS, -) -from processors.nft_orderbooks.nft_marketplace_enums import ( - MarketplaceName, - TransactionMetadata, - ListingTableMetadata, - BidMetadata, -) -from processors.nft_orderbooks.models.nft_marketplace_listings_models import ( - CurrentNFTMarketplaceListing, -) -from processors.nft_orderbooks.models.nft_marketplace_bid_models import ( - CurrentNFTMarketplaceBid, - CurrentNFTMarketplaceCollectionBid, -) -from utils import general_utils, transaction_utils -from utils.session import Session - - -@dataclass -class RawMarketplaceEvent: - transaction_version: int - event_index: int - event_type: str - json_data: str - contract_address: str - entry_function_name: str - transaction_timestamp: datetime.datetime - - -def get_marketplace_events( - transaction: transaction_pb2.Transaction, marketplaceName: MarketplaceName -) -> List[RawMarketplaceEvent]: - # Filter out all non-user transactions - if transaction.type != transaction_pb2.Transaction.TRANSACTION_TYPE_USER: - return [] - - transaction_version = transaction.version - transaction_timestamp = general_utils.convert_pb_timestamp_to_datetime( - transaction.timestamp - ) - - user_transaction = transaction_utils.get_user_transaction(transaction) - assert user_transaction is not None - - entry_function_payload = transaction_utils.get_entry_function_payload( - user_transaction - ) - entry_function = entry_function_payload.function - module = entry_function.module - contract_addr = module.address - entry_function_name = f"{module.name}::{entry_function.name}" - - raw_marketplace_events = [] - for event_index, event in enumerate(user_transaction.events): - event_type = event.type_str - event_type_match = re.search( - MARKETPLACE_ADDRESS_MATCH_REGEX_STRINGS[marketplaceName], event_type - ) - if event_type_match == None: - continue - - raw_marketplace_event = RawMarketplaceEvent( - transaction_version, - event_index, - event_type, - json_data=event.data, - contract_address=contract_addr, - entry_function_name=entry_function_name, - transaction_timestamp=transaction_timestamp, - ) - - raw_marketplace_events.append(raw_marketplace_event) - - return raw_marketplace_events - - -def parse_transaction_metadata( - transaction: transaction_pb2.Transaction, -) -> TransactionMetadata: - user_transaction = transaction_utils.get_user_transaction(transaction) - assert user_transaction - - transaction_version = transaction.version - transaction_timestamp = general_utils.convert_pb_timestamp_to_datetime( - transaction.timestamp - ) - contract_address = transaction_utils.get_contract_address(user_transaction) - entry_function_id_str_short = transaction_utils.get_entry_function_id_str_short( - user_transaction - ) - - return TransactionMetadata( - transaction_version, - transaction_timestamp, - contract_address, - entry_function_id_str_short, - ) - - -def lookup_current_listing_in_db( - token_data_id: str, -) -> ListingTableMetadata | None: - listing_metadata = None - - with Session() as session, session.begin(): - listing = ( - session.query(CurrentNFTMarketplaceListing) - .filter(CurrentNFTMarketplaceListing.token_data_id == token_data_id) - .one_or_none() - ) - - if listing: - listing_metadata = ListingTableMetadata( - creator_address=listing.creator_address, - token_data_id=listing.token_data_id, - token_name=listing.token_name, - collection=listing.collection, - collection_id=listing.collection_id, - price=listing.price, - amount=listing.token_amount, - seller=listing.seller, - ) - - return listing_metadata - - -def lookup_current_bid_in_db( - token_data_id: str, - buyer: str, -) -> BidMetadata | None: - bid_metadata = None - - with Session() as session, session.begin(): - bid = ( - session.query(CurrentNFTMarketplaceBid) - .filter( - CurrentNFTMarketplaceBid.token_data_id == token_data_id, - CurrentNFTMarketplaceBid.buyer == buyer, - ) - .one_or_none() - ) - - if bid: - bid_metadata = BidMetadata( - creator_address=bid.creator_address, - token_data_id=bid.token_data_id, - token_name=bid.token_name, - collection=bid.collection, - collection_id=bid.collection_id, - price=bid.price, - amount=bid.token_amount, - buyer=bid.buyer, - seller=None, - ) - - return bid_metadata diff --git a/python/processors/nft_orderbooks/parsers/bluemove_parser.py b/python/processors/nft_orderbooks/parsers/bluemove_parser.py deleted file mode 100644 index a055d566e..000000000 --- a/python/processors/nft_orderbooks/parsers/bluemove_parser.py +++ /dev/null @@ -1,728 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -import json -from typing import List -from processors.nft_orderbooks.nft_marketplace_enums import ( - MarketplaceName, - StandardMarketplaceEventType, - ListingTableMetadata, - BidMetadata, - CollectionBidMetadata, -) -from processors.nft_orderbooks.nft_marketplace_constants import ( - BLUEMOVE_MARKETPLACE_EVENT_TYPES, - BLUEMOVE_LISTINGS_TABLE_HANDLE, - BLUEMOVE_BIDS_TABLE_HANDLE, - BLUEMOVE_COLLECTION_BIDS_TABLE_HANDLE, -) -from processors.nft_orderbooks.models.nft_marketplace_activities_model import ( - NFTMarketplaceEvent, -) -from processors.nft_orderbooks.models.nft_marketplace_bid_models import ( - CurrentNFTMarketplaceBid, - NFTMarketplaceBid, - CurrentNFTMarketplaceCollectionBid, - NFTMarketplaceCollectionBid, -) -from processors.nft_orderbooks.models.nft_marketplace_listings_models import ( - CurrentNFTMarketplaceListing, - NFTMarketplaceListing, -) -from processors.nft_orderbooks.nft_orderbooks_parser_utils import ( - parse_transaction_metadata, - lookup_current_listing_in_db, - lookup_current_bid_in_db, -) -from utils.token_utils import CollectionDataIdType, TokenDataIdType, standardize_address -from utils import event_utils, transaction_utils -from utils.session import Session - - -def parse_event( - transaction: transaction_pb2.Transaction, - event: transaction_pb2.Event, - event_index: int, -) -> List[NFTMarketplaceEvent]: - parsed_objs = [] - - transaction_metadata = parse_transaction_metadata(transaction) - - # Readable transaction event type - display_event_type = event_utils.get_event_type_short(event) - - if display_event_type not in BLUEMOVE_MARKETPLACE_EVENT_TYPES: - return [] - - data = json.loads(event.data) - standard_marketplace_event_type = standardize_marketplace_event_type( - display_event_type - ) - - # Collection, token, and creator parsing - token_data_id_struct1 = data.get("token_id", {}).get("token_data_id", {}) - token_data_id_struct2 = data.get("id", {}).get("token_data_id", {}) - offer_collection_item_struct = data.get("offer_collection_item", {}) - - collection = str( - token_data_id_struct1.get("collection") - or token_data_id_struct2.get("collection") - or offer_collection_item_struct.get("collection_name") - or None - ) - token_name = str( - token_data_id_struct1.get("name") or token_data_id_struct2.get("name") or None - ) - creator = str( - token_data_id_struct1.get("creator") - or token_data_id_struct2.get("creator") - or offer_collection_item_struct.get("creator_address") - or None - ) - - token_data_id_type = None - collection_data_id_type = CollectionDataIdType(creator, collection) - if token_name != None: - token_data_id_type = TokenDataIdType(creator, collection, token_name) - - # Price parsing - bid_amount = data.get("bid", None) - min_selling_price = data.get("min_selling_price", None) - amount_per_item = offer_collection_item_struct.get("amount_per_item", None) - price_amount = data.get("amount", None) - price = bid_amount or min_selling_price or price_amount or amount_per_item - price = int(price) if price else None - - # Amount parsing - quantity_offer_items = int( - offer_collection_item_struct.get("quantity_offer_items", 0) - ) - quantity_cancel_items = int(data.get("quantity_cancel_items", 0)) - amount = int( - quantity_cancel_items - or ( - quantity_offer_items - if standard_marketplace_event_type == StandardMarketplaceEventType.BID_PLACE - else None - ) - or 1 - ) - - # Buyer and seller parsing - buyer_bidder = data.get("bider_address", None) - buyer_address = data.get("buyer_address", None) - offerer1 = offer_collection_item_struct.get("offerer", None) - offerer2 = data.get("offerer", None) - buyer = buyer_bidder or offerer1 or offerer2 or buyer_address - buyer = standardize_address(str(buyer)) if buyer else None - - owner_address = str(data.get("owner_address", None)) - seller_address = str(data.get("seller_address", None)) - seller_accepted_token_bids = str(data.get("owner_token", None)) - can_claim_tokens_data = offer_collection_item_struct.get( - "can_claim_tokens", {} - ).get("data", []) - seller_accepted_collection_bids = ( - can_claim_tokens_data[0] if len(can_claim_tokens_data) > 0 else {} - ).get("value", None) - seller = ( - seller_address - or owner_address - or seller_accepted_token_bids - or seller_accepted_collection_bids - ) - seller = standardize_address(seller) if seller else None - - activity = NFTMarketplaceEvent( - transaction_version=transaction_metadata.transaction_version, - event_index=event_index, - event_type=display_event_type, - standard_event_type=standard_marketplace_event_type.value, - creator_address=collection_data_id_type.get_creator(), - collection=collection_data_id_type.get_name_trunc(), - token_name=token_data_id_type.get_name_trunc() if token_data_id_type else None, - token_data_id=token_data_id_type.to_hash() if token_data_id_type else None, - collection_id=collection_data_id_type.to_hash(), - price=price, - token_amount=amount, - buyer=buyer, - seller=seller, - json_data=event.data, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - parsed_objs.append(activity) - - # Handle listing cancel and fill events - if ( - standard_marketplace_event_type - in set( - [ - StandardMarketplaceEventType.LISTING_CANCEL, - StandardMarketplaceEventType.LISTING_FILLED, - ] - ) - and token_data_id_type is not None - ): - # Lookup previous listing price - previous_price = 0 - previous_seller = None - previous_listing_metadata = lookup_current_listing_in_db( - token_data_id_type.to_hash() - ) - if previous_listing_metadata: - previous_price = previous_listing_metadata.price - previous_seller = previous_listing_metadata.seller - - # Get seller from previous listing if listing is filled - if ( - previous_seller - and standard_marketplace_event_type - == StandardMarketplaceEventType.LISTING_FILLED - ): - seller = previous_seller - - listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=standardize_address(creator), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=previous_price, - token_amount=amount - * -1, # Negative if listing is canceled, filled, or edited - seller=seller, - buyer=buyer, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(listing) - - current_listing = CurrentNFTMarketplaceListing( - token_data_id=token_data_id_type.to_hash(), - creator_address=standardize_address(creator), - token_name=token_data_id_type.get_name_trunc(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=previous_price, - token_amount=0, # Zero if listing is canceled or filled - seller=seller, - is_deleted=True, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(current_listing) - - # Handle bid cancel events - elif display_event_type == "offer_lib::CancelOfferEvent" and token_data_id_type: - # Lookup previous bid price - old_bid_price = 0 - if token_data_id_type and buyer: - old_bid_metadata = lookup_current_bid_in_db( - token_data_id_type.to_hash(), buyer - ) - if old_bid_metadata: - old_bid_price = old_bid_metadata.price - - bid = NFTMarketplaceBid( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=token_data_id_type.get_creator(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=old_bid_price, - token_amount=-1, - buyer=buyer, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_bid = CurrentNFTMarketplaceBid( - token_data_id=token_data_id_type.to_hash(), - creator_address=token_data_id_type.get_creator(), - token_name=token_data_id_type.get_name_trunc(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=old_bid_price, - token_amount=0, - buyer=buyer, - is_deleted=True, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(bid) - parsed_objs.append(current_bid) - - # Handle collection bid cancel events - elif display_event_type == "offer_lib::CancelOfferCollectionEvent": - collection_bid = NFTMarketplaceCollectionBid( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=collection_data_id_type.get_creator(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=int(amount_per_item) if amount_per_item else None, - token_amount=quantity_cancel_items * -1, - buyer=buyer, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - current_collection_bid = CurrentNFTMarketplaceCollectionBid( - creator_address=collection_data_id_type.get_creator(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=int(amount_per_item) if amount_per_item else None, - token_amount=0, - buyer=buyer, - is_deleted=True, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - parsed_objs.append(collection_bid) - parsed_objs.append(current_collection_bid) - - # Handle collection bid place events - elif display_event_type == "offer_lib::OfferCollectionEvent": - collection_bid = NFTMarketplaceCollectionBid( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=collection_data_id_type.get_creator(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=int(amount_per_item) if amount_per_item else None, - token_amount=amount, - buyer=buyer, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - current_collection_bid = CurrentNFTMarketplaceCollectionBid( - creator_address=collection_data_id_type.get_creator(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=int(amount_per_item) if amount_per_item else None, - token_amount=amount, - buyer=buyer, - is_deleted=False, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - parsed_objs.append(collection_bid) - parsed_objs.append(current_collection_bid) - - # Handle collection bid fill events - elif display_event_type == "offer_lib::AcceptOfferCollectionEvent": - collection_bid = NFTMarketplaceCollectionBid( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=collection_data_id_type.get_creator(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=int(amount_per_item) if amount_per_item else None, - token_amount=-1, - buyer=buyer, - seller=seller, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - current_collection_bid = CurrentNFTMarketplaceCollectionBid( - creator_address=collection_data_id_type.get_creator(), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=int(amount_per_item) if amount_per_item else None, - token_amount=quantity_offer_items, - buyer=buyer, - is_deleted=quantity_offer_items == 0, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - parsed_objs.append(collection_bid) - parsed_objs.append(current_collection_bid) - - return parsed_objs - - -def parse_write_table_item( - transaction: transaction_pb2.Transaction, - write_table_item: transaction_pb2.WriteTableItem, - wsc_index: int, -) -> List[ - NFTMarketplaceEvent - | NFTMarketplaceListing - | CurrentNFTMarketplaceListing - | NFTMarketplaceBid - | CurrentNFTMarketplaceBid - | NFTMarketplaceCollectionBid - | CurrentNFTMarketplaceCollectionBid -]: - parsed_objs = [] - - user_transaction = transaction_utils.get_user_transaction(transaction) - assert user_transaction - - transaction_metadata = parse_transaction_metadata(transaction) - - table_handle = write_table_item.handle - - # Handle listing place and edit events - if table_handle == BLUEMOVE_LISTINGS_TABLE_HANDLE: - event_types = set( - [ - event_utils.get_event_type_short(event) - for event in user_transaction.events - ] - ) - is_edit = "marketplaceV2::ChangePriceEvent" in event_types - - standard_marketplace_event_type = ( - StandardMarketplaceEventType.LISTING_CHANGE - if is_edit - else StandardMarketplaceEventType.LISTING_PLACE - ) - listing_metadata = parse_listing(write_table_item) - - if not listing_metadata: - return parsed_objs - - # When a listing is edited, this is represetned as a listing delete and - # listing place in nft_marketplace_listings - if is_edit and listing_metadata.token_data_id: - old_listing_metadata = lookup_current_listing_in_db( - listing_metadata.token_data_id - ) - - if old_listing_metadata: - delete_listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=wsc_index * -1, # To avoid collision with place listing index - creator_address=old_listing_metadata.creator_address, - token_name=old_listing_metadata.token_name, - token_data_id=old_listing_metadata.token_data_id, - collection=old_listing_metadata.collection, - collection_id=old_listing_metadata.collection_id, - price=old_listing_metadata.price, - token_amount=old_listing_metadata.amount * -1 - if old_listing_metadata.amount - else None, - seller=old_listing_metadata.seller, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(delete_listing) - - listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=wsc_index, - creator_address=listing_metadata.creator_address, - token_name=listing_metadata.token_name, - token_data_id=listing_metadata.token_data_id, - collection=listing_metadata.collection, - collection_id=listing_metadata.collection_id, - price=listing_metadata.price, - token_amount=listing_metadata.amount, - seller=listing_metadata.seller, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_listing = CurrentNFTMarketplaceListing( - token_data_id=listing_metadata.token_data_id, - creator_address=listing_metadata.creator_address, - token_name=listing_metadata.token_name, - collection=listing_metadata.collection, - collection_id=listing_metadata.collection_id, - price=listing_metadata.price, - token_amount=listing_metadata.amount, - seller=listing_metadata.seller, - is_deleted=False, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(listing) - parsed_objs.append(current_listing) - - # Handle bid place and fill events - elif table_handle == BLUEMOVE_BIDS_TABLE_HANDLE: - bid_data = parse_bid(write_table_item) - - if not bid_data: - return parsed_objs - - standard_marketplace_event_type = ( - StandardMarketplaceEventType.BID_FILLED - if bid_data.seller - else StandardMarketplaceEventType.BID_PLACE - ) - - if standard_marketplace_event_type == StandardMarketplaceEventType.BID_FILLED: - amount = -1 - is_deleted = True - else: - amount = 1 - is_deleted = False - - bid = NFTMarketplaceBid( - transaction_version=transaction_metadata.transaction_version, - index=wsc_index, - creator_address=bid_data.creator_address, - token_name=bid_data.token_name, - token_data_id=bid_data.token_data_id, - collection=bid_data.collection, - collection_id=bid_data.collection_id, - price=bid_data.price, - token_amount=amount, - buyer=bid_data.buyer, - seller=bid_data.seller, - event_type=standard_marketplace_event_type.value, - marketplace=MarketplaceName.BLUEMOVE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_bid = CurrentNFTMarketplaceBid( - token_data_id=bid_data.token_data_id, - creator_address=bid_data.creator_address, - token_name=bid_data.token_name, - collection=bid_data.collection, - collection_id=bid_data.collection_id, - price=bid_data.price, - token_amount=amount, - buyer=bid_data.buyer, - is_deleted=is_deleted, - marketplace=standard_marketplace_event_type.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(bid) - parsed_objs.append(current_bid) - - # # Handle collection bid place and fill events - # elif table_handle == BLUEMOVE_COLLECTION_BIDS_TABLE_HANDLE: - # collection_bid_metadata = parse_collection_bid(write_table_item) - - # if collection_bid_metadata.seller: - # standard_marketplace_event_type = StandardMarketplaceEventType.BID_FILLED - # token_amount_change = -1 - # is_current_bid_deleted = collection_bid_metadata.amount == 0 - # else: - # standard_marketplace_event_type = StandardMarketplaceEventType.BID_PLACE - # token_amount_change = collection_bid_metadata.amount - # is_current_bid_deleted = False - - # collection_bid = NFTMarketplaceCollectionBid( - # transaction_version=transaction_metadata.transaction_version, - # index=wsc_index, - # creator_address=collection_bid_metadata.creator_address, - # collection=collection_bid_metadata.collection, - # collection_id=collection_bid_metadata.collection_id, - # price=collection_bid_metadata.price, - # token_amount=token_amount_change, - # buyer=collection_bid_metadata.buyer, - # seller=collection_bid_metadata.seller, - # event_type=standard_marketplace_event_type.value, - # marketplace=MarketplaceName.BLUEMOVE.value, - # contract_address=transaction_metadata.contract_address, - # entry_function_id_str=transaction_metadata.entry_function_id_str_short, - # transaction_timestamp=transaction_metadata.transaction_timestamp, - # ) - # current_collection_bid = CurrentNFTMarketplaceCollectionBid( - # creator_address=collection_bid_metadata.creator_address, - # collection=collection_bid_metadata.collection, - # collection_id=collection_bid_metadata.collection_id, - # price=collection_bid_metadata.price, - # token_amount=collection_bid_metadata.amount, - # buyer=collection_bid_metadata.buyer, - # is_deleted=is_current_bid_deleted, - # marketplace=MarketplaceName.BLUEMOVE.value, - # contract_address=transaction_metadata.contract_address, - # entry_function_id_str=transaction_metadata.entry_function_id_str_short, - # last_transaction_version=transaction_metadata.transaction_version, - # last_transaction_timestamp=transaction_metadata.transaction_timestamp, - # ) - - # parsed_objs.append(collection_bid) - # parsed_objs.append(current_collection_bid) - - return parsed_objs - - -def parse_listing( - write_table_item: transaction_pb2.WriteTableItem, -) -> ListingTableMetadata | None: - table_data = json.loads(write_table_item.data.value) - - # Price parsing - price = table_data.get("price", None) - price = int(price) if price else None - - # Seller parsing - seller = table_data.get("seller", None) - - locked_token = table_data.get("locked_token", {}).get("vec", []) - - if not locked_token: - return None - - token = locked_token[0] - - # Collection, token, and creator parsing - token_data_id_struct = token.get("id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) - token_data_id_type = TokenDataIdType(creator, collection, token_name) - - # Amount parsing - token_amount = token.get("amount", None) - - return ListingTableMetadata( - price=price, - seller=seller, - creator_address=token_data_id_type.get_creator(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - amount=token_amount, - ) - - -def parse_bid(write_table_item: transaction_pb2.WriteTableItem) -> BidMetadata | None: - data = json.loads(write_table_item.data.value) - - # Parse seller - seller = data.get("accept_address", None) - if seller == "0x0": - seller = None - - # Parse price, buyer, and seller - offerer_struct = data.get("offerer", {}) - price = offerer_struct.get("amount", None) - buyer = offerer_struct.get("offer_address", None) - - token_vec = data.get("token_id", {}).get("vec", []) - if not token_vec: - return None - - # Collection, token, and creator parsing - token_data_id_struct = token_vec[0].get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) - token_data_id_type = TokenDataIdType(creator, collection, token_name) - - return BidMetadata( - price=price, - amount=1, - buyer=standardize_address(buyer) if buyer else None, - seller=standardize_address(seller) if seller else None, - creator_address=token_data_id_type.get_creator(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - ) - - -def parse_collection_bid( - write_table_item: transaction_pb2.WriteTableItem, -) -> CollectionBidMetadata: - data = json.loads(write_table_item.data.value) - - # Price and amount parsing - price = data.get("amount_per_item", None) - price = int(price) if price else None - amount = data.get("quantity_offer_items", None) - amount = int(amount) if amount else None - - # Collection, token, and creator parsing - collection = data.get("collection_name", None) - creator = data.get("creator_address", None) - collection_data_id_type = CollectionDataIdType(creator, collection) - - # Buyer and seller parsing - buyer = data.get("offerer", None) - can_claim_tokens = data.get("can_claim_tokens", {}).get("data", []) - seller = can_claim_tokens[0].get("value", None) if can_claim_tokens else None - - return CollectionBidMetadata( - price=price, - amount=amount, - buyer=standardize_address(buyer) if buyer else None, - seller=standardize_address(seller) if seller else None, - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - creator_address=collection_data_id_type.get_creator(), - is_cancelled=None, - ) - - -def standardize_marketplace_event_type( - marketplace_event_type: str, -) -> StandardMarketplaceEventType: - match marketplace_event_type: - case "marketplaceV2::BuyEvent": - return StandardMarketplaceEventType.LISTING_FILLED - case "marketplaceV2::ListEvent": - return StandardMarketplaceEventType.LISTING_PLACE - case "marketplaceV2::DelistEvent": - return StandardMarketplaceEventType.LISTING_CANCEL - case "marketplaceV2::ChangePriceEvent": - return StandardMarketplaceEventType.LISTING_CHANGE - case "offer_lib::AcceptOfferCollectionEvent" | "offer_lib::AcceptOfferEvent": - return StandardMarketplaceEventType.BID_FILLED - case "offer_lib::OfferCollectionEvent" | "offer_lib::OfferEvent": - return StandardMarketplaceEventType.BID_PLACE - case "offer_lib::CancelOfferCollectionEvent" | "offer_lib::CancelOfferEvent": - return StandardMarketplaceEventType.BID_CANCEL - case _: - return StandardMarketplaceEventType.UNKNOWN diff --git a/python/processors/nft_orderbooks/parsers/itsrare_parser.py b/python/processors/nft_orderbooks/parsers/itsrare_parser.py deleted file mode 100644 index e89b2d848..000000000 --- a/python/processors/nft_orderbooks/parsers/itsrare_parser.py +++ /dev/null @@ -1,114 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -import json -from typing import List -from processors.nft_orderbooks.nft_marketplace_enums import ( - MarketplaceName, - StandardMarketplaceEventType, -) -from processors.nft_orderbooks.nft_orderbooks_parser_utils import ( - get_marketplace_events, -) -from processors.nft_orderbooks.models.nft_marketplace_activities_model import ( - NFTMarketplaceEvent, -) -from utils.token_utils import CollectionDataIdType, TokenDataIdType, standardize_address - -ITSRARE_MARKETPLACE_EVENT_TYPES = set( - [ - # these are trade-related events - # trade-related events are by nature also orderbook-related events - "Events::BuyEvent", - # these are orderbook-related events - "Events::ListEvent", - "Events::DelistEvent" - # # unrelated to order book; these are filtered out (included here in comments for documentation) - # ,token_coin_swap::TokenListingEvent # redundant with events::ListEvent - # ,token_coin_swap::TokenSwapEvent # redundant with events::BuyEvent - ] -) - - -def parse_marketplace_events( - transaction: transaction_pb2.Transaction, -) -> List[NFTMarketplaceEvent]: - topaz_raw_events = get_marketplace_events(transaction, MarketplaceName.ITSRARE) - nft_activities = [] - - for event in topaz_raw_events: - # Readable transaction event type - display_event_type = event.event_type.replace( - "0x143f6a7a07c76eae1fc9ea030dbd9be3c2d46e538c7ad61fe64529218ff44bc4::", "" - ) - if display_event_type not in ITSRARE_MARKETPLACE_EVENT_TYPES: - continue - - data = json.loads(event.json_data) - - # Collection, token, and creator parsing - token_data_id_struct = data.get("token_id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) - - token_data_id_type = TokenDataIdType(creator, collection, token_name) - token_name_trunc = token_data_id_type.get_name_trunc() - token_data_id = token_data_id_type.to_hash() - - # Price parsing - price = ( - float( - data.get("price") - or data.get("min_price") - or data.get("coin_amount") - or 0 - ) - / 10**8 - ) - - # Amount parsing - amount = int(data.get("amount", 1)) - - # Buyer and seller parsing - buyer = data.get("buyer", None) - seller = data.get("seller", None) or data.get("lister", None) - - activity = NFTMarketplaceEvent( - transaction_version=event.transaction_version, - event_index=event.event_index, - event_type=display_event_type, - standard_event_type=standardize_marketplace_event_type( - display_event_type - ).value, - creator_address=standardize_address(creator), - collection=token_data_id_type.get_collection_trunc(), - token_name=token_name_trunc, - token_data_id=token_data_id, - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=price, - token_amount=amount, - buyer=standardize_address(buyer) if buyer else None, - seller=standardize_address(seller) if seller else None, - json_data=event.json_data, - marketplace=MarketplaceName.ITSRARE.value, - contract_address=event.contract_address, - entry_function_id_str=event.entry_function_name, - transaction_timestamp=event.transaction_timestamp, - ) - - nft_activities.append(activity) - - return nft_activities - - -def standardize_marketplace_event_type( - marketplace_event_type: str, -) -> StandardMarketplaceEventType: - match marketplace_event_type: - case "Events::BuyEvent": - return StandardMarketplaceEventType.LISTING_FILLED - case "Events::ListEvent": - return StandardMarketplaceEventType.LISTING_PLACE - case "Events::DelistEvent": - return StandardMarketplaceEventType.LISTING_CANCEL - case _: - return StandardMarketplaceEventType.UNKNOWN diff --git a/python/processors/nft_orderbooks/parsers/okx_parser.py b/python/processors/nft_orderbooks/parsers/okx_parser.py deleted file mode 100644 index bb26d4553..000000000 --- a/python/processors/nft_orderbooks/parsers/okx_parser.py +++ /dev/null @@ -1,172 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -import json -import re -from typing import Dict, List, Optional, TypedDict -from processors.nft_orderbooks.nft_marketplace_enums import ( - MarketplaceName, - StandardMarketplaceEventType, -) -from processors.nft_orderbooks.models.nft_marketplace_activities_model import ( - NFTMarketplaceEvent, -) -from utils.token_utils import CollectionDataIdType, TokenDataIdType, standardize_address -from utils import event_utils, general_utils, transaction_utils - -OKX_MARKETPLACE_EVENT_TYPES = set( - [ - "okx_listing_utils::ListingEvent", - "okx_bid_utils::OrderExecutedEvent", - "okx_listing_utils::CancelListingEvent", - ] -) - - -def parse_marketplace_events( - transaction: transaction_pb2.Transaction, -) -> List[NFTMarketplaceEvent]: - user_transaction = transaction_utils.get_user_transaction(transaction) - - if user_transaction is None: - return [] - - move_module = transaction_utils.get_move_module(user_transaction) - contract_address = move_module.address - if ( - contract_address - != "0x1e6009ce9d288f3d5031c06ca0b19a334214ead798a0cb38808485bd6d997a43" - ): - return [] - - nft_activities = [] - entry_function_payload = transaction_utils.get_entry_function_payload( - user_transaction - ) - entry_function = entry_function_payload.function - entry_function_name = f"{entry_function.module.name}::{entry_function.name}" - - for event_index, event in enumerate(user_transaction.events): - # Readable transaction event type - display_event_type = event.type_str.replace( - "0x1e6009ce9d288f3d5031c06ca0b19a334214ead798a0cb38808485bd6d997a43::", "" - ).replace("<0x1::aptos_coin::AptosCoin>", "") - if display_event_type not in OKX_MARKETPLACE_EVENT_TYPES: - continue - - data = json.loads(event.data) - - # Get token metadata - token_data_id_type = None - collection_trunc = None - token_name_trunc = None - collection_data_id = None - token_data_id = None - creator = None - - standard_marketplace_event_type = standardize_marketplace_event_type( - display_event_type - ) - - if ( - standard_marketplace_event_type - == StandardMarketplaceEventType.LISTING_FILLED - ): - # Token metadata for listing fill event exist in the deposit events - # in the same transaction - deposit_events = get_token_data_from_deposit_events(user_transaction) - account_address = event_utils.get_account_address(event) - if standardize_address(account_address) in deposit_events: - token_data_id_type = deposit_events[ - standardize_address(account_address) - ] - elif ( - standard_marketplace_event_type - == StandardMarketplaceEventType.LISTING_PLACE - ): - # Token metadata for listing place event exist in the event itself - token_data_id_struct = data.get("token_id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) - token_data_id_type = TokenDataIdType(creator, collection, token) - - if token_data_id_type != None: - collection_trunc = token_data_id_type.get_collection_trunc() - token_name_trunc = token_data_id_type.get_name_trunc() - collection_data_id = token_data_id_type.get_collection_data_id_hash() - token_data_id = token_data_id_type.to_hash() - creator = token_data_id_type.creator - - # Price parsing - executed_price = float(data.get("executed_price", 0)) / 10**8 - list_price = float(data.get("min_price", 0)) / 10**8 - price = executed_price or list_price - - # Amount parsing - amount = int(data.get("amount", 0)) - - # Buyer and seller parsing - buyer = data.get("buyer", None) - seller = data.get("id", {}).get("addr", None) - - activity = NFTMarketplaceEvent( - transaction_version=transaction.version, - event_index=event_index, - event_type=display_event_type, - standard_event_type=standardize_marketplace_event_type( - display_event_type - ).value, - creator_address=standardize_address(creator) if creator else None, - collection=collection_trunc, - token_name=token_name_trunc, - token_data_id=token_data_id, - collection_id=collection_data_id, - price=price, - token_amount=amount, - buyer=standardize_address(buyer) if buyer else None, - seller=standardize_address(seller) if seller else None, - json_data=event.data, - marketplace=MarketplaceName.OKX.value, - contract_address=contract_address, - entry_function_id_str=entry_function_name, - transaction_timestamp=general_utils.convert_pb_timestamp_to_datetime( - transaction.timestamp - ), - ) - - nft_activities.append(activity) - - return nft_activities - - -def get_token_data_from_deposit_events(user_transaction) -> Dict[str, TokenDataIdType]: - # Extract deposit events, which contain token metadata - deposit_events: Dict[str, TokenDataIdType] = {} - for event in user_transaction.events: - if event.type_str != "0x3::token::DepositEvent": - continue - account_address = standardize_address(event_utils.get_account_address(event)) - data = json.loads(event.data) - - # Collection, token, and creator parsing - token_data_id_struct = data.get("id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - creator = token_data_id_struct.get("creator", None) - token_name = token_data_id_struct.get("name") - token_data_id_type = TokenDataIdType(creator, collection, token_name) - - deposit_events[account_address] = token_data_id_type - return deposit_events - - -def standardize_marketplace_event_type( - marketplace_event_type: str, -) -> StandardMarketplaceEventType: - match marketplace_event_type: - case "okx_bid_utils::OrderExecutedEvent": - return StandardMarketplaceEventType.LISTING_FILLED - case "okx_listing_utils::ListingEvent",: - return StandardMarketplaceEventType.LISTING_PLACE - case "okx_listing_utils::CancelListingEvent": - return StandardMarketplaceEventType.LISTING_CANCEL - case _: - return StandardMarketplaceEventType.UNKNOWN diff --git a/python/processors/nft_orderbooks/parsers/ozozoz_parser.py b/python/processors/nft_orderbooks/parsers/ozozoz_parser.py deleted file mode 100644 index 98433909e..000000000 --- a/python/processors/nft_orderbooks/parsers/ozozoz_parser.py +++ /dev/null @@ -1,111 +0,0 @@ -import re - -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -import json -from typing import List -from processors.nft_orderbooks.nft_marketplace_enums import ( - MarketplaceName, - StandardMarketplaceEventType, -) -from processors.nft_orderbooks.nft_orderbooks_parser_utils import ( - get_marketplace_events, -) -from processors.nft_orderbooks.models.nft_marketplace_activities_model import ( - NFTMarketplaceEvent, -) -from utils.token_utils import CollectionDataIdType, TokenDataIdType, standardize_address -from utils import transaction_utils - -OZOZOZ_MARKETPLACE_EVENT_TYPES = set( - [ - "OzozozMarketplace::UpdatePriceEvent", - "OzozozMarketplace::BuyEvent", - "OzozozMarketplace::ListEvent", - "OzozozMarketplace::DelistEvent", - ] -) - - -def parse_marketplace_events( - transaction: transaction_pb2.Transaction, -) -> List[NFTMarketplaceEvent]: - ozozoz_raw_events = get_marketplace_events(transaction, MarketplaceName.OZOZOZ) - nft_activities = [] - - for event in ozozoz_raw_events: - # Readable transaction event type - display_event_type = event.event_type.replace( - "0xded0c1249b522cecb11276d2fad03e6635507438fef042abeea3097846090bcd::", "" - ) - if display_event_type not in OZOZOZ_MARKETPLACE_EVENT_TYPES: - continue - - data = json.loads(event.json_data) - - # Collection, token, and creator parsing - token_data_id_struct = data.get("tokenId", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) or data.get("creator", None) - token_data_id_type = TokenDataIdType(creator, collection, token_name) - - # Price parsing - price = float(data.get("price") or 0) / 10**8 - - # Amount parsing - amount = int(data.get("amount") or 0) - - # Buyer and seller parsing - user = data.get("user", None) - seller_address = data.get("sellerAddress", None) - - standard_event_type = standardize_marketplace_event_type(display_event_type) - if standard_event_type == StandardMarketplaceEventType.LISTING_FILLED: - buyer = user - seller = seller_address - else: - buyer = None - seller = user - - activity = NFTMarketplaceEvent( - transaction_version=event.transaction_version, - event_index=event.event_index, - event_type=display_event_type, - standard_event_type=standardize_marketplace_event_type( - display_event_type - ).value, - creator_address=standardize_address(creator), - collection=token_data_id_type.get_collection_trunc(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=price, - token_amount=amount, - buyer=standardize_address(buyer) if buyer else None, - seller=standardize_address(seller), - json_data=event.json_data, - marketplace=MarketplaceName.OZOZOZ.value, - contract_address=event.contract_address, - entry_function_id_str=event.entry_function_name, - transaction_timestamp=event.transaction_timestamp, - ) - - nft_activities.append(activity) - - return nft_activities - - -def standardize_marketplace_event_type( - marketplace_event_type: str, -) -> StandardMarketplaceEventType: - match marketplace_event_type: - case "OzozozMarketplace::UpdatePriceEvent": - return StandardMarketplaceEventType.LISTING_CHANGE - case "OzozozMarketplace::BuyEvent": - return StandardMarketplaceEventType.LISTING_FILLED - case "OzozozMarketplace::ListEvent": - return StandardMarketplaceEventType.LISTING_PLACE - case "OzozozMarketplace::DelistEvent": - return StandardMarketplaceEventType.LISTING_CANCEL - case _: - return StandardMarketplaceEventType.UNKNOWN diff --git a/python/processors/nft_orderbooks/parsers/souffle_parser.py b/python/processors/nft_orderbooks/parsers/souffle_parser.py deleted file mode 100644 index 55f9a3f66..000000000 --- a/python/processors/nft_orderbooks/parsers/souffle_parser.py +++ /dev/null @@ -1,291 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -import json -from typing import List -from processors.nft_orderbooks.nft_marketplace_constants import ( - SOUFFLE_MARKETPLACE_EVENT_TYPES, - SOUFFLE_LISTINGS_TABLE_HANDLE, -) -from processors.nft_orderbooks.nft_marketplace_enums import ( - MarketplaceName, - StandardMarketplaceEventType, - ListingTableMetadata, -) -from processors.nft_orderbooks.models.nft_marketplace_activities_model import ( - NFTMarketplaceEvent, -) -from processors.nft_orderbooks.models.nft_marketplace_listings_models import ( - NFTMarketplaceListing, - CurrentNFTMarketplaceListing, -) -from processors.nft_orderbooks.nft_orderbooks_parser_utils import ( - parse_transaction_metadata, - lookup_current_listing_in_db, -) -from utils import event_utils, general_utils, transaction_utils -from utils.session import Session -from utils.token_utils import TokenDataIdType, standardize_address - - -def parse_event( - transaction: transaction_pb2.Transaction, - event: transaction_pb2.Event, - event_index: int, -) -> List[NFTMarketplaceEvent]: - parsed_objs = [] - - user_transaction = transaction_utils.get_user_transaction(transaction) - assert user_transaction - - transaction_metadata = parse_transaction_metadata(transaction) - - # Readable transaction event type - display_event_type = event_utils.get_event_type_short(event) - display_event_type = display_event_type.replace("<0x1::aptos_coin::AptosCoin>", "") - - if display_event_type not in SOUFFLE_MARKETPLACE_EVENT_TYPES: - return [] - - data = json.loads(event.data) - - # Collection, token, and creator parsing - token_data_id_struct = data.get("token_id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) or "" - token_name = token_data_id_struct.get("name", None) or "" - creator = token_data_id_struct.get("creator", None) or "" - - token_data_id_type = TokenDataIdType(creator, collection, token_name) - - # Price parsing - price = ( - data.get("price") - or data.get("coin_per_token") - or data.get("coin_amount") - or None - ) - - # Token amount parsing - token_amount = int(data.get("token_amount", 1)) - - standard_event_type = standardize_marketplace_event_type(display_event_type) - - # Buyer and seller parsing - buyer = data.get("buyer", None) - if standard_event_type == StandardMarketplaceEventType.LISTING_CANCEL: - seller = ( - transaction_utils.get_sender(user_transaction) if user_transaction else None - ) - else: - seller = data.get("token_owner", None) - - activity = NFTMarketplaceEvent( - transaction_version=transaction_metadata.transaction_version, - event_index=event_index, - event_type=display_event_type, - standard_event_type=standardize_marketplace_event_type( - display_event_type - ).value, - creator_address=standardize_address(creator), - collection=token_data_id_type.get_collection_trunc(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=price, - token_amount=token_amount, - buyer=standardize_address(buyer) if buyer else None, - seller=standardize_address(seller) if seller else None, - json_data=event.data, - marketplace=MarketplaceName.SOUFFLE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - # Handle listing fill and cancel events - if standard_event_type == StandardMarketplaceEventType.LISTING_FILLED: - listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=token_data_id_type.get_creator(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=price, - token_amount=token_amount * -1, # Negative if listing is filled - seller=seller, - buyer=buyer, - event_type=standard_event_type.value, - marketplace=MarketplaceName.SOUFFLE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_listing = CurrentNFTMarketplaceListing( - creator_address=token_data_id_type.get_creator(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=price, - token_amount=0, # Zero if listing is filled - seller=seller, - is_deleted=True, - marketplace=MarketplaceName.SOUFFLE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(listing) - parsed_objs.append(current_listing) - elif standard_event_type == StandardMarketplaceEventType.LISTING_CANCEL: - # Lookup previous listing price - previous_price = 0 - old_listing_metadata = lookup_current_listing_in_db( - token_data_id_type.to_hash() - ) - if old_listing_metadata: - previous_price = old_listing_metadata.price - - listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=token_data_id_type.get_creator(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=previous_price, - token_amount=token_amount * -1, # Negative if listing is canceled - seller=seller, - event_type=standard_event_type.value, - marketplace=MarketplaceName.SOUFFLE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_listing = CurrentNFTMarketplaceListing( - creator_address=token_data_id_type.get_creator(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection=token_data_id_type.get_collection_trunc(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=previous_price, - token_amount=0, # Zero if listing is canceled - seller=seller, - is_deleted=True, - marketplace=MarketplaceName.SOUFFLE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(listing) - parsed_objs.append(current_listing) - - parsed_objs.append(activity) - - return parsed_objs - - -def parse_write_table_item( - transaction: transaction_pb2.Transaction, - write_table_item: transaction_pb2.WriteTableItem, - wsc_index: int, -) -> List[NFTMarketplaceEvent | NFTMarketplaceListing | CurrentNFTMarketplaceListing]: - parsed_objs = [] - - user_transaction = transaction_utils.get_user_transaction(transaction) - assert user_transaction - - transaction_metadata = parse_transaction_metadata(transaction) - table_handle = write_table_item.handle - - # Handle listing place event - if table_handle == SOUFFLE_LISTINGS_TABLE_HANDLE: - listing_data = parse_place_listing(write_table_item) - listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=wsc_index, - creator_address=listing_data.creator_address, - token_name=listing_data.token_name, - token_data_id=listing_data.token_data_id, - collection=listing_data.collection, - collection_id=listing_data.collection_id, - price=listing_data.price, - token_amount=listing_data.amount, - seller=listing_data.seller, - event_type=StandardMarketplaceEventType.LISTING_PLACE.value, - marketplace=MarketplaceName.SOUFFLE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_listing = CurrentNFTMarketplaceListing( - token_data_id=listing_data.token_data_id, - creator_address=listing_data.creator_address, - token_name=listing_data.token_name, - collection=listing_data.collection, - collection_id=listing_data.collection_id, - price=listing_data.price, - token_amount=listing_data.amount, - seller=listing_data.seller, - is_deleted=False, - marketplace=MarketplaceName.SOUFFLE.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(listing) - parsed_objs.append(current_listing) - - return parsed_objs - - -def parse_place_listing( - write_table_item: transaction_pb2.WriteTableItem, -) -> ListingTableMetadata: - table_key = json.loads(write_table_item.data.key) - table_value = json.loads(write_table_item.data.value) - - # Collection, token, and creator parsing - token_data_id_struct = table_key.get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) - - token_data_id_type = TokenDataIdType(creator, collection, token_name) - - # Price parsing - price = table_value.get("coin_per_token", None) - amount = 1 if price else 0 - - # Seller parsing - seller = table_value.get("token_owner", None) - seller = standardize_address(seller) if seller else None - - return ListingTableMetadata( - creator_address=token_data_id_type.get_creator(), - collection=token_data_id_type.get_collection_trunc(), - token_name=token_data_id_type.get_name_trunc(), - token_data_id=token_data_id_type.to_hash(), - collection_id=token_data_id_type.get_collection_data_id_hash(), - price=price, - amount=amount, - seller=seller, - ) - - -def standardize_marketplace_event_type( - marketplace_event_type: str, -) -> StandardMarketplaceEventType: - match marketplace_event_type: - case "FixedPriceMarket::BuyTokenEvent": - return StandardMarketplaceEventType.LISTING_FILLED - case "FixedPriceMarket::ListTokenEvent": - return StandardMarketplaceEventType.LISTING_PLACE - case "FixedPriceMarket::CancelListTokenEvent": - return StandardMarketplaceEventType.LISTING_CANCEL - case _: - return StandardMarketplaceEventType.UNKNOWN diff --git a/python/processors/nft_orderbooks/parsers/topaz_parser.py b/python/processors/nft_orderbooks/parsers/topaz_parser.py deleted file mode 100644 index b6631ee1d..000000000 --- a/python/processors/nft_orderbooks/parsers/topaz_parser.py +++ /dev/null @@ -1,536 +0,0 @@ -import json - -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from typing import List, Optional, Tuple -from processors.nft_orderbooks.nft_marketplace_constants import ( - TOPAZ_BIDS_TABLE_HANDLE, - TOPAZ_COLLECTION_BIDS_TABLE_HANDLE, - TOPAZ_LISTINGS_TABLE_HANDLE, - TOPAZ_MARKETPLACE_EVENT_TYPES, -) -from processors.nft_orderbooks.nft_marketplace_enums import ( - BidMetadata, - MarketplaceName, - StandardMarketplaceEventType, - ListingTableMetadata, - MarketplaceEventMetadata, - CollectionBidMetadata, -) -from processors.nft_orderbooks.nft_orderbooks_parser_utils import ( - parse_transaction_metadata, -) -from processors.nft_orderbooks.models.nft_marketplace_activities_model import ( - NFTMarketplaceEvent, -) -from processors.nft_orderbooks.models.nft_marketplace_bid_models import ( - CurrentNFTMarketplaceBid, - NFTMarketplaceBid, - CurrentNFTMarketplaceCollectionBid, - NFTMarketplaceCollectionBid, -) -from processors.nft_orderbooks.models.nft_marketplace_listings_models import ( - CurrentNFTMarketplaceListing, - NFTMarketplaceListing, -) -from utils.token_utils import CollectionDataIdType, TokenDataIdType, standardize_address -from utils import event_utils, general_utils, transaction_utils, write_set_change_utils - - -def standardize_marketplace_event_type( - marketplace_event_type: str, -) -> StandardMarketplaceEventType: - match marketplace_event_type: - case "events::BuyEvent": - return StandardMarketplaceEventType.LISTING_FILLED - case "events::ListEvent": - return StandardMarketplaceEventType.LISTING_PLACE - case "events::DelistEvent": - return StandardMarketplaceEventType.LISTING_CANCEL - case "events::SellEvent" | "events::FillCollectionBidEvent": - return StandardMarketplaceEventType.BID_FILLED - case "events::BidEvent" | "events::CollectionBidEvent": - return StandardMarketplaceEventType.BID_PLACE - case "events::CancelBidEvent" | "events::CancelCollectionBidEvent": - return StandardMarketplaceEventType.BID_CANCEL - case _: - return StandardMarketplaceEventType.UNKNOWN - - -def parse_event( - transaction: transaction_pb2.Transaction, - event: transaction_pb2.Event, - event_index: int, -) -> List[ - NFTMarketplaceEvent - | NFTMarketplaceListing - | CurrentNFTMarketplaceListing - | NFTMarketplaceBid - | CurrentNFTMarketplaceBid - | NFTMarketplaceCollectionBid - | CurrentNFTMarketplaceCollectionBid -]: - parsed_objs = [] - - user_transaction = transaction_utils.get_user_transaction(transaction) - assert user_transaction - - transaction_metadata = parse_transaction_metadata(transaction) - - # Filter out events we don't care about - display_event_type = event_utils.get_event_type_short(event) - - if display_event_type not in TOPAZ_MARKETPLACE_EVENT_TYPES: - return [] - - event_metadata = parse_marketplace_event_metadata(event) - standard_event_type = standardize_marketplace_event_type(display_event_type) - - activity = NFTMarketplaceEvent( - transaction_version=transaction_metadata.transaction_version, - event_index=event_index, - event_type=display_event_type, - standard_event_type=standard_event_type.value, - creator_address=event_metadata.creator_address, - collection=event_metadata.collection, - token_name=event_metadata.token_name, - token_data_id=event_metadata.token_data_id, - collection_id=event_metadata.collection_id, - price=event_metadata.price, - token_amount=event_metadata.amount, - buyer=event_metadata.buyer, - seller=event_metadata.seller, - json_data=event.data, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - parsed_objs.append(activity) - - # Handle listing cancel and listing fill events - if display_event_type in set(["events::DelistEvent", "events::BuyEvent"]): - listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=event_metadata.creator_address, - token_name=event_metadata.token_name, - token_data_id=event_metadata.token_data_id, - collection=event_metadata.collection, - collection_id=event_metadata.collection_id, - price=event_metadata.price, - token_amount=event_metadata.amount * -1 if event_metadata.amount else None, - buyer=event_metadata.buyer, - seller=event_metadata.seller, - event_type=standard_event_type.value, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_listing = CurrentNFTMarketplaceListing( - token_data_id=event_metadata.token_data_id, - creator_address=event_metadata.creator_address, - token_name=event_metadata.token_name, - collection=event_metadata.collection, - collection_id=event_metadata.collection_id, - price=event_metadata.price, - token_amount=0, - seller=event_metadata.seller, - is_deleted=True, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - - parsed_objs.append(listing) - parsed_objs.append(current_listing) - # Handle cancel bid event - elif display_event_type == "events::CancelBidEvent": - bid = NFTMarketplaceBid( - transaction_version=transaction_metadata.transaction_version, - index=event_index * -1, - creator_address=event_metadata.creator_address, - token_name=event_metadata.token_name, - token_data_id=event_metadata.token_data_id, - collection=event_metadata.collection, - collection_id=event_metadata.collection_id, - price=event_metadata.price, - token_amount=event_metadata.amount * -1 if event_metadata.amount else None, - seller=event_metadata.seller, - buyer=event_metadata.buyer, - event_type=standard_event_type.value, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_bid = CurrentNFTMarketplaceBid( - token_data_id=event_metadata.token_data_id, - creator_address=event_metadata.creator_address, - token_name=event_metadata.token_name, - collection=event_metadata.collection, - collection_id=event_metadata.collection_id, - price=event_metadata.price, - token_amount=0, - buyer=event_metadata.buyer, - is_deleted=True, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(bid) - parsed_objs.append(current_bid) - - return parsed_objs - - -def parse_write_table_item( - transaction: transaction_pb2.Transaction, - write_table_item: transaction_pb2.WriteTableItem, - wsc_index: int, -) -> List[ - NFTMarketplaceEvent - | NFTMarketplaceListing - | CurrentNFTMarketplaceListing - | NFTMarketplaceBid - | CurrentNFTMarketplaceBid - | NFTMarketplaceCollectionBid - | CurrentNFTMarketplaceCollectionBid -]: - parsed_objs = [] - - user_transaction = transaction_utils.get_user_transaction(transaction) - assert user_transaction - - transaction_metadata = parse_transaction_metadata(transaction) - - table_handle = write_table_item.handle - # Handle listing place events - if table_handle == TOPAZ_LISTINGS_TABLE_HANDLE: - listing_data = parse_place_listing(write_table_item) - listing = NFTMarketplaceListing( - transaction_version=transaction_metadata.transaction_version, - index=wsc_index, - creator_address=listing_data.creator_address, - token_name=listing_data.token_name, - token_data_id=listing_data.token_data_id, - collection=listing_data.collection, - collection_id=listing_data.collection_id, - price=listing_data.price, - token_amount=listing_data.amount, - seller=listing_data.seller, - event_type=StandardMarketplaceEventType.LISTING_PLACE.value, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_listing = CurrentNFTMarketplaceListing( - token_data_id=listing_data.token_data_id, - creator_address=listing_data.creator_address, - token_name=listing_data.token_name, - collection=listing_data.collection, - collection_id=listing_data.collection_id, - price=listing_data.price, - token_amount=listing_data.amount, - seller=listing_data.seller, - is_deleted=False, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(listing) - parsed_objs.append(current_listing) - - # Handle bid place and bid filled events - elif table_handle == TOPAZ_BIDS_TABLE_HANDLE: - bid_data = parse_bid(write_table_item) - - bid_amount = 0 - is_deleted = False - if bid_data.amount != None: - if bid_data.amount > 0: - bid_amount = bid_data.amount - elif bid_data.amount == 0: - bid_amount = -1 # Bid is deleted when filled - is_deleted = True - - event_type = ( - StandardMarketplaceEventType.BID_FILLED - if is_deleted - else StandardMarketplaceEventType.BID_PLACE - ) - - seller = None - if event_type == StandardMarketplaceEventType.BID_FILLED: - seller = transaction_utils.get_sender(user_transaction) - - bid = NFTMarketplaceBid( - transaction_version=transaction_metadata.transaction_version, - index=wsc_index, - creator_address=bid_data.creator_address, - token_name=bid_data.token_name, - token_data_id=bid_data.token_data_id, - collection=bid_data.collection, - collection_id=bid_data.collection_id, - price=bid_data.price, - token_amount=bid_amount, - buyer=bid_data.buyer, - seller=seller, - event_type=event_type.value, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_bid = CurrentNFTMarketplaceBid( - token_data_id=bid_data.token_data_id, - creator_address=bid_data.creator_address, - token_name=bid_data.token_name, - collection=bid_data.collection, - collection_id=bid_data.collection_id, - price=bid_data.price, - token_amount=bid_data.amount, - buyer=bid_data.buyer, - is_deleted=is_deleted, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(bid) - parsed_objs.append(current_bid) - - # Handle collection bid place and cancel and fill - elif table_handle == TOPAZ_COLLECTION_BIDS_TABLE_HANDLE: - collection_bid_data = parse_collection_bid(write_table_item) - - # Count the number of tokens filled - num_filled = 0 - for event in user_transaction.events: - if "events::FillCollectionBidEvent" in event.type_str: - event_metadata = parse_marketplace_event_metadata(event) - num_filled += event_metadata.amount or 0 - - amount = collection_bid_data.amount - current_amount = collection_bid_data.amount - seller = None - is_deleted = False - if collection_bid_data.is_cancelled: - event_type = StandardMarketplaceEventType.BID_CANCEL - amount = -1 * amount if amount else None - current_amount = 0 - is_deleted = True - elif num_filled > 0: - event_type = StandardMarketplaceEventType.BID_FILLED - amount = -1 * num_filled - seller = transaction_utils.get_sender(user_transaction) - else: - event_type = StandardMarketplaceEventType.BID_PLACE - - collection_bid = NFTMarketplaceCollectionBid( - transaction_version=transaction_metadata.transaction_version, - index=wsc_index, - creator_address=collection_bid_data.creator_address, - collection=collection_bid_data.collection, - collection_id=collection_bid_data.collection_id, - price=collection_bid_data.price, - token_amount=amount, - buyer=collection_bid_data.buyer, - seller=seller, - event_type=event_type.value, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - current_collection_bid = CurrentNFTMarketplaceCollectionBid( - creator_address=collection_bid_data.creator_address, - collection=collection_bid_data.collection, - collection_id=collection_bid_data.collection_id, - price=collection_bid_data.price, - token_amount=current_amount, - buyer=collection_bid_data.buyer, - is_deleted=is_deleted, - marketplace=MarketplaceName.TOPAZ.value, - contract_address=transaction_metadata.contract_address, - entry_function_id_str=transaction_metadata.entry_function_id_str_short, - last_transaction_version=transaction_metadata.transaction_version, - last_transaction_timestamp=transaction_metadata.transaction_timestamp, - ) - parsed_objs.append(collection_bid) - parsed_objs.append(current_collection_bid) - - return parsed_objs - - -def parse_place_listing( - write_table_item: transaction_pb2.WriteTableItem, -) -> ListingTableMetadata: - table_data = json.loads(write_table_item.data.value) - - # Collection, token, and creator parsing - token_data_id_struct = table_data.get("token_id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) - - token_name_trunc = None - token_data_id = None - collection_data_id_type = CollectionDataIdType(creator, collection) - if token_name != None: - token_data_id_type = TokenDataIdType(creator, collection, token_name) - token_name_trunc = token_data_id_type.get_name_trunc() - token_data_id = token_data_id_type.to_hash() - - # Price parsing - price = table_data.get("price", None) - price = int(price) if price else None - - # Amount parsing - amount = table_data.get("amount", None) - amount = int(amount) if amount else None - - # Seller parsing - seller = table_data.get("seller", None) - seller = standardize_address(seller) if seller else None - - return ListingTableMetadata( - creator_address=standardize_address(creator), - token_name=token_name_trunc, - token_data_id=token_data_id, - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=price, - amount=amount, - seller=seller, - ) - - -def parse_bid(write_table_item: transaction_pb2.WriteTableItem) -> BidMetadata: - data = json.loads(write_table_item.data.value) - - # Collection, token, and creator parsing - token_data_id_struct = data.get("token_id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) - - collection_data_id_type = CollectionDataIdType(creator, collection) - token_data_id_type = TokenDataIdType(creator, collection, token_name) - token_name_trunc = token_data_id_type.get_name_trunc() - token_data_id = token_data_id_type.to_hash() - - # Price parsing - price = data.get("price") or data.get("min_price") or data.get("coin_amount") - price = int(price) if price else None - - # Amount parsing - amount = data.get("amount") or data.get("token_amount") - amount = int(amount) if amount else None - - # Buyer and seller parsing - buyer = data.get("buyer", None) or data.get("token_buyer", None) - - return BidMetadata( - creator_address=standardize_address(creator), - collection=collection_data_id_type.get_name_trunc(), - token_name=token_name_trunc, - token_data_id=token_data_id, - collection_id=collection_data_id_type.to_hash(), - price=price, - amount=amount, - buyer=standardize_address(buyer) if buyer != None else None, - seller=None, # This is parsed from the transaction - ) - - -def parse_collection_bid( - write_table_item: transaction_pb2.WriteTableItem, -) -> CollectionBidMetadata: - data = json.loads(write_table_item.data.value) - - # Collection creator parsing - collection = data.get("collection_name", None) - creator = data.get("creator", None) - - collection_data_id_type = CollectionDataIdType(creator, collection) - - # Price parsing - price = data.get("price") - price = int(price) if price else None - - # Amount parsing - amount = data.get("amount") - amount = int(amount) if amount else None - - # Buyer parsing - buyer = data.get("buyer", None) - - cancelled = data.get("cancelled", None) - cancelled = bool(cancelled) if cancelled != None else None - - return CollectionBidMetadata( - creator_address=standardize_address(creator), - collection=collection_data_id_type.get_name_trunc(), - collection_id=collection_data_id_type.to_hash(), - price=price, - amount=amount, - buyer=standardize_address(buyer) if buyer != None else None, - seller=None, # This is parsed from the transaction - is_cancelled=cancelled, - ) - - -def parse_marketplace_event_metadata( - event: transaction_pb2.Event, -) -> MarketplaceEventMetadata: - data = json.loads(event.data) - - # Collection, token, and creator parsing - token_data_id_struct = data.get("token_id", {}).get("token_data_id", {}) - collection = token_data_id_struct.get("collection", None) or data.get( - "collection_name", None - ) - token_name = token_data_id_struct.get("name", None) - creator = token_data_id_struct.get("creator", None) or data.get("creator", None) - - token_name_trunc = None - token_data_id = None - collection_data_id_type = CollectionDataIdType(creator, collection) - if token_name != None: - token_data_id_type = TokenDataIdType(creator, collection, token_name) - token_name_trunc = token_data_id_type.get_name_trunc() - token_data_id = token_data_id_type.to_hash() - - # Price parsing - price = int( - data.get("price") or data.get("min_price") or data.get("coin_amount") or 0 - ) - - # Amount parsing - amount = int(data.get("amount") or data.get("token_amount") or 0) - - # Buyer and seller parsing - buyer = data.get("buyer", None) or data.get("token_buyer", None) - seller = data.get("seller", None) - - return MarketplaceEventMetadata( - creator_address=standardize_address(creator), - collection=collection_data_id_type.get_name_trunc(), - token_name=token_name_trunc, - token_data_id=token_data_id, - collection_id=collection_data_id_type.to_hash(), - price=price, - amount=amount, - buyer=standardize_address(buyer) if buyer != None else None, - seller=standardize_address(seller) if seller != None else None, - ) diff --git a/python/pyproject.toml b/python/pyproject.toml deleted file mode 100644 index 612e69e83..000000000 --- a/python/pyproject.toml +++ /dev/null @@ -1,44 +0,0 @@ -[tool.poetry] -name = "python-indexer-grpc-example" -version = "0.1.0" -description = "" -authors = ["Your Name "] -readme = "README.md" - -[tool.poe.tasks] -lint = ["pyright", "format-check"] -pyright = "pyright" -format-check = "black --diff -v --check --exclude (aptos|.venv) ." -format = "black --exclude (aptos|.venv) ." - -[tool.poetry.dependencies] -python = "^3.11" -grpcio = "^1.53.0" -psycopg2 = "^2.9.6" -PyYAML = "^6.0" -SQLAlchemy = "^2.0.9" -grpcio-tools = "^1.53.0" -protobuf = "^4.24.2" -pydantic = "^1.10.7" -postgres = "^4.0" -google-cloud-bigquery-storage = "^2.19.1" -google-cloud-bigquery = "^3.10.0" -prometheus-client = "^0.17.1" -twisted = "^22.10.0" -grpclib = "^0.4.6" -alembic = "^1.11.1" -aptos-protos = { git = "https://github.com/aptos-labs/aptos-core.git", rev = "aee306923da1fae533a91b4015e0a58443742d45", subdirectory = "protos/python" } -python-json-logger = "^2.0.7" - -[tool.poetry.group.dev.dependencies] -grpcio-tools = "^1.53.0" -black = "^23.3.0" -pyright = "^1.1.305" -poethepoet = "^0.19.0" - -[build-system] -requires = ["poetry-core>=1.4.2"] -build-backend = "poetry.core.masonry.api" - -[tool.pyright] -exclude = ["aptos", "**/proto_autogen", "aptos-indexer-protos", "**/.venv"] diff --git a/python/scripts/__init__.py b/python/scripts/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/python/scripts/create_tables.py b/python/scripts/create_tables.py deleted file mode 100644 index 7331cfb3c..000000000 --- a/python/scripts/create_tables.py +++ /dev/null @@ -1,17 +0,0 @@ -import argparse - -from utils.config import Config -from utils.models.general_models import Base -from processors.example_event_processor import models as example_models -from sqlalchemy import create_engine - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("-c", "--config", help="Path to config file", required=True) - args = parser.parse_args() - - config = Config.from_yaml_file(args.config) - - engine = create_engine(config.server_config.postgres_connection_string) - Base.metadata.create_all(engine) - example_models.Base.metadata.create_all(engine) diff --git a/python/utils/__init__.py b/python/utils/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/python/utils/config.py b/python/utils/config.py deleted file mode 100644 index ed552b5a8..000000000 --- a/python/utils/config.py +++ /dev/null @@ -1,86 +0,0 @@ -import yaml -from utils.models.general_models import NextVersionToProcess -from pydantic import BaseModel, BaseSettings -from pydantic.env_settings import SettingsSourceCallable -from utils.session import Session -from typing import Any, Dict, List, Optional -import logging - - -class ProcessorConfig(BaseModel): - type: str - - -class NFTMarketplaceV2Config(ProcessorConfig): - marketplace_contract_address: str - - -class ServerConfig(BaseModel): - processor_config: NFTMarketplaceV2Config | ProcessorConfig - indexer_grpc_data_service_address: str - auth_token: str - postgres_connection_string: str - starting_version: Optional[int] = None - ending_version: Optional[int] = None - # Used for k8s liveness and readiness probes - # HTTP2 ping interval in seconds to detect if the connection is still alive - indexer_grpc_http2_ping_interval_in_secs: int = 30 - # HTTP2 ping timeout in seconds to detect if the connection is still alive - indexer_grpc_http2_ping_timeout_in_secs: int = 10 - - -class Config(BaseSettings): - health_check_port: int - server_config: ServerConfig - - class Config: - # change order of priority of settings sources such that environment variables take precedence over config file settings - # inspired by https://docs.pydantic.dev/usage/settings/#changing-priority - @classmethod - def customise_sources( - cls, - init_settings: SettingsSourceCallable, - env_settings: SettingsSourceCallable, - file_secret_settings: SettingsSourceCallable, - ) -> tuple[SettingsSourceCallable, ...]: - return env_settings, init_settings, file_secret_settings - - @classmethod - def from_yaml_file(cls, path: str): - with open(path, "r") as file: - config = yaml.safe_load(file) - - return cls(**config) - - def get_starting_version(self, processor_name: str) -> int: - next_version_to_process = None - - if self.server_config.postgres_connection_string is not None: - try: - with Session() as session, session.begin(): - next_version_to_process_from_db = session.get( - NextVersionToProcess, processor_name - ) - if next_version_to_process_from_db != None: - next_version_to_process = ( - next_version_to_process_from_db.next_version - ) - except: - logging.warn( - "[Config] Database error when getting NextVersionToProcess. Skipping..." - ) - - # By default, if nothing is set, start from 0 - starting_version = 0 - if self.server_config.starting_version != None: - # Start from config's starting_version - logging.info("[Config] Starting from config starting_version") - starting_version = self.server_config.starting_version - elif next_version_to_process != None: - # Start from next version to process in db - logging.info("[Config] Starting from version from db") - starting_version = next_version_to_process - else: - logging.info("Starting from version 0") - - return starting_version diff --git a/python/utils/event_utils.py b/python/utils/event_utils.py deleted file mode 100644 index a291d6f5d..000000000 --- a/python/utils/event_utils.py +++ /dev/null @@ -1,15 +0,0 @@ -from aptos_protos.aptos.transaction.v1.transaction_pb2 import Event - - -def get_account_address(event: Event) -> str: - return event.key.account_address - - -def get_event_type_address(event: Event) -> str: - type_strings = event.type_str.split("::") - return type_strings[0] - - -def get_event_type_short(event: Event) -> str: - type_strings = event.type_str.split("::") - return "::".join(type_strings[1:]) diff --git a/python/utils/general_utils.py b/python/utils/general_utils.py deleted file mode 100644 index fda3efb3d..000000000 --- a/python/utils/general_utils.py +++ /dev/null @@ -1,37 +0,0 @@ -import datetime -import hashlib - -from aptos_protos.aptos.util.timestamp import timestamp_pb2 - - -def hash(s: str) -> str: - return hashlib.sha256(s.encode()).hexdigest() - - -def truncate_str(s: str, max_len: int) -> str: - if len(s) > max_len: - return s[:max_len] - else: - return s - - -def standardize_address(address: str) -> str: - address = address.removeprefix("0x") - return "0x" + address.zfill(64) - - -def parse_pb_timestamp(timestamp: timestamp_pb2.Timestamp): - datetime_obj = datetime.datetime.fromtimestamp( - timestamp.seconds + timestamp.nanos * 1e-9 - ) - return datetime_obj.strftime("%Y-%m-%d %H:%M:%S.%f") - - -def convert_pb_timestamp_to_datetime( - timestamp: timestamp_pb2.Timestamp, -) -> datetime.datetime: - return datetime.datetime.fromtimestamp(timestamp.seconds + timestamp.nanos * 1e-9) - - -def convert_timestamp_to_int64(timestamp: timestamp_pb2.Timestamp) -> int: - return timestamp.seconds * 1000000 + int(timestamp.nanos / 1000) diff --git a/python/utils/logging.py b/python/utils/logging.py deleted file mode 100644 index 874d24d8d..000000000 --- a/python/utils/logging.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -This module contains the custom logger and formatter for the application. - -To use the custom logger, import the module and use the logger as follows: - - from utils.logging import CustomLogger - logger = CustomLogger(__name__) - logger.info("This is an info message", extra={"extra_field": "extra_value"}) -The resulting log message will be in JSON format: - { - "timestamp": "2021-03-15T14:29:31.000Z", - "level": "INFO", - "fields": { - "message": "This is an info message", - "extra_field": "extra_value" - }, - "module": "__main__", - "func_name": "", - "path_name": "/Users/.../python/utils/logging.py", - "line_no": 41 - } -""" - -import logging -import json - - -class CustomLogger(logging.Logger): - def makeRecord( - self, - name, - level, - fn, - lno, - msg, - args, - exc_info, - func=None, - extra=None, - sinfo=None, - ): - if extra: - extra = {"fields": extra} - record = super(CustomLogger, self).makeRecord( - name, - level, - fn, - lno, - msg, - args, - exc_info, - func=func, - extra=extra, - sinfo=sinfo, - ) - return record - - -# Create a custom JSON log formatter -class JsonFormatter(logging.Formatter): - def format(self, record): - fields = {"message": record.getMessage()} - extra_fieds = record.__dict__.get("fields", {}) - fields.update(extra_fieds) - log_data = { - "timestamp": self.formatTime(record), - "level": record.levelname, - "fields": fields, - "module": record.module, - "func_name": record.funcName, - "path_name": record.pathname, - "line_no": record.lineno, - } - return json.dumps(log_data) diff --git a/python/utils/metrics.py b/python/utils/metrics.py deleted file mode 100644 index 858320e3c..000000000 --- a/python/utils/metrics.py +++ /dev/null @@ -1,13 +0,0 @@ -from prometheus_client import Counter, Gauge - -PROCESSED_TRANSACTIONS_COUNTER = Counter( - "indexer_processor_processed_transactions", - "Number of transactions processed", - ["processor_name"], -) - -LATEST_PROCESSED_VERSION = Gauge( - "indexer_processor_latest_version", - "Latest processed version", - ["processor_name"], -) diff --git a/python/utils/models/annotated_types.py b/python/utils/models/annotated_types.py deleted file mode 100644 index fbfbfd480..000000000 --- a/python/utils/models/annotated_types.py +++ /dev/null @@ -1,43 +0,0 @@ -from sqlalchemy import BigInteger, Boolean, DateTime, func, Numeric, String -from sqlalchemy.dialects.postgresql import JSONB -from sqlalchemy.orm import mapped_column, Mapped -from datetime import datetime -from typing_extensions import Annotated - -# To make pylint happy - -# Primary key types -BigIntegerPrimaryKeyType = Mapped[ - Annotated[int, mapped_column(BigInteger, primary_key=True)] -] -NumericPrimaryKeyType = Mapped[ - Annotated[float, mapped_column(Numeric, primary_key=True)] -] -StringPrimaryKeyType = Mapped[Annotated[str, mapped_column(String, primary_key=True)]] - -# Normal types -BigIntegerType = Mapped[Annotated[int, mapped_column(BigInteger)]] -BooleanType = Mapped[Annotated[bool, mapped_column(Boolean)]] -JsonType = Mapped[Annotated[str, mapped_column(JSONB)]] -NumericType = Mapped[Annotated[float, mapped_column(Numeric)]] -StringType = Mapped[Annotated[str, mapped_column(String)]] - -# Nullable types -NullableNumericType = Mapped[Annotated[float, mapped_column(Numeric, nullable=True)]] -NullableStringType = Mapped[Annotated[str, mapped_column(String, nullable=True)]] - -# Timestamp types -TimestampType = Mapped[Annotated[datetime, mapped_column(DateTime(timezone=True))]] -InsertedAtType = Mapped[ - Annotated[datetime, mapped_column(DateTime(timezone=True), default=func.now())] -] -UpdatedAtType = Mapped[ - Annotated[ - datetime, - mapped_column( - DateTime(timezone=True), - default=func.now(), - onupdate=func.now(), - ), - ] -] diff --git a/python/utils/models/general_models.py b/python/utils/models/general_models.py deleted file mode 100644 index 656f62558..000000000 --- a/python/utils/models/general_models.py +++ /dev/null @@ -1,23 +0,0 @@ -from sqlalchemy import MetaData -from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped -from datetime import datetime -from typing_extensions import Annotated -from utils.models.annotated_types import ( - StringPrimaryKeyType, - BigIntegerType, - UpdatedAtType, - BooleanType, -) - - -class Base(DeclarativeBase): - pass - - -class NextVersionToProcess(Base): - __tablename__ = "next_versions_to_process" - __table_args__ = {"schema": "per_schema"} - - indexer_name: StringPrimaryKeyType - next_version: BigIntegerType - updated_at: UpdatedAtType diff --git a/python/utils/models/schema_names.py b/python/utils/models/schema_names.py deleted file mode 100644 index 59cdabf2f..000000000 --- a/python/utils/models/schema_names.py +++ /dev/null @@ -1,4 +0,0 @@ -EXAMPLE = "example" -NFT_MARKETPLACE_SCHEMA_NAME = "nft_marketplace" -NFT_MARKETPLACE_V2_SCHEMA_NAME = "nft_marketplace_v2" -COIN_FLIP_SCHEMA_NAME = "coin_flip" diff --git a/python/utils/object_utils.py b/python/utils/object_utils.py deleted file mode 100644 index 69beb57d9..000000000 --- a/python/utils/object_utils.py +++ /dev/null @@ -1,20 +0,0 @@ -from utils.general_utils import standardize_address -from typing import Optional -from typing_extensions import TypedDict - - -class ObjectCore(TypedDict): - allow_ungated_transfer: bool - guid_creation_num: str - owner: str - - -def get_object_core(move_resource_type: str, data: dict) -> Optional[ObjectCore]: - if move_resource_type != "0x1::object::ObjectCore": - return None - - return { - "allow_ungated_transfer": data["allow_ungated_transfer"], - "guid_creation_num": data["guid_creation_num"], - "owner": standardize_address(data["owner"]), - } diff --git a/python/utils/processor_name.py b/python/utils/processor_name.py deleted file mode 100644 index c4b71aa83..000000000 --- a/python/utils/processor_name.py +++ /dev/null @@ -1,9 +0,0 @@ -from enum import Enum - - -class ProcessorName(Enum): - EXAMPLE_EVENT_PROCESSOR = "python_example_event_processor" - EXAMPLE_AMBASSADOR_TOKEN_PROCESSOR = "example_ambassador_token_processor" - NFT_MARKETPLACE_V1_PROCESSOR = "nft_marketplace_v1_processor" - NFT_MARKETPLACE_V2_PROCESSOR = "nft_marketplace_v2_processor" - COIN_FLIP = "coin_flip" diff --git a/python/utils/session.py b/python/utils/session.py deleted file mode 100644 index 89b84ae59..000000000 --- a/python/utils/session.py +++ /dev/null @@ -1,3 +0,0 @@ -from sqlalchemy.orm import scoped_session, sessionmaker - -Session = scoped_session(sessionmaker()) diff --git a/python/utils/token_utils.py b/python/utils/token_utils.py deleted file mode 100644 index 7d1c7cf69..000000000 --- a/python/utils/token_utils.py +++ /dev/null @@ -1,62 +0,0 @@ -from dataclasses import dataclass -from enum import Enum -from utils.general_utils import hash, standardize_address, truncate_str - -MAX_NAME_LENGTH = 128 - - -class TokenStandard(Enum): - V1 = "v1" - V2 = "v2" - - -class TokenDataIdType: - def __init__(self, creator: str, collection: str, name: str): - self.creator = creator - self.collection = collection - self.name = name - - def to_hash(self): - return standardize_address( - hash(f"{standardize_address(self.creator)}::{self.collection}::{self.name}") - ) - - def get_collection_trunc(self): - return truncate_str(self.collection, MAX_NAME_LENGTH) - - def get_name_trunc(self): - return truncate_str(self.name, MAX_NAME_LENGTH) - - def get_collection_data_id_hash(self): - return CollectionDataIdType(self.creator, self.collection).to_hash() - - def get_creator(self): - return standardize_address(self.creator) - - -class CollectionDataIdType: - def __init__(self, creator: str, name: str): - self.creator = creator - self.name = name - - def to_hash(self) -> str: - return standardize_address( - hash(f"{standardize_address(self.creator)}::{self.name}") - ) - - def get_name_trunc(self) -> str: - return truncate_str(self.name, MAX_NAME_LENGTH) - - def get_creator(self): - return standardize_address(self.creator) - - -@dataclass -class TokenV2AggregatedData: - token_data_id: str - collection_id: str - token_name: str - token_standard: TokenStandard - - -TokenV2AggregatedDataMapping = dict[str, TokenV2AggregatedData] diff --git a/python/utils/transaction_utils.py b/python/utils/transaction_utils.py deleted file mode 100644 index e759dfdbe..000000000 --- a/python/utils/transaction_utils.py +++ /dev/null @@ -1,77 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from typing import List, Optional - -# Utility functions for transaction_pb2 - - -def get_user_transaction( - transaction: transaction_pb2.Transaction, -) -> Optional[transaction_pb2.UserTransaction]: - if transaction.type != transaction_pb2.Transaction.TRANSACTION_TYPE_USER: - return None - return transaction.user - - -def get_user_transaction_request( - user_transaction: transaction_pb2.UserTransaction, -) -> transaction_pb2.UserTransactionRequest: - return user_transaction.request - - -def get_transaction_payload( - user_transaction: transaction_pb2.UserTransaction, -) -> transaction_pb2.TransactionPayload: - user_transaction_request = get_user_transaction_request(user_transaction) - return user_transaction_request.payload - - -def get_sender( - user_transaction: transaction_pb2.UserTransaction, -) -> str: - user_transaction_request = get_user_transaction_request(user_transaction) - return user_transaction_request.sender - - -def get_entry_function_payload( - user_transaction: transaction_pb2.UserTransaction, -) -> transaction_pb2.EntryFunctionPayload: - transaction_payload = get_transaction_payload(user_transaction) - return transaction_payload.entry_function_payload - - -def get_entry_function_id_str_short( - user_transaction: transaction_pb2.UserTransaction, -) -> str: - entry_function_payload = get_entry_function_payload(user_transaction) - entry_function = entry_function_payload.function - module = entry_function.module - entry_function_name = f"{module.name}::{entry_function.name}" - return entry_function_name - - -def get_move_module( - user_transaction: transaction_pb2.UserTransaction, -) -> transaction_pb2.MoveModuleId: - entry_function_payload = get_entry_function_payload(user_transaction) - return entry_function_payload.function.module - - -def get_contract_address( - user_transaction: transaction_pb2.UserTransaction, -) -> str: - move_module = get_move_module(user_transaction) - return move_module.address - - -def get_write_set_changes( - transaction: transaction_pb2.Transaction, -) -> List[transaction_pb2.WriteSetChange]: - transaction_info = transaction.info - return list(transaction_info.changes) - - -def get_move_type_str( - move_type: transaction_pb2.MoveType, -) -> str: - struct = move_type.struct - return f"{struct.address}::{struct.module}::{struct.name}" diff --git a/python/utils/transactions_processor.py b/python/utils/transactions_processor.py deleted file mode 100644 index 805dda4aa..000000000 --- a/python/utils/transactions_processor.py +++ /dev/null @@ -1,63 +0,0 @@ -import argparse -import grpc -import json - -from dataclasses import dataclass -from utils.models.general_models import NextVersionToProcess -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from utils.config import Config -from utils.models.general_models import Base -from utils.session import Session -from abc import ABC, abstractmethod -from sqlalchemy.dialects.postgresql import insert - - -@dataclass -class ProcessingResult: - start_version: int - end_version: int - processing_duration_in_secs: float - db_insertion_duration_in_secs: float - - -class TransactionsProcessor(ABC): - config: Config - num_concurrent_processing_tasks: int - - # Name of the processor for status logging - # This will get stored in the database for each (`TransactionProcessor`, transaction_version) pair - @abstractmethod - def name(self) -> str: - pass - - # Name of the DB schema this processor writes to - @abstractmethod - def schema(self) -> str: - pass - - # Process all transactions within a block and processes it. - # This method will be called from `process_transaction_with_status` - # In case a transaction cannot be processed, we will fail the entire block. - @abstractmethod - def process_transactions( - self, - transactions: list[transaction_pb2.Transaction], - start_version: int, - end_version: int, - ) -> ProcessingResult: - pass - - def update_last_processed_version(self, last_processed_version) -> None: - with Session() as session, session.begin(): - insert_stmt = insert(NextVersionToProcess).values( - indexer_name=self.name(), next_version=last_processed_version + 1 - ) - on_conflict_do_update_stmt = insert_stmt.on_conflict_do_update( - index_elements=["indexer_name"], - set_=dict(insert_stmt.excluded.items()), - where=( - insert_stmt.excluded["next_version"] - > NextVersionToProcess.next_version - ), - ) - session.execute(on_conflict_do_update_stmt) diff --git a/python/utils/worker.py b/python/utils/worker.py deleted file mode 100644 index 3d11b3cae..000000000 --- a/python/utils/worker.py +++ /dev/null @@ -1,728 +0,0 @@ -import argparse -import grpc -import json - -from aptos_protos.aptos.indexer.v1 import raw_data_pb2, raw_data_pb2_grpc -from aptos_protos.aptos.transaction.v1 import transaction_pb2 -from utils.config import Config, NFTMarketplaceV2Config -from utils.models.general_models import Base -from utils.session import Session -from utils.metrics import PROCESSED_TRANSACTIONS_COUNTER, LATEST_PROCESSED_VERSION -from sqlalchemy import DDL, create_engine -from sqlalchemy import event -from typing import Iterator, List, Optional -from prometheus_client.twisted import MetricsResource -from twisted.web.server import Site -from twisted.web.resource import Resource -from twisted.internet import reactor -import threading -import sys -from utils.transactions_processor import TransactionsProcessor, ProcessingResult -from time import perf_counter, sleep -import traceback -from utils.processor_name import ProcessorName -from processors.example_event_processor.processor import ExampleEventProcessor -from processors.nft_orderbooks.nft_marketplace_processor import NFTMarketplaceProcesser -from processors.nft_marketplace_v2.processor import NFTMarketplaceV2Processor -from processors.coin_flip.processor import CoinFlipProcessor -from processors.aptos_ambassador_token.processor import AptosAmbassadorTokenProcessor -import asyncio -import logging -import queue -import os - -INDEXER_GRPC_BLOB_STORAGE_SIZE = 1000 -INDEXER_GRPC_MIN_SEC_BETWEEN_GRPC_RECONNECTS = 60 -# How large the fetcher queue should be -FETCHER_QUEUE_SIZE = 50 -# We will try to reconnect to GRPC once every X seconds if we get disconnected, before crashing -# We define short connection issue as < 10 seconds so adding a bit of a buffer here -MIN_SEC_BETWEEN_GRPC_RECONNECTS = 15 -# We will try to reconnect to GRPC 5 times in case upstream connection is being updated -RECONNECTION_MAX_RETRIES = 5 - -PROCESSOR_SERVICE_TYPE = "processor" - - -def get_grpc_stream( - indexer_grpc_data_service_address: str, - indexer_grpc_data_stream_api_key: str, - indexer_grpc_http2_ping_interval_in_secs: int, - indexer_grpc_http2_ping_timeout_in_secs: int, - starting_version: int, - ending_version: Optional[int], - processor_name: str, -) -> Iterator[raw_data_pb2.TransactionsResponse]: - logging.info( - "[Parser] Setting up rpc channel", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - metadata = ( - ("authorization", "Bearer " + indexer_grpc_data_stream_api_key), - ("x-aptos-request-name", processor_name), - ) - options = [ - ("grpc.max_receive_message_length", -1), - ( - "grpc.keepalive_time_ms", - indexer_grpc_http2_ping_interval_in_secs * 1000, - ), - ( - "grpc.keepalive_timeout_ms", - indexer_grpc_http2_ping_timeout_in_secs * 1000, - ), - ] - - channel = grpc.secure_channel( - indexer_grpc_data_service_address, - options=options, - credentials=grpc.ssl_channel_credentials(), - ) - transactions_count = ( - ending_version - starting_version + 1 if ending_version else None - ) - - logging.info( - "[Parser] Setting up stream", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "starting_version": starting_version, - "ending_version": ending_version, - "count": transactions_count, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - try: - stub = raw_data_pb2_grpc.RawDataStub(channel) - request = raw_data_pb2.GetTransactionsRequest( - starting_version=starting_version, transactions_count=transactions_count - ) - responses = stub.GetTransactions(request, metadata=metadata) - return iter(responses) - except Exception as e: - logging.exception( - "[Parser] Failed to get grpc response. Is the server running?" - ) - os._exit(1) - - -# Gets a batch of transactions from the stream. Batch size is set in the grpc server. -# The number of batches depends on our config -# There could be several special scenarios: -# 1. If we lose the connection, we will try reconnecting X times within Y seconds before crashing. -# 2. If we specified an end version and we hit that, we will stop fetching, but we will make sure that -# all existing transactions are processed -def producer( - q: queue.Queue, - indexer_grpc_data_service_address: str, - indexer_grpc_data_stream_api_key: str, - indexer_grpc_http2_ping_interval: int, - indexer_grpc_http2_ping_timeout: int, - starting_version: int, - ending_version: Optional[int], - processor_name: str, - batch_start_version: int, -): - last_insertion_time = perf_counter() - next_version_to_fetch = batch_start_version - last_reconnection_time = None - reconnection_retries = 0 - response_stream = get_grpc_stream( - indexer_grpc_data_service_address, - indexer_grpc_data_stream_api_key, - indexer_grpc_http2_ping_interval, - indexer_grpc_http2_ping_timeout, - starting_version, - ending_version, - processor_name, - ) - - logging.info( - "[Parser] Successfully connected to GRPC endpoint", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "starting_version": starting_version, - "ending_version": ending_version, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - while True: - is_success = False - try: - start_time = perf_counter() - response = next(response_stream) - reconnection_retries = 0 - batch_start_version = response.transactions[0].version - batch_end_version = response.transactions[-1].version - next_version_to_fetch = batch_end_version + 1 - size_in_bytes = response.ByteSize() - chain_id = response.chain_id - assert chain_id is not None, "[Parser] Chain Id doesn't exist" - logging.info( - "[Parser] Received transactions from GRPC. Sending transactions to channel.", - extra={ - "processor_name": processor_name, - "start_version": str(batch_start_version), - "end_version": str(batch_end_version), - "size_in_bytes": str(size_in_bytes), - "channel_size": q.qsize(), - "channel_recv_latency_in_secs": str( - format(perf_counter() - last_insertion_time, ".8f") - ), - "duration_in_secs": str(format(perf_counter() - start_time, ".8f")), - "step": "1", - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - q.put((chain_id, size_in_bytes, response.transactions)) - last_insertion_time = perf_counter() - is_success = True - except StopIteration: - logging.info( - "[Parser] Stream ended", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - except Exception as e: - logging.exception( - "[Parser] Error receiving datastream response", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "error": str(e), - "next_version_to_fetch": next_version_to_fetch, - "ending_version": ending_version, - }, - ) - # Datastream error can happen when we fail to deserialize deeply nested types. - # Skip the batch, log the error, and continue processing. - is_success = True - next_version_to_fetch += 1 - response_stream = get_grpc_stream( - indexer_grpc_data_service_address, - indexer_grpc_data_stream_api_key, - indexer_grpc_http2_ping_interval, - indexer_grpc_http2_ping_timeout, - next_version_to_fetch, - ending_version, - processor_name, - ) - - # Check if we're at the end of the stream - reached_ending_version = ( - next_version_to_fetch > ending_version if ending_version else False - ) - if reached_ending_version: - logging.info( - "[Parser] Reached ending version", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "ending_version": ending_version, - "next_version_to_fetch": next_version_to_fetch, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - # Wait for the fetched transactions to finish processing before closing the channel - while True: - logging.info( - "[Parser] Waiting for channel to be empty", - extra={ - "processor_name": processor_name, - "channel_size": q.qsize(), - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - if q.qsize() == 0: - break - logging.info( - "[Parser] The stream is ended", - extra={ - "processor_name": processor_name, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - break - else: - # The rest is to see if we need to reconnect - if is_success: - continue - - if last_reconnection_time: - elapsed_secs = perf_counter() - last_reconnection_time - if ( - reconnection_retries >= RECONNECTION_MAX_RETRIES - and elapsed_secs < MIN_SEC_BETWEEN_GRPC_RECONNECTS - ): - logging.warning( - "[Parser] Recently reconnected. Will not retry", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "seconds_since_last_retry": str(elapsed_secs), - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - os._exit(1) - reconnection_retries += 1 - last_reconnection_time = perf_counter() - logging.info( - "[Parser] Reconnecting to GRPC.", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_service_address, - "starting_version": next_version_to_fetch, - "ending_version": ending_version, - "reconnection_retries": reconnection_retries, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - response_stream = get_grpc_stream( - indexer_grpc_data_service_address, - indexer_grpc_data_stream_api_key, - indexer_grpc_http2_ping_interval, - indexer_grpc_http2_ping_timeout, - next_version_to_fetch, - ending_version, - processor_name, - ) - - -# This is the consumer side of the channel. These are the major states: -# 1. We're backfilling so we should expect many concurrent threads to process transactions -# 2. We're caught up so we should expect a single thread to process transactions -# 3. We have received either an empty batch or a batch with a gap. We should panic. -# 4. We have not received anything in X seconds, we should panic. -# 5. If it's the wrong chain, panic. -def consumer( - q: queue.Queue, - producer_thread: threading.Thread, - indexer_grpc_data_stream_endpoint: str, - processor: TransactionsProcessor, - num_concurrent_processing_tasks: int, - starting_version: int, - processor_name: str, -): - asyncio.run( - consumer_impl( - q, - producer_thread, - indexer_grpc_data_stream_endpoint, - processor, - num_concurrent_processing_tasks, - starting_version, - processor_name, - ) - ) - - -async def consumer_impl( - q: queue.Queue, - producer_thread: threading.Thread, - indexer_grpc_data_stream_endpoint: str, - processor: TransactionsProcessor, - num_concurrent_processing_tasks: int, - starting_version: int, - processor_name: str, -): - chain_id = None - batch_start_version = starting_version - - while True: - start_time = perf_counter() - - # Check if producer task is done - if not producer_thread.is_alive(): - logging.info( - "[Parser] Channel closed; stream ended.", - extra={ - "processor_name": processor_name, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - os._exit(0) - - # Fetch transaction batches from channel to process - transaction_batches = [] - last_fetched_version = batch_start_version - 1 - total_size = 0 - for task_index in range(num_concurrent_processing_tasks): - if task_index == 0: - # If we're the first task, we should wait until we get data. - chain_id, size_in_bytes, transactions = q.get() - else: - # If we're not the first task, we should poll to see if we get any data. - try: - chain_id, size_in_bytes, transactions = q.get_nowait() - except queue.Empty: - # Channel is empty and send is not dropped which we definitely expect. Wait for a bit and continue polling. - continue - - # TODO: Check chain_id saved in DB - total_size += size_in_bytes - current_fetched_version = transactions[0].version - if last_fetched_version + 1 != current_fetched_version: - logging.warning( - "[Parser] Received batch with gap from GRPC stream", - extra={ - "processor_name": processor_name, - "last_fetched_version": last_fetched_version, - "current_fetched_version": current_fetched_version, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - # Gaps are possible because we skipped versions - # os._exit(1) - last_fetched_version = transactions[-1].version - transaction_batches.append(transactions) - - processor_threads = [] - for transactions in transaction_batches: - thread = IndexerProcessorServer.WorkerThread( - processor, transactions=transactions, size_in_bytes=total_size - ) - processor_threads.append(thread) - thread.start() - - for thread in processor_threads: - thread.join() - - processing_time = perf_counter() - task_count = len(processor_threads) - processed_versions: List[ProcessingResult] = [] - for thread in processor_threads: - if thread.exception: - logging.warning( - "[Parser] Error processing transaction batch", - extra={"processor_name": processor_name}, - ) - os._exit(1) - - processed_versions.append(thread.processing_result) - - # Make sure there are no gaps and advance states - prev_start = None - prev_end = None - for result in processed_versions: - if prev_start is None or prev_end is None: - prev_start = result.start_version - prev_end = result.end_version - else: - if prev_end + 1 != result.start_version: - logging.warning( - "[Parser] Gaps in processing stream", - extra={ - "processor_name": processor_name, - "stream_address": indexer_grpc_data_stream_endpoint, - "processed_versions": processed_versions, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - # Gaps are possible because we skip versions - # os._exit(1) - prev_start = result.start_version - prev_end = result.end_version - - processed_start_version = processed_versions[0].start_version - processed_end_version = processed_versions[-1].end_version - batch_start_version = processed_end_version + 1 - - processor.update_last_processed_version(processed_end_version) - PROCESSED_TRANSACTIONS_COUNTER.labels(processor_name=processor_name).inc( - processed_end_version - processed_start_version + 1 - ) - LATEST_PROCESSED_VERSION.labels(processor_name=processor_name).set( - processed_end_version - ) - logging.info( - "[Parser] Finished processing multiple transaction batches", - extra={ - "processor_name": processor_name, - "service_type": PROCESSOR_SERVICE_TYPE, - "start_version": processed_versions[0].start_version, - "end_version": processed_versions[-1].end_version, - "num_of_transactions": processed_versions[-1].end_version - + 1 - - processed_versions[0].start_version, - "duration_in_secs": str(format(perf_counter() - start_time, ".8f")), - "task_count": task_count, - "processing_duration": str( - format(perf_counter() - processing_time, ".8f") - ), - "service_type": PROCESSOR_SERVICE_TYPE, - "size_in_bytes": str(total_size), - "step": "3", - }, - ) - - -class IndexerProcessorServer: - config: Config - num_concurrent_processing_tasks: int - - def __init__(self, config: Config): - self.config = config - logging.info( - "[Parser] Kicking off", - extra={ - "processor_name": self.config.server_config.processor_config.type, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - # Instantiate the correct processor based on config - processor_config = self.config.server_config.processor_config - match processor_config.type: - case ProcessorName.EXAMPLE_EVENT_PROCESSOR.value: - self.processor = ExampleEventProcessor() - case ProcessorName.NFT_MARKETPLACE_V1_PROCESSOR.value: - self.processor = NFTMarketplaceProcesser() - case ProcessorName.NFT_MARKETPLACE_V2_PROCESSOR.value: - assert isinstance(processor_config, NFTMarketplaceV2Config) - self.processor = NFTMarketplaceV2Processor(processor_config) - case ProcessorName.COIN_FLIP.value: - self.processor = CoinFlipProcessor() - case ProcessorName.EXAMPLE_AMBASSADOR_TOKEN_PROCESSOR.value: - self.processor = AptosAmbassadorTokenProcessor() - case _: - raise Exception( - "Invalid processor name" - "\n[ERROR]: The specified processor name was invalid or not found.\n" - " - If you are using a custom processor, make sure to add it to the ProcessorName enum in utils/processor_name.py.\n" - " - Ensure the IndexerProcessorServer constructor in utils/worker.py uses the new enum value.\n" - ) - - # TODO: Move this to a config - self.num_concurrent_processing_tasks = 10 - - class WorkerThread( - threading.Thread, - ): - processing_result: ProcessingResult - exception: Exception | None - - def __init__( - self, - processor: TransactionsProcessor, - transactions: List[transaction_pb2.Transaction], - size_in_bytes: int, - ): - threading.Thread.__init__(self) - self.processor = processor - self.transactions = transactions - self.processing_result = ProcessingResult( - transactions[0].version, transactions[-1].version, 0.0, 0.0 - ) - self.exception = None - - def run(self): - start_version = self.transactions[0].version - end_version = self.transactions[-1].version - - try: - self.processing_result = self.processor.process_transactions( - self.transactions, start_version, end_version - ) - num_of_transactions = str(end_version - start_version + 1) - processor_name = self.processor.name() - start_version_str = str(start_version) - end_version_str = str(end_version) - processing_duration_in_secs = format( - self.processing_result.processing_duration_in_secs, ".8f" - ) - db_insertion_duration_in_secs = format( - self.processing_result.db_insertion_duration_in_secs, ".8f" - ) - duration_in_secs = format( - self.processing_result.processing_duration_in_secs - + self.processing_result.db_insertion_duration_in_secs, - ".8f", - ) - size_in_bytes = str(sum(obj.ByteSize() for obj in self.transactions)) - logging.info( - "[Parser] DB insertion time of one batch of transactions", - extra={ - "processor_name": processor_name, - "start_version": start_version_str, - "end_version": end_version_str, - "service_type": PROCESSOR_SERVICE_TYPE, - "num_of_transactions": num_of_transactions, - "duration_in_secs": db_insertion_duration_in_secs, - "size_in_bytes": str(size_in_bytes), - }, - ) - logging.info( - "[Parser] Parsing time of one batch of transactions", - extra={ - "processor_name": processor_name, - "start_version": start_version_str, - "end_version": end_version_str, - "service_type": PROCESSOR_SERVICE_TYPE, - "num_of_transactions": num_of_transactions, - "duration_in_secs": processing_duration_in_secs, - "size_in_bytes": str(size_in_bytes), - }, - ) - logging.info( - "[Parser] Processor finished processing one batch of transaction", - extra={ - "processor_name": processor_name, - "start_version": start_version_str, - "end_version": end_version_str, - "service_type": PROCESSOR_SERVICE_TYPE, - "num_of_transactions": num_of_transactions, - "processing_duration_in_secs": processing_duration_in_secs, - "db_insertion_duration_in_secs": db_insertion_duration_in_secs, - "duration_in_secs": duration_in_secs, - "size_in_bytes": str(size_in_bytes), - "step": "2", - }, - ) - except Exception as e: - import traceback - - traceback.print_exc() - self.exception = e - - def run(self): - processor_name = self.config.server_config.processor_config.type - indexer_grpc_address = ( - self.config.server_config.indexer_grpc_data_service_address - ) - - # Run DB migrations - logging.info( - "[Parser] Initializing DB tables", - extra={ - "processor_name": self.processor.name(), - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - self.init_db_tables(self.processor.schema()) - logging.info( - "[Parser] DB tables initialized", - extra={ - "processor_name": self.processor.name(), - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - self.start_health_and_monitoring_ports() - - # Get starting version from DB - starting_version = self.config.get_starting_version(self.processor.name()) - ending_version = self.config.server_config.ending_version - - # Create a transaction fetcher thread that will continuously fetch transactions from the GRPC stream - # and write into a channel. Each item is of type (chain_id, vec of transactions) - logging.info( - "[Parser] Starting fetcher task", - extra={ - "processor_name": processor_name, - "stream_address": self.config.server_config.indexer_grpc_data_service_address, - "start_version": starting_version, - "service_type": PROCESSOR_SERVICE_TYPE, - }, - ) - - q = queue.Queue(FETCHER_QUEUE_SIZE) - producer_thread = threading.Thread( - target=producer, - daemon=True, - args=( - q, - indexer_grpc_address, - self.config.server_config.auth_token, - self.config.server_config.indexer_grpc_http2_ping_interval_in_secs, - self.config.server_config.indexer_grpc_http2_ping_timeout_in_secs, - starting_version, - ending_version, - processor_name, - starting_version, - ), - ) - producer_thread.start() - - consumer_thread = threading.Thread( - target=consumer, - daemon=True, - args=( - q, - producer_thread, - indexer_grpc_address, - self.processor, - self.num_concurrent_processing_tasks, - starting_version, - processor_name, - ), - ) - consumer_thread.start() - - producer_thread.join() - consumer_thread.join() - - def init_db_tables(self, schema_name: str) -> None: - engine = create_engine(self.config.server_config.postgres_connection_string) - engine = engine.execution_options( - schema_translate_map={"per_schema": schema_name} - ) - Session.configure(bind=engine) - Base.metadata.create_all(engine, checkfirst=True) - - def start_health_and_monitoring_ports(self) -> None: - # Start the health + metrics server. - def start_health_server() -> None: - # The kubelet uses liveness probes to know when to restart a container. In cases where the - # container is crashing or unresponsive, the kubelet receives timeout or error responses, and then - # restarts the container. It polls every 10 seconds by default. - root = Resource() - root.putChild(b"metrics", MetricsResource()) # type: ignore - - class ServerOk(Resource): - isLeaf = True - - def render_GET(self, request): - return b"ok" - - root.putChild(b"", ServerOk()) # type: ignore - factory = Site(root) - reactor.listenTCP(self.config.health_check_port, factory) # type: ignore - reactor.run(installSignalHandlers=False) # type: ignore - - t = threading.Thread(target=start_health_server, daemon=True) - # TODO: Handles the exit signal and gracefully shutdown the server. - t.start() - - -@event.listens_for(Base.metadata, "before_create") -def create_schemas(target, connection, **kw): - schemas = set() - for table in target.tables.values(): - if table.schema is not None: - schemas.add(table.schema) - for schema in schemas: - connection.execute(DDL("CREATE SCHEMA IF NOT EXISTS %s" % schema)) - - -@event.listens_for(Base.metadata, "after_drop") -def drop_schemas(target, connection, **kw): - schemas = set() - for table in target.tables.values(): - if table.schema is not None: - schemas.add(table.schema) - for schema in schemas: - connection.execute(DDL("DROP SCHEMA IF EXISTS %s" % schema)) diff --git a/python/utils/write_set_change_utils.py b/python/utils/write_set_change_utils.py deleted file mode 100644 index b3c4b99bc..000000000 --- a/python/utils/write_set_change_utils.py +++ /dev/null @@ -1,31 +0,0 @@ -from aptos_protos.aptos.transaction.v1 import transaction_pb2 - - -def get_write_table_item( - write_set_change: transaction_pb2.WriteSetChange, -) -> transaction_pb2.WriteTableItem | None: - if write_set_change.type != transaction_pb2.WriteSetChange.TYPE_WRITE_TABLE_ITEM: - return None - return write_set_change.write_table_item - - -def get_write_resource( - write_set_change: transaction_pb2.WriteSetChange, -) -> transaction_pb2.WriteResource | None: - if write_set_change.type != transaction_pb2.WriteSetChange.TYPE_WRITE_RESOURCE: - return None - return write_set_change.write_resource - - -def get_delete_resource( - write_set_change: transaction_pb2.WriteSetChange, -) -> transaction_pb2.DeleteResource | None: - if write_set_change.type != transaction_pb2.WriteSetChange.TYPE_DELETE_RESOURCE: - return None - return write_set_change.delete_resource - - -def get_move_type_short( - move_struct: transaction_pb2.MoveStructTag, -) -> str: - return f"{move_struct.module}::{move_struct.name}" diff --git a/rust/processor/parser.yaml b/rust/processor/parser.yaml deleted file mode 100644 index 25ed06b54..000000000 --- a/rust/processor/parser.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# This is a template yaml for the indexer processor. It assumes you have a data service -# running locally, for example as part of local testnet you ran with this command: -# aptos node run-local-testnet -health_check_port: 8084 -server_config: - processor_config: - type: default_processor - postgres_connection_string: postgresql://postgres:@localhost:5432/default_processor - indexer_grpc_data_service_address: http://127.0.0.1:50051 - auth_token: AUTH_TOKEN \ No newline at end of file diff --git a/typescript/README.md b/typescript/README.md deleted file mode 100644 index a68fbc9da..000000000 --- a/typescript/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Custom Processors: Typescript - -> [!WARNING] -> For production-grade indexers, we recommend the Rust processors. -> The typescript implementation is known to get stuck when there are lots of data to process. The issue is with the GRPC client and we haven't had a chance to optimize. Please proceed with caution. - -## Directory Guide - -- `examples`: Contains example processors that you can use as a starting point for your own custom processor. -- `sdk`: Contains the custom processor SDK. This package provides a variety of helpful code for writing your own custom processor, such as for connecting to the Transaction Stream Service, creating tables in the database, and keeping track of the last processed transaction. diff --git a/typescript/examples/README.md b/typescript/examples/README.md deleted file mode 100644 index 8f0024b4c..000000000 --- a/typescript/examples/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Custom Processor Templates - -> [!WARNING] -> For production-grade indexers, we recommend the Rust processors. -> The typescript implementation is known to get stuck when there are lots of data to process. The issue is with the GRPC client and we haven't had a chance to optimize. Please proceed with caution. - -This directory contains templates you can copy to get started with writing a custom processor in TS. diff --git a/typescript/examples/event_processor/.eslintignore b/typescript/examples/event_processor/.eslintignore deleted file mode 100644 index 61959f647..000000000 --- a/typescript/examples/event_processor/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -aptos-indexer-protos -node_modules -packages/**/node_modules/ -dist/** -**/*.test.ts diff --git a/typescript/examples/event_processor/.eslintrc.json b/typescript/examples/event_processor/.eslintrc.json deleted file mode 100644 index 5b0bdfa3e..000000000 --- a/typescript/examples/event_processor/.eslintrc.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true, - "node": true - }, - "extends": ["prettier"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": ["tsconfig.json"], - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": ["@typescript-eslint", "import"], - "rules": { - "quotes": ["error", "double"], - "max-len": ["error", 120], - "import/extensions": ["error", "never"], - "max-classes-per-file": ["error", 10], - "import/prefer-default-export": "off", - "object-curly-newline": "off", - "no-use-before-define": "off", - "no-unused-vars": "off", - "@typescript-eslint/no-use-before-define": ["error", { - "functions": false, - "classes": false - }], - "@typescript-eslint/no-unused-vars": ["error"] - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"] - } - } - } - } diff --git a/typescript/examples/event_processor/.gitignore b/typescript/examples/event_processor/.gitignore deleted file mode 100644 index 683e21039..000000000 --- a/typescript/examples/event_processor/.gitignore +++ /dev/null @@ -1,65 +0,0 @@ -dist -node_modules/ -.node_modules/ -built/* -tests/cases/rwc/* -tests/cases/perf/* -!tests/cases/webharness/compilerToString.js -test-args.txt -~*.docx -\#*\# -.\#* -tests/baselines/local/* -tests/baselines/local.old/* -tests/services/baselines/local/* -tests/baselines/prototyping/local/* -tests/baselines/rwc/* -tests/baselines/reference/projectOutput/* -tests/baselines/local/projectOutput/* -tests/baselines/reference/testresults.tap -tests/services/baselines/prototyping/local/* -tests/services/browser/typescriptServices.js -src/harness/*.js -src/compiler/diagnosticInformationMap.generated.ts -src/compiler/diagnosticMessages.generated.json -src/parser/diagnosticInformationMap.generated.ts -src/parser/diagnosticMessages.generated.json -rwc-report.html -*.swp -build.json -*.actual -tests/webTestServer.js -tests/webTestServer.js.map -tests/webhost/*.d.ts -tests/webhost/webtsc.js -tests/cases/**/*.js -tests/cases/**/*.js.map -*.config -scripts/eslint/built/ -scripts/debug.bat -scripts/run.bat -scripts/**/*.js -scripts/**/*.js.map -coverage/ -**/.DS_Store -.settings -**/.vs -**/.vscode/* -!**/.vscode/tasks.json -!**/.vscode/settings.template.json -!**/.vscode/launch.template.json -!**/.vscode/extensions.json -!tests/cases/projects/projectOption/**/node_modules -!tests/cases/projects/NodeModulesSearch/**/* -!tests/baselines/reference/project/nodeModules*/**/* -.idea -yarn.lock -yarn-error.log -.parallelperf.* -tests/baselines/reference/dt -.failed-tests -TEST-results.xml -package-lock.json -.eslintcache -*v8.log -/lib/ diff --git a/typescript/examples/event_processor/.prettierrc b/typescript/examples/event_processor/.prettierrc deleted file mode 100644 index 4f99c86ae..000000000 --- a/typescript/examples/event_processor/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "semi": true, - "trailingComma": "all", - "singleQuote": false -} diff --git a/typescript/examples/event_processor/README.md b/typescript/examples/event_processor/README.md deleted file mode 100644 index 6db3b96cd..000000000 --- a/typescript/examples/event_processor/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Event Parser - -> [!WARNING] -> For production-grade indexers, we recommend the Rust processors. -> The typescript implementation is known to get stuck when there are lots of data to process. The issue is with the GRPC client and we haven't had a chance to optimize. Please proceed with caution. - -This is a very simple example that just extracts events from user transactions and logs them. - -## Prerequisites - -- `pnpm`: The code is tested with pnpm 8.6.2. Later versions should work too. -- `node`: The code is tested with Node 18. Later versions should work too. - -## Usage - -Install all the dependencies: - -``` -pnpm install -``` - -Prepare the `config.yaml` file. Make sure to update the `config.yaml` file with the correct indexer setting and database credentials. - -``` -$ cp config.yaml.example ~/config.yaml -``` - -Run the example: - -``` -pnpm start process --config ~/config.yaml -``` - -## Explanation - -This example provides a basic processor that extracts events from user transactions and logs them. - -When creating a custom processor, the two main things you need to define are: - -- Parser: How you parse the data from the transactions. -- Models: How you store the data you extract from the transactions. - -These are defined in `parser.ts` and `models.ts` respectively. - -The SDK handles the rest: - -- Connecting to the Transaction Stream Service. -- Creating tables in the database. -- Validating the chain ID. -- Keeping track of the last processed transaction. -- Storing the data from your `parse` function in the database. - -In `parser.ts`, we have implemented a `parse` function which accepts a `Transaction` as a parameter. The example code shows how to implement custom filtering and how to extract `Events` from a `Transaction`. The function returns a list of event objects that the SDK will add to the database for us. diff --git a/typescript/examples/event_processor/config.yaml.example b/typescript/examples/event_processor/config.yaml.example deleted file mode 100644 index e93ff6f5f..000000000 --- a/typescript/examples/event_processor/config.yaml.example +++ /dev/null @@ -1,5 +0,0 @@ -chain_id: 2 -grpc_data_stream_endpoint: grpc.testnet.aptoslabs.com:443 -grpc_data_stream_api_key: -starting_version: 0 -db_connection_uri: "postgresql://postgres:postgres@localhost:5432/example_event" diff --git a/typescript/examples/event_processor/package.json b/typescript/examples/event_processor/package.json deleted file mode 100644 index 9cecd89a4..000000000 --- a/typescript/examples/event_processor/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "event_processor", - "description": "Example Aptos Event Processor", - "version": "0.1.0", - "packageManager": "pnpm@8.6.2", - "license": "Apache-2.0", - "engines": { - "node": ">=14.0.0" - }, - "scripts": { - "start": "ts-node ./src/index.ts", - "lint": "eslint '**/*.{ts,tsx}'", - "fmt": "prettier --write '**/*.(ts|tsx)'" - }, - "dependencies": { - "@aptos-labs/aptos-processor-sdk": "=0.2.0", - "commander": "^11.0.0", - "pg": "^8.11.3", - "typeorm": "=0.3.17" - }, - "devDependencies": { - "@types/node": "^18.17.13", - "@typescript-eslint/eslint-plugin": "5.36.2", - "@typescript-eslint/parser": "5.36.2", - "eslint": "^8.48.0", - "eslint-config-prettier": "8.5.0", - "eslint-plugin-import": "2.26.0", - "ts-node": "^10.9.1", - "typescript": "^4.8.4" - } -} diff --git a/typescript/examples/event_processor/pnpm-lock.yaml b/typescript/examples/event_processor/pnpm-lock.yaml deleted file mode 100644 index 65ca9fe7d..000000000 --- a/typescript/examples/event_processor/pnpm-lock.yaml +++ /dev/null @@ -1,2303 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@aptos-labs/aptos-processor-sdk': - specifier: '=0.2.0' - version: 0.2.0(pg@8.11.3)(ts-node@10.9.1) - commander: - specifier: ^11.0.0 - version: 11.0.0 - pg: - specifier: ^8.11.3 - version: 8.11.3 - typeorm: - specifier: '=0.3.17' - version: 0.3.17(pg@8.11.3)(ts-node@10.9.1) - -devDependencies: - '@types/node': - specifier: ^18.17.13 - version: 18.17.13 - '@typescript-eslint/eslint-plugin': - specifier: 5.36.2 - version: 5.36.2(@typescript-eslint/parser@5.36.2)(eslint@8.48.0)(typescript@4.8.4) - '@typescript-eslint/parser': - specifier: 5.36.2 - version: 5.36.2(eslint@8.48.0)(typescript@4.8.4) - eslint: - specifier: ^8.48.0 - version: 8.48.0 - eslint-config-prettier: - specifier: 8.5.0 - version: 8.5.0(eslint@8.48.0) - eslint-plugin-import: - specifier: 2.26.0 - version: 2.26.0(@typescript-eslint/parser@5.36.2)(eslint@8.48.0) - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@18.17.13)(typescript@4.8.4) - typescript: - specifier: ^4.8.4 - version: 4.8.4 - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@aptos-labs/aptos-processor-sdk@0.2.0(pg@8.11.3)(ts-node@10.9.1): - resolution: {integrity: sha512-z/ZCghZDt4Y4l56EToL28mhbr22uAx2nGid7mYDo7N/zeJ4hB9G7tpMjZEqZCSg6pbfSx53tYBMIrdBbON/QdA==} - engines: {node: '>=14.0.0'} - dependencies: - '@aptos-labs/aptos-protos': 1.1.2 - '@grpc/grpc-js': 1.9.2 - google-protobuf: 3.21.2 - pg-connection-string: 2.6.2 - timer-node: 5.0.7 - typeorm: 0.3.17(pg@8.11.3)(ts-node@10.9.1) - typeorm-naming-strategies: 4.1.0(typeorm@0.3.17) - transitivePeerDependencies: - - '@google-cloud/spanner' - - '@sap/hana-client' - - better-sqlite3 - - hdb-pool - - ioredis - - mongodb - - mssql - - mysql2 - - oracledb - - pg - - pg-native - - pg-query-stream - - redis - - sql.js - - sqlite3 - - supports-color - - ts-node - - typeorm-aurora-data-api-driver - dev: false - - /@aptos-labs/aptos-protos@1.1.2: - resolution: {integrity: sha512-DwOefasA9R9fY7KaPvVNETEeYwwruzsOfNBGlUZNzeeiJW6i79GNLPgoxL0sk6BlnuWqPkHzhRryq+IrSaJsaQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@grpc/grpc-js': 1.9.2 - long: 5.2.3 - protobufjs: 7.2.5 - dev: false - - /@babel/runtime@7.22.11: - resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: false - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.48.0: - resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@grpc/grpc-js@1.9.2: - resolution: {integrity: sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==} - engines: {node: ^8.13.0 || >=10.10.0} - dependencies: - '@grpc/proto-loader': 0.7.9 - '@types/node': 18.17.13 - dev: false - - /@grpc/proto-loader@0.7.9: - resolution: {integrity: sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.2.5 - yargs: 17.7.2 - dev: false - - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false - - /@sqltools/formatter@1.2.5: - resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} - dev: false - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - - /@types/node@18.17.13: - resolution: {integrity: sha512-SlLPDDe6YQl1JnQQy4hgsuJeo5q5c1TBU4be4jeBLXsqpjoDbfb0HesSfhMwnaxfSJ4txtfzJzW5/x/43fkkfQ==} - - /@typescript-eslint/eslint-plugin@5.36.2(@typescript-eslint/parser@5.36.2)(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - '@typescript-eslint/scope-manager': 5.36.2 - '@typescript-eslint/type-utils': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - '@typescript-eslint/utils': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - debug: 4.3.4 - eslint: 8.48.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.4 - regexpp: 3.2.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@4.8.4) - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.36.2(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.36.2 - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/typescript-estree': 5.36.2(typescript@4.8.4) - debug: 4.3.4 - eslint: 8.48.0 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.36.2: - resolution: {integrity: sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/visitor-keys': 5.36.2 - dev: true - - /@typescript-eslint/type-utils@5.36.2(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.36.2(typescript@4.8.4) - '@typescript-eslint/utils': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - debug: 4.3.4 - eslint: 8.48.0 - tsutils: 3.21.0(typescript@4.8.4) - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.36.2: - resolution: {integrity: sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.36.2(typescript@4.8.4): - resolution: {integrity: sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/visitor-keys': 5.36.2 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@4.8.4) - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.36.2(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@typescript-eslint/scope-manager': 5.36.2 - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/typescript-estree': 5.36.2(typescript@4.8.4) - eslint: 8.48.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.48.0) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.36.2: - resolution: {integrity: sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.36.2 - eslint-visitor-keys: 3.4.3 - dev: true - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false - - /app-root-path@3.1.0: - resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} - engines: {node: '>= 6.0.0'} - dev: false - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - is-string: 1.0.7 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - dev: true - - /arraybuffer.prototype.slice@1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - get-intrinsic: 1.2.1 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: false - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /buffer-writer@2.0.0: - resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} - engines: {node: '>=4'} - dev: false - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 - dev: false - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.22.11 - dev: false - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - - /es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - dev: true - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-prettier@8.5.0(eslint@8.48.0): - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.48.0 - dev: true - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.0 - resolve: 1.22.4 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.36.2)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - debug: 3.2.7 - eslint: 8.48.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.36.2)(eslint@8.48.0): - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - debug: 2.6.9 - doctrine: 2.1.0 - eslint: 8.48.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.36.2)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) - has: 1.0.3 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.7 - resolve: 1.22.4 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.48.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.48.0: - resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@eslint-community/regexpp': 4.8.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.1.0 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} - dependencies: - flatted: 3.2.7 - keyv: 4.5.3 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - functions-have-names: 1.2.3 - dev: true - - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: false - - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.0 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /google-protobuf@3.21.2: - resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} - dev: false - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - dev: false - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - dependencies: - has: 1.0.3 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.11 - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /packet-reader@1.0.0: - resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - dev: false - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - dependencies: - parse5: 6.0.1 - dev: false - - /parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - dev: false - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - requiresBuild: true - dev: false - optional: true - - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - dev: false - - /pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - dev: false - - /pg-pool@3.6.1(pg@8.11.3): - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} - peerDependencies: - pg: '>=8.0' - dependencies: - pg: 8.11.3 - dev: false - - /pg-protocol@1.6.0: - resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - dev: false - - /pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.0 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 - dev: false - - /pg@8.11.3: - resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} - engines: {node: '>= 8.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.11.3) - pg-protocol: 1.6.0 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.1.1 - dev: false - - /pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - dependencies: - split2: 4.2.0 - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - dev: false - - /postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - dev: false - - /postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - dev: false - - /postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - dependencies: - xtend: 4.0.2 - dev: false - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /protobufjs@7.2.5: - resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 18.17.13 - long: 5.2.3 - dev: false - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - dev: false - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: false - - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true - - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: false - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false - - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: false - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: false - - /timer-node@5.0.7: - resolution: {integrity: sha512-M1aP6ASmuVD0PSxl5fqjCAGY9WyND3DHZ8RwT5I8o7469XE53Lb5zbPai20Dhj7TProyaapfVj3TaT0P+LoSEA==} - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /ts-node@10.9.1(@types/node@18.17.13)(typescript@4.8.4): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.17.13 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.8.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - - /tsutils@3.21.0(typescript@4.8.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.8.4 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true - - /typeorm-naming-strategies@4.1.0(typeorm@0.3.17): - resolution: {integrity: sha512-vPekJXzZOTZrdDvTl1YoM+w+sUIfQHG4kZTpbFYoTsufyv9NIBRe4Q+PdzhEAFA2std3D9LZHEb1EjE9zhRpiQ==} - peerDependencies: - typeorm: ^0.2.0 || ^0.3.0 - dependencies: - typeorm: 0.3.17(pg@8.11.3)(ts-node@10.9.1) - dev: false - - /typeorm@0.3.17(pg@8.11.3)(ts-node@10.9.1): - resolution: {integrity: sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==} - engines: {node: '>= 12.9.0'} - hasBin: true - peerDependencies: - '@google-cloud/spanner': ^5.18.0 - '@sap/hana-client': ^2.12.25 - better-sqlite3: ^7.1.2 || ^8.0.0 - hdb-pool: ^0.1.6 - ioredis: ^5.0.4 - mongodb: ^5.2.0 - mssql: ^9.1.1 - mysql2: ^2.2.5 || ^3.0.1 - oracledb: ^5.1.0 - pg: ^8.5.1 - pg-native: ^3.0.0 - pg-query-stream: ^4.0.0 - redis: ^3.1.1 || ^4.0.0 - sql.js: ^1.4.0 - sqlite3: ^5.0.3 - ts-node: ^10.7.0 - typeorm-aurora-data-api-driver: ^2.0.0 - peerDependenciesMeta: - '@google-cloud/spanner': - optional: true - '@sap/hana-client': - optional: true - better-sqlite3: - optional: true - hdb-pool: - optional: true - ioredis: - optional: true - mongodb: - optional: true - mssql: - optional: true - mysql2: - optional: true - oracledb: - optional: true - pg: - optional: true - pg-native: - optional: true - pg-query-stream: - optional: true - redis: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - ts-node: - optional: true - typeorm-aurora-data-api-driver: - optional: true - dependencies: - '@sqltools/formatter': 1.2.5 - app-root-path: 3.1.0 - buffer: 6.0.3 - chalk: 4.1.2 - cli-highlight: 2.1.11 - date-fns: 2.30.0 - debug: 4.3.4 - dotenv: 16.3.1 - glob: 8.1.0 - mkdirp: 2.1.6 - pg: 8.11.3 - reflect-metadata: 0.1.13 - sha.js: 2.4.11 - ts-node: 10.9.1(@types/node@18.17.13)(typescript@4.8.4) - tslib: 2.6.2 - uuid: 9.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: false - - /typescript@4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} - engines: {node: '>=4.2.0'} - hasBin: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: false - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - 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.8 - yargs-parser: 21.1.1 - dev: false - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true diff --git a/typescript/examples/event_processor/src/index.ts b/typescript/examples/event_processor/src/index.ts deleted file mode 100644 index 8bf96107c..000000000 --- a/typescript/examples/event_processor/src/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { program } from "commander"; -import { Config, Worker } from "@aptos-labs/aptos-processor-sdk"; -import { EventProcessor } from "./processor"; -import { Event } from "./models"; - -type Args = { - config: string; - perf: number; -}; - -program - .command("process") - .requiredOption("--config ", "Path to a yaml config file") - .action(async (args: Args) => { - await main(args); - }); - -async function main({ config: configPath }: Args) { - const config = Config.from_yaml_file(configPath); - const processor = new EventProcessor(); - const worker = new Worker({ - config, - processor, - models: [Event], - }); - await worker.run(); -} - -program.parse(); diff --git a/typescript/examples/event_processor/src/models.ts b/typescript/examples/event_processor/src/models.ts deleted file mode 100644 index bf97a5603..000000000 --- a/typescript/examples/event_processor/src/models.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Base } from "@aptos-labs/aptos-processor-sdk"; -import { Column, Entity, PrimaryColumn } from "typeorm"; - -@Entity("events") -export class Event extends Base { - @PrimaryColumn({ type: "bigint" }) - transactionVersion!: string; - - // This is the order of the event in the events list in the trannsaction. - @PrimaryColumn({ type: "bigint" }) - eventIndex!: string; - - @Column({ type: "bigint" }) - creationNumber!: string; - - @Column() - accountAddress!: string; - - @Column({ type: "bigint" }) - sequenceNumber!: string; - - @Column() - type!: string; - - @Column({ type: "bigint" }) - transactionBlockHeight!: string; - - @Column() - data!: string; - - @Column({ type: "timestamptz", nullable: true }) - inserted_at!: Date; -} diff --git a/typescript/examples/event_processor/src/processor.ts b/typescript/examples/event_processor/src/processor.ts deleted file mode 100644 index ade96fd0e..000000000 --- a/typescript/examples/event_processor/src/processor.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { protos } from "@aptos-labs/aptos-processor-sdk"; -import { Event } from "./models"; -import { - ProcessingResult, - TransactionsProcessor, - grpcTimestampToDate, -} from "@aptos-labs/aptos-processor-sdk"; -import { DataSource } from "typeorm"; - -export class EventProcessor extends TransactionsProcessor { - name(): string { - return "event_processor"; - } - - processTransactions({ - transactions, - startVersion, - endVersion, - dataSource, - }: { - transactions: protos.aptos.transaction.v1.Transaction[]; - startVersion: bigint; - endVersion: bigint; - dataSource: DataSource; // DB connection - }): Promise { - let allObjects: Event[] = []; - - // Process transactions. - for (const transaction of transactions) { - // Filter out all transactions that are not User Transactions - if ( - transaction.type != - protos.aptos.transaction.v1.Transaction_TransactionType - .TRANSACTION_TYPE_USER - ) { - continue; - } - - const transactionVersion = transaction.version!; - const transactionBlockHeight = transaction.blockHeight!; - const insertedAt = grpcTimestampToDate(transaction.timestamp!); - - const userTransaction = transaction.user!; - - const events = userTransaction.events!; - - const objects = events.map((event, i) => { - const eventEntity = new Event(); - eventEntity.transactionVersion = transactionVersion.toString(); - eventEntity.eventIndex = i.toString(); - eventEntity.sequenceNumber = event.sequenceNumber!.toString(); - eventEntity.creationNumber = event.key!.creationNumber!.toString(); - eventEntity.accountAddress = `0x${event.key!.accountAddress}`; - eventEntity.type = event.typeStr!; - eventEntity.data = event.data!; - eventEntity.transactionBlockHeight = transactionBlockHeight.toString(); - eventEntity.inserted_at = insertedAt; - return eventEntity; - }); - - allObjects = allObjects.concat(objects); - } - - // Insert events into the DB. - return dataSource.transaction(async (txnManager) => { - // Insert in chunks of 100 at a time to deal with this issue: - // https://stackoverflow.com/q/66906294/3846032 - const chunkSize = 100; - for (let i = 0; i < allObjects.length; i += chunkSize) { - const chunk = allObjects.slice(i, i + chunkSize); - await txnManager.insert(Event, chunk); - } - return { - startVersion, - endVersion, - }; - }); - } -} diff --git a/typescript/examples/event_processor/tsconfig.json b/typescript/examples/event_processor/tsconfig.json deleted file mode 100644 index 4deb62029..000000000 --- a/typescript/examples/event_processor/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "target": "es2021", - "module": "commonjs", - "baseUrl": "./", - "outDir": "dist", - "moduleResolution": "node", - "declaration": true, - "sourceMap": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": false, - "noImplicitReturns": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true - }, - "include": [ - "**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/typescript/sdk/.eslintignore b/typescript/sdk/.eslintignore deleted file mode 100644 index aa46a3a98..000000000 --- a/typescript/sdk/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist/** -**/*.test.ts diff --git a/typescript/sdk/.eslintrc.json b/typescript/sdk/.eslintrc.json deleted file mode 100644 index 687635571..000000000 --- a/typescript/sdk/.eslintrc.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true, - "node": true - }, - "extends": ["prettier"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": ["tsconfig.json"], - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": ["@typescript-eslint", "import"], - "rules": { - "quotes": ["error", "double"], - "max-len": ["error", 120], - "import/extensions": ["error", "never"], - "max-classes-per-file": ["error", 10], - "import/prefer-default-export": "off", - "object-curly-newline": "off", - "no-use-before-define": "off", - "no-unused-vars": "off", - "@typescript-eslint/no-use-before-define": ["error", { - "functions": false, - "classes": false - }], - "@typescript-eslint/no-unused-vars": ["error"] - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"] - } - } - } -} diff --git a/typescript/sdk/.gitignore b/typescript/sdk/.gitignore deleted file mode 100644 index 683e21039..000000000 --- a/typescript/sdk/.gitignore +++ /dev/null @@ -1,65 +0,0 @@ -dist -node_modules/ -.node_modules/ -built/* -tests/cases/rwc/* -tests/cases/perf/* -!tests/cases/webharness/compilerToString.js -test-args.txt -~*.docx -\#*\# -.\#* -tests/baselines/local/* -tests/baselines/local.old/* -tests/services/baselines/local/* -tests/baselines/prototyping/local/* -tests/baselines/rwc/* -tests/baselines/reference/projectOutput/* -tests/baselines/local/projectOutput/* -tests/baselines/reference/testresults.tap -tests/services/baselines/prototyping/local/* -tests/services/browser/typescriptServices.js -src/harness/*.js -src/compiler/diagnosticInformationMap.generated.ts -src/compiler/diagnosticMessages.generated.json -src/parser/diagnosticInformationMap.generated.ts -src/parser/diagnosticMessages.generated.json -rwc-report.html -*.swp -build.json -*.actual -tests/webTestServer.js -tests/webTestServer.js.map -tests/webhost/*.d.ts -tests/webhost/webtsc.js -tests/cases/**/*.js -tests/cases/**/*.js.map -*.config -scripts/eslint/built/ -scripts/debug.bat -scripts/run.bat -scripts/**/*.js -scripts/**/*.js.map -coverage/ -**/.DS_Store -.settings -**/.vs -**/.vscode/* -!**/.vscode/tasks.json -!**/.vscode/settings.template.json -!**/.vscode/launch.template.json -!**/.vscode/extensions.json -!tests/cases/projects/projectOption/**/node_modules -!tests/cases/projects/NodeModulesSearch/**/* -!tests/baselines/reference/project/nodeModules*/**/* -.idea -yarn.lock -yarn-error.log -.parallelperf.* -tests/baselines/reference/dt -.failed-tests -TEST-results.xml -package-lock.json -.eslintcache -*v8.log -/lib/ diff --git a/typescript/sdk/.npmignore b/typescript/sdk/.npmignore deleted file mode 100644 index 3e31aaab4..000000000 --- a/typescript/sdk/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -CONTRIBUTING.md -node_modules -.aptos -.env -scripts diff --git a/typescript/sdk/.prettierrc b/typescript/sdk/.prettierrc deleted file mode 100644 index 4f99c86ae..000000000 --- a/typescript/sdk/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "semi": true, - "trailingComma": "all", - "singleQuote": false -} diff --git a/typescript/sdk/CHANGELOG.md b/typescript/sdk/CHANGELOG.md deleted file mode 100644 index 017cc7306..000000000 --- a/typescript/sdk/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -# Aptos Processor SDK Changelog - -All notable changes to the Aptos Processer SDK will be captured in this file. This changelog is written by hand for now. - -## Unreleased - -## 0.2.0 -- Use @aptos-labs/aptos-protos instead of @aptos-labs/aptos-indexer-protos. - -## 0.1.2 -- Bumped @aptos-labs/aptos-protos to 0.2.3. - -## 0.1.1 -- Initial release. diff --git a/typescript/sdk/CONTRIBUTING.md b/typescript/sdk/CONTRIBUTING.md deleted file mode 100644 index 1146d42a4..000000000 --- a/typescript/sdk/CONTRIBUTING.md +++ /dev/null @@ -1,25 +0,0 @@ -# Aptos Processor SDK - -## Changelog -To update the changelog do the following: - -1. Bump the version in `package.json` according to [semver](https://semver.org/). -2. Bump the version in `version.ts`. -3. Add the change description in the CHANGELOG under the "Unreleased" section. - -## Release process -To release a new version of the package do the following. - -1. Check that the commit you're deploying from (likely just the latest commit of `main`) is green in CI. -1. Bump the version in `package.json` according to [semver](https://semver.org/). -1. Bump the version in `version.ts`. -1. Add an entry in the CHANGELOG for the version. We adhere to [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Generally this means changing the "Unreleased" section to a version and then making a new "Unreleased" section. -1. Once the CI is green land the PR into the main branch. -1. Check out the latest commit on main. -1. Get the auth token from our password manager. Search for "npmjs". It should look like similar to this: `npm_cccaCVg0bWaaR741D5Gdsd12T4JpQre444abaa`. -1. Run `pnpm publish --dry-run`. From here, make some sanity checks: - a. Look closely at the output of the command. Pay close attention to what is packaged. Make sure we're not including some files that were included accidentally. For example `.aptos`. Add those to .npmignore if needed. - b. Compare the summary with the public npm package summary on npmjs. The number of files and sizes should not vary too much. -1. Run `pnpm build` -1. Run `NODE_AUTH_TOKEN= pnpm publish --non-interactive`. -1. Double check that the release worked by visitng npmjs: https://www.npmjs.com/package/aptos-processor-sdk. diff --git a/typescript/sdk/package.json b/typescript/sdk/package.json deleted file mode 100644 index e436bd9d7..000000000 --- a/typescript/sdk/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "@aptos-labs/aptos-processor-sdk", - "description": "SDK to enable you write Custom Indexer Processors for Aptos", - "version": "0.2.0", - "packageManager": "pnpm@8.6.2", - "license": "Apache-2.0", - "engines": { - "node": ">=14.0.0" - }, - "scripts": { - "build": "./scripts/build.sh", - "orm": "npx typeorm -d ./migration.ts", - "lint": "eslint 'src/**/*.{ts,tsx}'", - "fmt": "prettier --write 'src/**/*.(ts|tsx)'" - }, - "dependencies": { - "@aptos-labs/aptos-protos": "1.1.2", - "@grpc/grpc-js": "=1.9.2", - "google-protobuf": "^3.21.2", - "pg-connection-string": "^2.6.2", - "timer-node": "^5.0.7", - "typeorm": "=0.3.17", - "typeorm-naming-strategies": "^4.1.0" - }, - "devDependencies": { - "@types/google-protobuf": "^3.15.6", - "@types/js-yaml": "^4.0.5", - "@types/node": "^18.17.12", - "@typescript-eslint/eslint-plugin": "5.36.2", - "@typescript-eslint/parser": "5.36.2", - "eslint": "^8.48.0", - "eslint-config-prettier": "8.5.0", - "eslint-plugin-import": "2.26.0", - "typescript": "^4.8.4" - }, - "type": "module", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts", - "export": { - ".": { - "require": "./dist/cjs/index.js", - "import": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts" - } - }, - "files": [ - "dist" - ] -} diff --git a/typescript/sdk/pnpm-lock.yaml b/typescript/sdk/pnpm-lock.yaml deleted file mode 100644 index 17a0c13ae..000000000 --- a/typescript/sdk/pnpm-lock.yaml +++ /dev/null @@ -1,2100 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@aptos-labs/aptos-protos': - specifier: 1.1.2 - version: 1.1.2 - '@grpc/grpc-js': - specifier: '=1.9.2' - version: 1.9.2 - google-protobuf: - specifier: ^3.21.2 - version: 3.21.2 - pg-connection-string: - specifier: ^2.6.2 - version: 2.6.2 - timer-node: - specifier: ^5.0.7 - version: 5.0.7 - typeorm: - specifier: '=0.3.17' - version: 0.3.17 - typeorm-naming-strategies: - specifier: ^4.1.0 - version: 4.1.0(typeorm@0.3.17) - -devDependencies: - '@types/google-protobuf': - specifier: ^3.15.6 - version: 3.15.6 - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.5 - '@types/node': - specifier: ^18.17.12 - version: 18.17.12 - '@typescript-eslint/eslint-plugin': - specifier: 5.36.2 - version: 5.36.2(@typescript-eslint/parser@5.36.2)(eslint@8.48.0)(typescript@4.8.4) - '@typescript-eslint/parser': - specifier: 5.36.2 - version: 5.36.2(eslint@8.48.0)(typescript@4.8.4) - eslint: - specifier: ^8.48.0 - version: 8.48.0 - eslint-config-prettier: - specifier: 8.5.0 - version: 8.5.0(eslint@8.48.0) - eslint-plugin-import: - specifier: 2.26.0 - version: 2.26.0(@typescript-eslint/parser@5.36.2)(eslint@8.48.0) - typescript: - specifier: ^4.8.4 - version: 4.8.4 - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@aptos-labs/aptos-protos@1.1.2: - resolution: {integrity: sha512-DwOefasA9R9fY7KaPvVNETEeYwwruzsOfNBGlUZNzeeiJW6i79GNLPgoxL0sk6BlnuWqPkHzhRryq+IrSaJsaQ==} - engines: {node: '>=14.0.0'} - dependencies: - '@grpc/grpc-js': 1.9.2 - long: 5.2.3 - protobufjs: 7.2.5 - dev: false - - /@babel/runtime@7.22.11: - resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: false - - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.48.0: - resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@grpc/grpc-js@1.9.2: - resolution: {integrity: sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==} - engines: {node: ^8.13.0 || >=10.10.0} - dependencies: - '@grpc/proto-loader': 0.7.9 - '@types/node': 18.17.12 - dev: false - - /@grpc/proto-loader@0.7.9: - resolution: {integrity: sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.2.5 - yargs: 17.7.2 - dev: false - - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false - - /@sqltools/formatter@1.2.5: - resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} - dev: false - - /@types/google-protobuf@3.15.6: - resolution: {integrity: sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==} - dev: true - - /@types/js-yaml@4.0.5: - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: true - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - - /@types/node@18.17.12: - resolution: {integrity: sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==} - - /@typescript-eslint/eslint-plugin@5.36.2(@typescript-eslint/parser@5.36.2)(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - '@typescript-eslint/scope-manager': 5.36.2 - '@typescript-eslint/type-utils': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - '@typescript-eslint/utils': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - debug: 4.3.4 - eslint: 8.48.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.4 - regexpp: 3.2.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@4.8.4) - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.36.2(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.36.2 - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/typescript-estree': 5.36.2(typescript@4.8.4) - debug: 4.3.4 - eslint: 8.48.0 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.36.2: - resolution: {integrity: sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/visitor-keys': 5.36.2 - dev: true - - /@typescript-eslint/type-utils@5.36.2(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.36.2(typescript@4.8.4) - '@typescript-eslint/utils': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - debug: 4.3.4 - eslint: 8.48.0 - tsutils: 3.21.0(typescript@4.8.4) - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.36.2: - resolution: {integrity: sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.36.2(typescript@4.8.4): - resolution: {integrity: sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/visitor-keys': 5.36.2 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@4.8.4) - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.36.2(eslint@8.48.0)(typescript@4.8.4): - resolution: {integrity: sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@typescript-eslint/scope-manager': 5.36.2 - '@typescript-eslint/types': 5.36.2 - '@typescript-eslint/typescript-estree': 5.36.2(typescript@4.8.4) - eslint: 8.48.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.48.0) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.36.2: - resolution: {integrity: sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.36.2 - eslint-visitor-keys: 3.4.3 - dev: true - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false - - /app-root-path@3.1.0: - resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} - engines: {node: '>= 6.0.0'} - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - is-string: 1.0.7 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - dev: true - - /arraybuffer.prototype.slice@1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - get-intrinsic: 1.2.1 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: false - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 - dev: false - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.22.11 - dev: false - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - - /es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - dev: true - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-prettier@8.5.0(eslint@8.48.0): - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.48.0 - dev: true - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.13.0 - resolve: 1.22.4 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.36.2)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - debug: 3.2.7 - eslint: 8.48.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.36.2)(eslint@8.48.0): - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.36.2(eslint@8.48.0)(typescript@4.8.4) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - debug: 2.6.9 - doctrine: 2.1.0 - eslint: 8.48.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.36.2)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) - has: 1.0.3 - is-core-module: 2.13.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.7 - resolve: 1.22.4 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-utils@3.0.0(eslint@8.48.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.48.0: - resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@eslint-community/regexpp': 4.8.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.1.0 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} - dependencies: - flatted: 3.2.7 - keyv: 4.5.3 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - functions-have-names: 1.2.3 - dev: true - - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: false - - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.0 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /google-protobuf@3.21.2: - resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} - dev: false - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - dev: false - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - dependencies: - has: 1.0.3 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.11 - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - dependencies: - parse5: 6.0.1 - dev: false - - /parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - dev: false - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /protobufjs@7.2.5: - resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 18.17.12 - long: 5.2.3 - dev: false - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - dev: false - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: false - - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true - - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false - - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: false - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: false - - /timer-node@5.0.7: - resolution: {integrity: sha512-M1aP6ASmuVD0PSxl5fqjCAGY9WyND3DHZ8RwT5I8o7469XE53Lb5zbPai20Dhj7TProyaapfVj3TaT0P+LoSEA==} - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - - /tsutils@3.21.0(typescript@4.8.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.8.4 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true - - /typeorm-naming-strategies@4.1.0(typeorm@0.3.17): - resolution: {integrity: sha512-vPekJXzZOTZrdDvTl1YoM+w+sUIfQHG4kZTpbFYoTsufyv9NIBRe4Q+PdzhEAFA2std3D9LZHEb1EjE9zhRpiQ==} - peerDependencies: - typeorm: ^0.2.0 || ^0.3.0 - dependencies: - typeorm: 0.3.17 - dev: false - - /typeorm@0.3.17: - resolution: {integrity: sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==} - engines: {node: '>= 12.9.0'} - hasBin: true - peerDependencies: - '@google-cloud/spanner': ^5.18.0 - '@sap/hana-client': ^2.12.25 - better-sqlite3: ^7.1.2 || ^8.0.0 - hdb-pool: ^0.1.6 - ioredis: ^5.0.4 - mongodb: ^5.2.0 - mssql: ^9.1.1 - mysql2: ^2.2.5 || ^3.0.1 - oracledb: ^5.1.0 - pg: ^8.5.1 - pg-native: ^3.0.0 - pg-query-stream: ^4.0.0 - redis: ^3.1.1 || ^4.0.0 - sql.js: ^1.4.0 - sqlite3: ^5.0.3 - ts-node: ^10.7.0 - typeorm-aurora-data-api-driver: ^2.0.0 - peerDependenciesMeta: - '@google-cloud/spanner': - optional: true - '@sap/hana-client': - optional: true - better-sqlite3: - optional: true - hdb-pool: - optional: true - ioredis: - optional: true - mongodb: - optional: true - mssql: - optional: true - mysql2: - optional: true - oracledb: - optional: true - pg: - optional: true - pg-native: - optional: true - pg-query-stream: - optional: true - redis: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - ts-node: - optional: true - typeorm-aurora-data-api-driver: - optional: true - dependencies: - '@sqltools/formatter': 1.2.5 - app-root-path: 3.1.0 - buffer: 6.0.3 - chalk: 4.1.2 - cli-highlight: 2.1.11 - date-fns: 2.30.0 - debug: 4.3.4 - dotenv: 16.3.1 - glob: 8.1.0 - mkdirp: 2.1.6 - reflect-metadata: 0.1.13 - sha.js: 2.4.11 - tslib: 2.6.2 - uuid: 9.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: false - - /typescript@4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: false - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: false - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - 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.8 - yargs-parser: 21.1.1 - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true diff --git a/typescript/sdk/scripts/build.sh b/typescript/sdk/scripts/build.sh deleted file mode 100755 index 6109e840e..000000000 --- a/typescript/sdk/scripts/build.sh +++ /dev/null @@ -1,11 +0,0 @@ -rm -rf dist - -# Build the commonjs code. We include a package.json with the type set to commonjs -# so the downstream code knows that it is commonjs and not esm. -tsc --module commonjs --outDir dist/cjs -echo '{"type": "commonjs"}' > dist/cjs/package.json - -# Build the esm code. We include a package.json with the type set to esm -# so the downstream code knows that it is esm and not commonjs. -tsc --module es2022 --outDir dist/esm -echo '{"type": "module"}' > dist/esm/package.json diff --git a/typescript/sdk/src/config.ts b/typescript/sdk/src/config.ts deleted file mode 100644 index c854e5ec9..000000000 --- a/typescript/sdk/src/config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as yaml from "js-yaml"; -import * as fs from "fs"; - -/** - * This class represents the basic configuration required for the worker to connect to - * the txn stream and the database. - */ -class Config { - constructor( - public chain_id: bigint, - public grpc_data_stream_endpoint: string, - public grpc_data_stream_api_key: string, - public starting_version: bigint, - public db_connection_uri: string, - ) {} - - public static from_yaml_file(path: string): Config { - const contents = fs.readFileSync(path, "utf8"); - return yaml.load(contents) as Config; - } -} - -export { Config }; diff --git a/typescript/sdk/src/index.ts b/typescript/sdk/src/index.ts deleted file mode 100644 index 161813ab6..000000000 --- a/typescript/sdk/src/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./config"; -export * from "./models"; -export * from "./worker"; -export * from "./processor"; -export * from "./utils"; - -// As a convenience to the user, re-export the protos. -export * as protos from "@aptos-labs/aptos-protos"; diff --git a/typescript/sdk/src/models/base.ts b/typescript/sdk/src/models/base.ts deleted file mode 100644 index 5001dc659..000000000 --- a/typescript/sdk/src/models/base.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { - CreateDateColumn, - UpdateDateColumn, - DeleteDateColumn, - Index, - BaseEntity, -} from "typeorm"; - -export abstract class Base extends BaseEntity { - @CreateDateColumn() - createdAt!: Date; - - @UpdateDateColumn() - updatedAt!: Date; - - @Index() - @DeleteDateColumn() - deletedAt!: Date; -} diff --git a/typescript/sdk/src/models/data_source.ts b/typescript/sdk/src/models/data_source.ts deleted file mode 100644 index d135e572d..000000000 --- a/typescript/sdk/src/models/data_source.ts +++ /dev/null @@ -1,43 +0,0 @@ -import "reflect-metadata"; -import { DataSource } from "typeorm"; -import { SnakeNamingStrategy } from "typeorm-naming-strategies"; -import { NextVersionToProcess } from "./next_version_to_process"; -import { Base } from "./base"; - -/** - * This function returns a DataSource, something akin to a DB connection object. - * When dataSource.initialize() is called it runs any necessary DB migrations. - */ -export function createDataSource({ - host, - port, - username, - password, - database, - enableSSL, - additionalEntities, -}: { - host: string; - port: number; - username?: string; - password?: string; - database: string; - enableSSL: boolean; - additionalEntities?: typeof Base[]; -}) { - const entities = [NextVersionToProcess, ...(additionalEntities || [])]; - return new DataSource({ - namingStrategy: new SnakeNamingStrategy(), - type: "postgres", - host, - port, - username, - password, - database, - synchronize: true, - logging: false, - entities, - subscribers: [], - ssl: enableSSL, - }); -} diff --git a/typescript/sdk/src/models/index.ts b/typescript/sdk/src/models/index.ts deleted file mode 100644 index 7e63dba59..000000000 --- a/typescript/sdk/src/models/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./base"; -export * from "./data_source"; -export * from "./next_version_to_process"; diff --git a/typescript/sdk/src/models/next_version_to_process.ts b/typescript/sdk/src/models/next_version_to_process.ts deleted file mode 100644 index afb1dbaf2..000000000 --- a/typescript/sdk/src/models/next_version_to_process.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Column, Entity, PrimaryColumn } from "typeorm"; -import { Base } from "./base"; - -@Entity("next_version_to_process") -export class NextVersionToProcess extends Base { - @PrimaryColumn() - indexerName!: string; - - @Column({ type: "bigint" }) - nextVersion!: string; -} - -export function createNextVersionToProcess({ - indexerName, - version, -}: { - indexerName: string; - version: bigint; -}) { - const nextVersionToProcess = new NextVersionToProcess(); - nextVersionToProcess.indexerName = indexerName; - nextVersionToProcess.nextVersion = version.toString(); - return nextVersionToProcess; -} diff --git a/typescript/sdk/src/processor.ts b/typescript/sdk/src/processor.ts deleted file mode 100644 index 1ebeae5b9..000000000 --- a/typescript/sdk/src/processor.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { aptos } from "@aptos-labs/aptos-protos"; -import { DataSource } from "typeorm"; - -/** - * The result of processing a chunk of transactions. This is lets the prcoessor tell - * the worker what range of transactions it processed. - */ -export type ProcessingResult = { - startVersion: bigint; - endVersion: bigint; -}; - -/** - * A processor is given a batch of transactions. It is expected to process the - * transactions, write some derived data to storage if appropriate, and return the - * range of transactions it processed. - */ -export abstract class TransactionsProcessor { - /** - * Name of the processor for status logging and tracking of the latest processed - * version. Prefer camel_case. - */ - abstract name(): string; - - /** - * Process transactions. The function is given the start and end versions of the - * given chunk of transactions. It is expected to process the transactions, write - * to storage if appropriate, and return the range of transactions it processed. - */ - abstract processTransactions({ - transactions, - startVersion, - endVersion, - dataSource, - }: { - transactions: aptos.transaction.v1.Transaction[]; - startVersion: bigint; - endVersion: bigint; - dataSource: DataSource; // DB connection - }): Promise; -} diff --git a/typescript/sdk/src/utils.ts b/typescript/sdk/src/utils.ts deleted file mode 100644 index 0b2f67743..000000000 --- a/typescript/sdk/src/utils.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { aptos } from "@aptos-labs/aptos-protos"; - -/** - * Convert a grpc timestamp to a Date object. - */ -export function grpcTimestampToDate( - timestamp: aptos.util.timestamp.Timestamp, -): Date { - const seconds = timestamp.seconds!; - const nanos = timestamp.nanos!; - const milliseconds = Number(seconds) * 1000 + nanos / 1000000; - const date = new Date(milliseconds); - return date; -} diff --git a/typescript/sdk/src/worker.ts b/typescript/sdk/src/worker.ts deleted file mode 100644 index 58c192b92..000000000 --- a/typescript/sdk/src/worker.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { aptos } from "@aptos-labs/aptos-protos"; -import { Config } from "./config"; -import { Timer } from "timer-node"; -import { exit } from "process"; -import { ChannelCredentials, Metadata } from "@grpc/grpc-js"; -import { parse as pgConnParse } from "pg-connection-string"; -import { createDataSource } from "./models/data_source"; -import { - NextVersionToProcess, - createNextVersionToProcess, -} from "./models/next_version_to_process"; -import { Base } from "./models/base"; -import { TransactionsProcessor } from "./processor"; -import { DataSource } from "typeorm"; - -/** - * This worker class is responsible for connecting to the txn stream and dispatching - * transactions to the provided processor. It is responsible for tracking which - * version it has processed up to and checkpointing that version in the database. - */ -export class Worker { - // Base configuration required to connect to the database and the data stream. - config: Config; - - // The processor we'll run. - processor: TransactionsProcessor; - - // The DB connection. - dataSource: DataSource; - - constructor({ - config, - processor, - models, - }: { - config: Config; - processor: TransactionsProcessor; - // Additional models for which we want to create tables in the DB. - models: typeof Base[]; - }) { - const options = pgConnParse(config.db_connection_uri); - const port = options.port || "5432"; - - if (!options.host || !options.database) { - throw new Error( - "Invalid postgres connection string. e.g. postgres://someuser:somepassword@somehost:5432/somedatabase", - ); - } - - // Build the DB connection object. - const dataSource = createDataSource({ - host: options.host!, - port: Number(port), - username: options.user, - password: options.password, - database: options.database, - enableSSL: options.ssl as boolean, - additionalEntities: models, - }); - - this.config = config; - this.processor = processor; - this.dataSource = dataSource; - } - - /** - * This function is the main entry point for the processor. It will connect to the txn - * stream and start processing transactions. It will call the provided parse function to - * parse transactions and insert the parsed data into the database. - */ - async run({ perf }: { perf?: number } = {}) { - await this.dataSource.initialize(); - - // Create the grpc client. - const client = new aptos.indexer.v1.RawDataClient( - this.config.grpc_data_stream_endpoint, - ChannelCredentials.createSsl(), - { - "grpc.keepalive_time_ms": 1000, - // 0 - No compression - // 1 - Compress with DEFLATE algorithm - // 2 - Compress with GZIP algorithm - // 3 - Stream compression with GZIP algorithm - "grpc.default_compression_algorithm": 2, - // 0 - No compression - // 1 - Low compression level - // 2 - Medium compression level - // 3 - High compression level - "grpc.default_compression_level": 3, - // -1 means unlimited - "grpc.max_receive_message_length": -1, - // -1 means unlimited - "grpc.max_send_message_length": -1, - }, - ); - - const startingVersion = BigInt(this.config.starting_version || 0n); - - console.log( - `[Parser] Requesting stream starting from version ${startingVersion}`, - ); - - const request: aptos.indexer.v1.GetTransactionsRequest = { - startingVersion, - }; - - const metadata = new Metadata(); - metadata.set( - "Authorization", - `Bearer ${this.config.grpc_data_stream_api_key}`, - ); - - // Create and start the streaming RPC. - let currentTxnVersion = startingVersion; - const stream = client.getTransactions(request, metadata); - - const timer = new Timer(); - timer.start(); - - stream.on( - "data", - async (response: aptos.indexer.v1.TransactionsResponse) => { - stream.pause(); - const transactions = response.transactions; - - if (transactions == null) { - return; - } - - // Validate response chain ID matches expected chain ID - if (response.chainId != this.config.chain_id) { - throw new Error( - `Chain ID mismatch. Expected ${this.config.chain_id} but got ${response.chainId}`, - ); - } - - const startVersion = transactions[0].version!; - const endVersion = transactions[transactions.length - 1].version!; - - console.log({ - message: "[Parser] Response received", - startVersion: startVersion, - }); - - if (startVersion != currentTxnVersion) { - throw new Error( - `Transaction version mismatch. Expected ${currentTxnVersion} but got ${startVersion}`, - ); - } - - // Pass the transactions to the given TransactionProcessor. It is responsible - // for doing its own DB mutations. - const processingResult = await this.processor.processTransactions({ - transactions, - startVersion, - endVersion, - dataSource: this.dataSource, - }); - - const numProcessed = - processingResult.endVersion - processingResult.startVersion; - - currentTxnVersion = endVersion; - - if (numProcessed) { - await this.dataSource.transaction(async (txnManager) => { - const nextVersionToProcess = createNextVersionToProcess({ - indexerName: this.processor.name(), - version: currentTxnVersion + 1n, - }); - await txnManager.upsert( - NextVersionToProcess, - nextVersionToProcess, - ["indexerName"], - ); - }); - } else if (currentTxnVersion % 1000n === 0n) { - // Checkpoint - const nextVersionToProcess = createNextVersionToProcess({ - indexerName: this.processor.name(), - version: currentTxnVersion + 1n, - }); - await this.dataSource - .getRepository(NextVersionToProcess) - .upsert(nextVersionToProcess, ["indexerName"]); - - console.log({ - message: "[Parser] Successfully processed transactions", - last_success_transaction_version: currentTxnVersion, - }); - } - - const totalTransactions = currentTxnVersion - startingVersion + 1n; - - if (perf && totalTransactions >= Number(perf)) { - timer.stop(); - console.log( - `[Parser] It took ${timer.ms()} ms to process ${totalTransactions} txns`, - ); - exit(0); - } - - currentTxnVersion += 1n; - stream.resume(); - }, - ); - - stream.on("error", function (e) { - console.error(e); - // An error has occurred and the stream has been closed. - }); - - stream.on("status", function (status) { - console.log(`[Parser] ${status}`); - // process status - }); - } -} diff --git a/typescript/sdk/tsconfig.json b/typescript/sdk/tsconfig.json deleted file mode 100644 index 4deb62029..000000000 --- a/typescript/sdk/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "target": "es2021", - "module": "commonjs", - "baseUrl": "./", - "outDir": "dist", - "moduleResolution": "node", - "declaration": true, - "sourceMap": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": false, - "noImplicitReturns": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true - }, - "include": [ - "**/*.ts" - ], - "exclude": [ - "node_modules" - ] -}