From ecd7b45b357cf6b6d0a0c41d8a739a5d22641673 Mon Sep 17 00:00:00 2001 From: Troy Date: Mon, 10 Jun 2024 12:24:34 -0600 Subject: [PATCH 1/4] support config files --- Makefile | 2 +- extractors/.env.example | 3 - extractors/configs/arbitrum_mainnet.yaml | 28 ++++ extractors/configs/arbitrum_sepolia.yaml | 30 ++++ extractors/configs/base_mainnet.yaml | 23 +++ extractors/configs/base_sepolia.yaml | 23 +++ extractors/main.py | 181 ++++++----------------- extractors/requirements.txt | 1 + 8 files changed, 150 insertions(+), 141 deletions(-) create mode 100644 extractors/configs/arbitrum_mainnet.yaml create mode 100644 extractors/configs/arbitrum_sepolia.yaml create mode 100644 extractors/configs/base_mainnet.yaml create mode 100644 extractors/configs/base_sepolia.yaml diff --git a/Makefile b/Makefile index fafe0bd9..1066518c 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ build: docker compose build transformer extract: - docker compose run extractors python main.py + docker compose run extractors python main.py configs/base_mainnet.yaml wrap: docker compose run transformer python scripts/wrap_tables.py diff --git a/extractors/.env.example b/extractors/.env.example index 2d067333..5407f0d7 100644 --- a/extractors/.env.example +++ b/extractors/.env.example @@ -5,6 +5,3 @@ BASE_MAINNET_RPC= BASE_SEPOLIA_RPC= ARBITRUM_SEPOLIA_RPC= ARBITRUM_MAINNET_RPC= - -# settings -REQUESTS_PER_SECOND=25 diff --git a/extractors/configs/arbitrum_mainnet.yaml b/extractors/configs/arbitrum_mainnet.yaml new file mode 100644 index 00000000..15926473 --- /dev/null +++ b/extractors/configs/arbitrum_mainnet.yaml @@ -0,0 +1,28 @@ +blocks: + network_id: 42161 + min_block: "218M" + requests_per_second: 25 + block_increment: 4000 + +eth_calls: + - name: "arbitrum_mainnet_vault_collateral" + network_id: 42161 + contract_name: "CoreProxy" + function_name: "getVaultCollateral" + inputs: + - [1, "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"] + - [1, "0x912CE59144191C1204E64559FE8253a0e49E6548"] + - [1, "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] + min_block: "218M" + requests_per_second: 25 + + - name: "arbitrum_mainnet_vault_debt" + network_id: 42161 + contract_name: "CoreProxy" + function_name: "getVaultDebt" + inputs: + - [1, "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"] + - [1, "0x912CE59144191C1204E64559FE8253a0e49E6548"] + - [1, "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] + min_block: "218M" + requests_per_second: 25 \ No newline at end of file diff --git a/extractors/configs/arbitrum_sepolia.yaml b/extractors/configs/arbitrum_sepolia.yaml new file mode 100644 index 00000000..68911cb4 --- /dev/null +++ b/extractors/configs/arbitrum_sepolia.yaml @@ -0,0 +1,30 @@ +blocks: + network_id: 421614 + min_block: "41M" + requests_per_second: 25 + block_increment: 4000 + +eth_calls: + - name: "arbitrum_mainnet_vault_collateral" + network_id: 421614 + contract_name: "CoreProxy" + function_name: "getVaultCollateral" + inputs: + - [1, "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73"] + - [1, "0x7b356eEdABc1035834cd1f714658627fcb4820E3"] + - [1, "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d"] + - [1, "0xda7b438d762110083602AbC497b1Ec8Bc6605eC9"] + min_block: "41M" + requests_per_second: 25 + + - name: "arbitrum_mainnet_vault_debt" + network_id: 421614 + contract_name: "CoreProxy" + function_name: "getVaultDebt" + inputs: + - [1, "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73"] + - [1, "0x7b356eEdABc1035834cd1f714658627fcb4820E3"] + - [1, "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d"] + - [1, "0xda7b438d762110083602AbC497b1Ec8Bc6605eC9"] + min_block: "41M" + requests_per_second: 25 \ No newline at end of file diff --git a/extractors/configs/base_mainnet.yaml b/extractors/configs/base_mainnet.yaml new file mode 100644 index 00000000..14030201 --- /dev/null +++ b/extractors/configs/base_mainnet.yaml @@ -0,0 +1,23 @@ +blocks: + network_id: 8453 + min_block: "7.5M" + requests_per_second: 25 + +eth_calls: + - name: "base_mainnet_vault_collateral" + network_id: 8453 + contract_name: "CoreProxy" + function_name: "getVaultCollateral" + inputs: + - [1, "0xC74eA762cF06c9151cE074E6a569a5945b6302E7"] + min_block: "7.5M" + requests_per_second: 25 + + - name: "base_mainnet_vault_debt" + network_id: 8453 + contract_name: "CoreProxy" + function_name: "getVaultDebt" + inputs: + - [1, "0xC74eA762cF06c9151cE074E6a569a5945b6302E7"] + min_block: "7.5M" + requests_per_second: 25 \ No newline at end of file diff --git a/extractors/configs/base_sepolia.yaml b/extractors/configs/base_sepolia.yaml new file mode 100644 index 00000000..87cf4d73 --- /dev/null +++ b/extractors/configs/base_sepolia.yaml @@ -0,0 +1,23 @@ +blocks: + network_id: 84532 + min_block: "8M" + requests_per_second: 25 + +eth_calls: + - name: "base_sepolia_vault_collateral" + network_id: 84532 + contract_name: "CoreProxy" + function_name: "getVaultCollateral" + inputs: + - [1, "0x8069c44244e72443722cfb22DcE5492cba239d39"] + min_block: "8M" + requests_per_second: 25 + + - name: "base_sepolia_vault_debt" + network_id: 84532 + contract_name: "CoreProxy" + function_name: "getVaultDebt" + inputs: + - [1, "0x8069c44244e72443722cfb22DcE5492cba239d39"] + min_block: "8M" + requests_per_second: 25 \ No newline at end of file diff --git a/extractors/main.py b/extractors/main.py index d71a9cce..1d493700 100644 --- a/extractors/main.py +++ b/extractors/main.py @@ -1,148 +1,55 @@ import os +import yaml +import argparse from dotenv import load_dotenv -from src.extract import extract_data, extract_blocks +from src.extract import extract_blocks, extract_data # load environment variables load_dotenv() -REQUESTS_PER_SECOND = int(os.getenv("REQUESTS_PER_SECOND")) +# parse command-line arguments +parser = argparse.ArgumentParser(description="Extract data from Ethereum nodes.") +parser.add_argument("config", help="Path to the YAML configuration file") +parser.add_argument("--name", help="Name of the configuration to use (optional)") +args = parser.parse_args() -# extract blocks -block_inputs = [ - # base mainnet - { - "network_id": 8453, - "min_block": "7.5M", - "requests_per_second": REQUESTS_PER_SECOND, - }, - # base sepolia - { - "network_id": 84532, - "min_block": "8M", - "requests_per_second": 25, - }, - # arbitrum sepolia - { - "network_id": 421614, - "min_block": "41M", - "block_increment": 4000, - }, - # arbitrum mainnet - { - "network_id": 42161, - "min_block": "218M", - "block_increment": 4000, - }, -] +# load configurations from YAML file +with open(args.config, "r") as f: + config = yaml.safe_load(f) -for block_input in block_inputs: - extract_blocks(**block_input) +block_config = config.get("blocks") +eth_call_configs = config.get("eth_calls", []) - -# extract eth_call data -func_inputs = [ - # base mainnet - { - "network_id": 8453, - "contract_name": "CoreProxy", - "function_name": "getVaultCollateral", - "inputs": [ - (1, "0xC74eA762cF06c9151cE074E6a569a5945b6302E7"), - ], - "min_block": "7.5M", - "requests_per_second": REQUESTS_PER_SECOND, - }, - { - "network_id": 8453, - "contract_name": "CoreProxy", - "function_name": "getVaultDebt", - "inputs": [ - (1, "0xC74eA762cF06c9151cE074E6a569a5945b6302E7"), - ], - "min_block": "7.5M", - "requests_per_second": REQUESTS_PER_SECOND, - }, - # base sepolia - { - "network_id": 84532, - "contract_name": "CoreProxy", - "function_name": "getVaultCollateral", - "inputs": [ - (1, "0x8069c44244e72443722cfb22DcE5492cba239d39"), - ], - "min_block": "8M", - "requests_per_second": 25, - }, - { - "network_id": 84532, - "contract_name": "CoreProxy", - "function_name": "getVaultDebt", - "inputs": [ - (1, "0x8069c44244e72443722cfb22DcE5492cba239d39"), - ], - "min_block": "8M", - "requests_per_second": 25, - }, - # arbitrum sepolia - { - "network_id": 421614, - "contract_name": "CoreProxy", - "function_name": "getVaultCollateral", - "inputs": [ - (1, "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73"), # WETH - (1, "0x7b356eEdABc1035834cd1f714658627fcb4820E3"), # ARB - (1, "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d"), # USDC - (1, "0xda7b438d762110083602AbC497b1Ec8Bc6605eC9"), # DAI - ], - "min_block": "41M", - "requests_per_second": 25, - "block_increment": 4000, - }, - { - "network_id": 421614, - "contract_name": "CoreProxy", - "function_name": "getVaultDebt", - "inputs": [ - (1, "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73"), # WETH - (1, "0x7b356eEdABc1035834cd1f714658627fcb4820E3"), # ARB - (1, "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d"), # USDC - (1, "0xda7b438d762110083602AbC497b1Ec8Bc6605eC9"), # DAI - ], - "min_block": "41M", - "requests_per_second": 25, - "block_increment": 4000, - }, - # arbitrum mainnet - { - "network_id": 42161, - "contract_name": "CoreProxy", - "function_name": "getVaultCollateral", - "inputs": [ - (1, "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"), # WETH - (1, "0x912CE59144191C1204E64559FE8253a0e49E6548"), # ARB - (1, "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"), # USDC - ], - "min_block": "218M", - "requests_per_second": 25, - "block_increment": 4000, - }, - { - "network_id": 42161, - "contract_name": "CoreProxy", - "function_name": "getVaultDebt", - "inputs": [ - (1, "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"), # WETH - (1, "0x912CE59144191C1204E64559FE8253a0e49E6548"), # ARB - (1, "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"), # USDC - ], - "min_block": "218M", - "requests_per_second": 25, - "block_increment": 4000, - }, -] - -for func_input in func_inputs: +# determine the flow based on the --name argument +if args.name: + if args.name == block_config.get("name"): + # run blocks only + try: + extract_blocks(**block_config) + except Exception as e: + print(f"Error extracting blocks: {e}") + else: + # run the specified eth_call only + eth_call_config = next( + (ec for ec in eth_call_configs if ec["name"] == args.name), None + ) + if eth_call_config: + try: + extract_data(**eth_call_config) + except Exception as e: + print(f"Error extracting eth_call {args.name}: {e}") + else: + print(f"No configuration found with name {args.name}") +else: + # run everything try: - extract_data(**func_input) + extract_blocks(**block_config) except Exception as e: - print(f"Error: {e} for inputs {func_input}") + print(f"Error extracting blocks: {e}") + + for eth_call_config in eth_call_configs: + try: + extract_data(**eth_call_config) + except Exception as e: + print(f"Error extracting eth_call {eth_call_config.get('name')}: {e}") + continue diff --git a/extractors/requirements.txt b/extractors/requirements.txt index a8d1287b..1d72ade6 100644 --- a/extractors/requirements.txt +++ b/extractors/requirements.txt @@ -1,4 +1,5 @@ python-dotenv +yaml pyarrow duckdb==0.10.2 polars-lts-cpu From bc749655c50fcc213b651fa2f250e477aff3bfde Mon Sep 17 00:00:00 2001 From: Troy Date: Mon, 10 Jun 2024 12:31:30 -0600 Subject: [PATCH 2/4] fix yaml library name --- extractors/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extractors/requirements.txt b/extractors/requirements.txt index 1d72ade6..8223df60 100644 --- a/extractors/requirements.txt +++ b/extractors/requirements.txt @@ -1,5 +1,5 @@ python-dotenv -yaml +PyYAML pyarrow duckdb==0.10.2 polars-lts-cpu From f61e8b433dab621a45868a3d0935adb4b1abe896 Mon Sep 17 00:00:00 2001 From: Troy Date: Mon, 10 Jun 2024 13:03:31 -0600 Subject: [PATCH 3/4] update all configs --- Makefile | 3 +++ extractors/configs/arbitrum_mainnet.yaml | 10 +++++----- extractors/configs/arbitrum_sepolia.yaml | 11 ++++++----- extractors/configs/base_mainnet.yaml | 6 ++---- extractors/configs/base_sepolia.yaml | 6 ++---- extractors/main.py | 4 ++-- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 1066518c..32fc4edc 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,9 @@ build: extract: docker compose run extractors python main.py configs/base_mainnet.yaml + docker compose run extractors python main.py configs/base_sepolia.yaml + docker compose run extractors python main.py configs/arbitrum_mainnet.yaml + docker compose run extractors python main.py configs/arbitrum_sepolia.yaml wrap: docker compose run transformer python scripts/wrap_tables.py diff --git a/extractors/configs/arbitrum_mainnet.yaml b/extractors/configs/arbitrum_mainnet.yaml index 15926473..5be6b3f9 100644 --- a/extractors/configs/arbitrum_mainnet.yaml +++ b/extractors/configs/arbitrum_mainnet.yaml @@ -5,8 +5,7 @@ blocks: block_increment: 4000 eth_calls: - - name: "arbitrum_mainnet_vault_collateral" - network_id: 42161 + - network_id: 42161 contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: @@ -15,9 +14,9 @@ eth_calls: - [1, "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] min_block: "218M" requests_per_second: 25 + block_increment: 4000 - - name: "arbitrum_mainnet_vault_debt" - network_id: 42161 + - network_id: 42161 contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: @@ -25,4 +24,5 @@ eth_calls: - [1, "0x912CE59144191C1204E64559FE8253a0e49E6548"] - [1, "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"] min_block: "218M" - requests_per_second: 25 \ No newline at end of file + requests_per_second: 25 + block_increment: 4000 \ No newline at end of file diff --git a/extractors/configs/arbitrum_sepolia.yaml b/extractors/configs/arbitrum_sepolia.yaml index 68911cb4..100bccca 100644 --- a/extractors/configs/arbitrum_sepolia.yaml +++ b/extractors/configs/arbitrum_sepolia.yaml @@ -5,8 +5,7 @@ blocks: block_increment: 4000 eth_calls: - - name: "arbitrum_mainnet_vault_collateral" - network_id: 421614 + - network_id: 421614 contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: @@ -16,9 +15,10 @@ eth_calls: - [1, "0xda7b438d762110083602AbC497b1Ec8Bc6605eC9"] min_block: "41M" requests_per_second: 25 + block_increment: 4000 - - name: "arbitrum_mainnet_vault_debt" - network_id: 421614 + + - network_id: 421614 contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: @@ -27,4 +27,5 @@ eth_calls: - [1, "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d"] - [1, "0xda7b438d762110083602AbC497b1Ec8Bc6605eC9"] min_block: "41M" - requests_per_second: 25 \ No newline at end of file + requests_per_second: 25 + block_increment: 4000 diff --git a/extractors/configs/base_mainnet.yaml b/extractors/configs/base_mainnet.yaml index 14030201..ab918274 100644 --- a/extractors/configs/base_mainnet.yaml +++ b/extractors/configs/base_mainnet.yaml @@ -4,8 +4,7 @@ blocks: requests_per_second: 25 eth_calls: - - name: "base_mainnet_vault_collateral" - network_id: 8453 + - network_id: 8453 contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: @@ -13,8 +12,7 @@ eth_calls: min_block: "7.5M" requests_per_second: 25 - - name: "base_mainnet_vault_debt" - network_id: 8453 + - network_id: 8453 contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: diff --git a/extractors/configs/base_sepolia.yaml b/extractors/configs/base_sepolia.yaml index 87cf4d73..148a1b12 100644 --- a/extractors/configs/base_sepolia.yaml +++ b/extractors/configs/base_sepolia.yaml @@ -4,8 +4,7 @@ blocks: requests_per_second: 25 eth_calls: - - name: "base_sepolia_vault_collateral" - network_id: 84532 + - network_id: 84532 contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: @@ -13,8 +12,7 @@ eth_calls: min_block: "8M" requests_per_second: 25 - - name: "base_sepolia_vault_debt" - network_id: 84532 + - network_id: 84532 contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: diff --git a/extractors/main.py b/extractors/main.py index 1d493700..76986dcf 100644 --- a/extractors/main.py +++ b/extractors/main.py @@ -22,7 +22,7 @@ # determine the flow based on the --name argument if args.name: - if args.name == block_config.get("name"): + if args.name == "blocks": # run blocks only try: extract_blocks(**block_config) @@ -31,7 +31,7 @@ else: # run the specified eth_call only eth_call_config = next( - (ec for ec in eth_call_configs if ec["name"] == args.name), None + (ec for ec in eth_call_configs if ec["function_name"] == args.name), None ) if eth_call_config: try: From 7156be9575519a9ec8b6a6300763334c81d8c824 Mon Sep 17 00:00:00 2001 From: Troy Date: Mon, 10 Jun 2024 13:52:22 -0600 Subject: [PATCH 4/4] deduplicate config network id --- extractors/configs/arbitrum_mainnet.yaml | 9 ++++----- extractors/configs/arbitrum_sepolia.yaml | 9 ++++----- extractors/configs/base_mainnet.yaml | 9 ++++----- extractors/configs/base_sepolia.yaml | 9 ++++----- extractors/main.py | 9 +++++---- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/extractors/configs/arbitrum_mainnet.yaml b/extractors/configs/arbitrum_mainnet.yaml index 5be6b3f9..878dda69 100644 --- a/extractors/configs/arbitrum_mainnet.yaml +++ b/extractors/configs/arbitrum_mainnet.yaml @@ -1,12 +1,12 @@ +network_id: 42161 + blocks: - network_id: 42161 min_block: "218M" requests_per_second: 25 block_increment: 4000 eth_calls: - - network_id: 42161 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: - [1, "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"] @@ -16,8 +16,7 @@ eth_calls: requests_per_second: 25 block_increment: 4000 - - network_id: 42161 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: - [1, "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"] diff --git a/extractors/configs/arbitrum_sepolia.yaml b/extractors/configs/arbitrum_sepolia.yaml index 100bccca..2105fade 100644 --- a/extractors/configs/arbitrum_sepolia.yaml +++ b/extractors/configs/arbitrum_sepolia.yaml @@ -1,12 +1,12 @@ +network_id: 421614 + blocks: - network_id: 421614 min_block: "41M" requests_per_second: 25 block_increment: 4000 eth_calls: - - network_id: 421614 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: - [1, "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73"] @@ -18,8 +18,7 @@ eth_calls: block_increment: 4000 - - network_id: 421614 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: - [1, "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73"] diff --git a/extractors/configs/base_mainnet.yaml b/extractors/configs/base_mainnet.yaml index ab918274..5c07a6f3 100644 --- a/extractors/configs/base_mainnet.yaml +++ b/extractors/configs/base_mainnet.yaml @@ -1,19 +1,18 @@ +network_id: 8453 + blocks: - network_id: 8453 min_block: "7.5M" requests_per_second: 25 eth_calls: - - network_id: 8453 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: - [1, "0xC74eA762cF06c9151cE074E6a569a5945b6302E7"] min_block: "7.5M" requests_per_second: 25 - - network_id: 8453 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: - [1, "0xC74eA762cF06c9151cE074E6a569a5945b6302E7"] diff --git a/extractors/configs/base_sepolia.yaml b/extractors/configs/base_sepolia.yaml index 148a1b12..dd600175 100644 --- a/extractors/configs/base_sepolia.yaml +++ b/extractors/configs/base_sepolia.yaml @@ -1,19 +1,18 @@ +network_id: 84532 + blocks: - network_id: 84532 min_block: "8M" requests_per_second: 25 eth_calls: - - network_id: 84532 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultCollateral" inputs: - [1, "0x8069c44244e72443722cfb22DcE5492cba239d39"] min_block: "8M" requests_per_second: 25 - - network_id: 84532 - contract_name: "CoreProxy" + - contract_name: "CoreProxy" function_name: "getVaultDebt" inputs: - [1, "0x8069c44244e72443722cfb22DcE5492cba239d39"] diff --git a/extractors/main.py b/extractors/main.py index 76986dcf..723d07d1 100644 --- a/extractors/main.py +++ b/extractors/main.py @@ -17,6 +17,7 @@ with open(args.config, "r") as f: config = yaml.safe_load(f) +network_id = config.get("network_id") block_config = config.get("blocks") eth_call_configs = config.get("eth_calls", []) @@ -25,7 +26,7 @@ if args.name == "blocks": # run blocks only try: - extract_blocks(**block_config) + extract_blocks(network_id=network_id, **block_config) except Exception as e: print(f"Error extracting blocks: {e}") else: @@ -35,7 +36,7 @@ ) if eth_call_config: try: - extract_data(**eth_call_config) + extract_data(network_id=network_id, **eth_call_config) except Exception as e: print(f"Error extracting eth_call {args.name}: {e}") else: @@ -43,13 +44,13 @@ else: # run everything try: - extract_blocks(**block_config) + extract_blocks(network_id=network_id, **block_config) except Exception as e: print(f"Error extracting blocks: {e}") for eth_call_config in eth_call_configs: try: - extract_data(**eth_call_config) + extract_data(network_id=network_id, **eth_call_config) except Exception as e: print(f"Error extracting eth_call {eth_call_config.get('name')}: {e}") continue