From fc30b939ccd8dd06251e8c1bf6b664af1746457f Mon Sep 17 00:00:00 2001 From: MikeSylphDapps Date: Wed, 17 May 2023 22:29:27 -0400 Subject: [PATCH 1/2] Formats the estimated times in days, hours, and minutes. For example, where the display would show "26 hours and 3 minutes" now we would instead see "1 day 2 hours 3 minutes". Only units that have non-zero values are included. For example, 1444 minutes would be displayed as "1 day 4 minutes". --- beacon_api.py | 72 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/beacon_api.py b/beacon_api.py index 6a3b9e443a4..d23507735ba 100644 --- a/beacon_api.py +++ b/beacon_api.py @@ -13,12 +13,13 @@ def estimate_entry_waiting_time(): waiting_time_epochs = beacon_entering / activation_rate_per_epoch waiting_time_seconds = waiting_time_epochs * 12 * 32 # 12 seconds per slot, 32 slots per epoch - waiting_time_minutes = waiting_time_seconds // 60 - waiting_time_seconds = round(waiting_time_seconds % 60) - waiting_time_hours = waiting_time_minutes // 60 - waiting_time_minutes = round(waiting_time_minutes % 60) + waiting_time_days = round(waiting_time_seconds // (24 * 3600)) + remaining_seconds = waiting_time_seconds % (24 * 3600) + waiting_time_hours = round(remaining_seconds // 3600) + remaining_seconds = remaining_seconds % 3600 + waiting_time_minutes = round(remaining_seconds // 60) - return waiting_time_hours, waiting_time_minutes, waiting_time_seconds, beacon_entering, active_validators + return waiting_time_days, waiting_time_hours, waiting_time_minutes, waiting_time_seconds, beacon_entering, active_validators def estimate_exit_waiting_time(): validator_queue_url = "https://beaconcha.in/api/v1/validators/queue" validator_queue_data = requests.get(validator_queue_url).json() @@ -30,14 +31,53 @@ def estimate_exit_waiting_time(): waiting_time_epochs = beacon_exiting / churn_limit waiting_time_seconds = waiting_time_epochs * 12 * 32 # 12 seconds per slot, 32 slots per epoch - waiting_time_minutes = waiting_time_seconds // 60 - waiting_time_seconds = round(waiting_time_seconds % 60) - waiting_time_hours = waiting_time_minutes // 60 - waiting_time_minutes = round(waiting_time_minutes % 60) + waiting_time_days = round(waiting_time_seconds // (24 * 3600)) + remaining_seconds = waiting_time_seconds % (24 * 3600) + waiting_time_hours = round(remaining_seconds // 3600) + remaining_seconds = remaining_seconds % 3600 + waiting_time_minutes = round(remaining_seconds // 60) - return waiting_time_hours, waiting_time_minutes, waiting_time_seconds, beacon_exiting, active_validators + return waiting_time_days, waiting_time_hours, waiting_time_minutes, waiting_time_seconds, beacon_exiting, active_validators + +def format_value_and_units(value, units): + # Pluralization of day, hour, and minute all simply add "s" to the end + return str(value) + " " + (units if value == 1 else units + 's') + +def format_list_for_display(strings): + print(strings) + if not strings: + return "" + elif len(strings) == 1: + # E.g. ["a"] -> "a" + return strings[0] + elif len(strings) == 2: + # E.g. ["a", "b"] -> "a and b" + return strings[0] + " and " + strings[1] + else: + # E.g. ["a", "b", "c"] -> "a, b, and c" + formatted_string = ", ".join(strings[:-1]) + formatted_string += ", and " + strings[-1] + return formatted_string + +def generate_duration_label(days, hours, minutes): + formatted_parts = [] + + if days > 0: + formatted_parts += [format_value_and_units(days, "day")] + if hours > 0: + formatted_parts += [format_value_and_units(hours, "hour")] + if minutes > 0: + formatted_parts += [format_value_and_units(minutes, "minute")] + + if len(formatted_parts) == 0: + return "0 minutes" + else: + return format_list_for_display(formatted_parts) + +def generate_html(entry_waiting_time_days, entry_waiting_time_hours, entry_waiting_time_minutes, beacon_entering, exit_waiting_time_days, exit_waiting_time_hours, exit_waiting_time_minutes, beacon_exiting, active_validators): + entry_waiting_time = generate_duration_label(entry_waiting_time_days, entry_waiting_time_hours, entry_waiting_time_minutes) + exit_waiting_time = generate_duration_label(exit_waiting_time_days, exit_waiting_time_hours, exit_waiting_time_minutes) -def generate_html(entry_waiting_time_hours, entry_waiting_time_minutes, beacon_entering, exit_waiting_time_hours, exit_waiting_time_minutes, beacon_exiting, active_validators): html_content = f""" @@ -68,9 +108,9 @@ def generate_html(entry_waiting_time_hours, entry_waiting_time_minutes, beacon_e

Ethereum 2.0 Validator Queue

-

Estimated waiting time for new validators: {entry_waiting_time_hours} hours and {entry_waiting_time_minutes} minutes

+

Estimated waiting time for new validators: {entry_waiting_time}

Pending validators (entry queue): {beacon_entering}

-

Estimated waiting time for exit queue: {exit_waiting_time_hours} hours and {exit_waiting_time_minutes} minutes

+

Estimated waiting time for exit queue: {exit_waiting_time}

Pending validators (exit queue): {beacon_exiting}

Active validators: {active_validators}

@@ -79,7 +119,7 @@ def generate_html(entry_waiting_time_hours, entry_waiting_time_minutes, beacon_e with open("index.html", "w") as f: f.write(html_content) -entry_waiting_time_hours, entry_waiting_time_minutes, entry_waiting_time_seconds, beacon_entering, active_validators = estimate_entry_waiting_time() -exit_waiting_time_hours, exit_waiting_time_minutes, exit_waiting_time_seconds, beacon_exiting, active_validators = estimate_exit_waiting_time() +entry_waiting_time_days, entry_waiting_time_hours, entry_waiting_time_minutes, entry_waiting_time_seconds, beacon_entering, active_validators = estimate_entry_waiting_time() +exit_waiting_time_days, exit_waiting_time_hours, exit_waiting_time_minutes, exit_waiting_time_seconds, beacon_exiting, active_validators = estimate_exit_waiting_time() -generate_html(entry_waiting_time_hours, entry_waiting_time_minutes, beacon_entering, exit_waiting_time_hours, exit_waiting_time_minutes, beacon_exiting, active_validators) +generate_html(entry_waiting_time_days, entry_waiting_time_hours, entry_waiting_time_minutes, beacon_entering, exit_waiting_time_days, exit_waiting_time_hours, exit_waiting_time_minutes, beacon_exiting, active_validators) From 70a7b890f963704f21763dec6a852be36ceb1e30 Mon Sep 17 00:00:00 2001 From: The NFT Billboard Date: Wed, 31 May 2023 07:52:26 -0400 Subject: [PATCH 2/2] Initial commit --- .gitignore | 1 + README.md | 18 ++++++ beacon_api.py | 151 ++++++++++++++++++++++++++++++++++++++++++-------- index.html | 147 +++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 274 insertions(+), 43 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..218099726f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +validator_queue_monitoring/* \ No newline at end of file diff --git a/README.md b/README.md index 2b313500028..7058668cbfe 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ # Validator activation and exit times Provide an estimate of the waiting time before your ETH 2 validator becomes active or elligible for exit. The data is fetched using [this endpoint from beaconcha.in API](https://beaconcha.in/api/v1/docs/index.html#/Validator/get_api_v1_validators_queue). + +This is a fork of [gonlad-x's validator_queue_monitoring repo](https://github.com/gonlad-x/validator_queue_monitoring). + +Create virtual environment +``` +python -m venv validator_queue_monitoring +``` + +Enter virtual environment +``` +validator_queue_monitoring\Scripts\activate +``` + +Install dependencies +``` +python3 -m pip install urllib3==1.26.6 +python3 -m pip install urllib3==1.26.6 +``` \ No newline at end of file diff --git a/beacon_api.py b/beacon_api.py index d23507735ba..f935f1f2b75 100644 --- a/beacon_api.py +++ b/beacon_api.py @@ -44,7 +44,6 @@ def format_value_and_units(value, units): return str(value) + " " + (units if value == 1 else units + 's') def format_list_for_display(strings): - print(strings) if not strings: return "" elif len(strings) == 1: @@ -77,42 +76,150 @@ def generate_duration_label(days, hours, minutes): def generate_html(entry_waiting_time_days, entry_waiting_time_hours, entry_waiting_time_minutes, beacon_entering, exit_waiting_time_days, exit_waiting_time_hours, exit_waiting_time_minutes, beacon_exiting, active_validators): entry_waiting_time = generate_duration_label(entry_waiting_time_days, entry_waiting_time_hours, entry_waiting_time_minutes) exit_waiting_time = generate_duration_label(exit_waiting_time_days, exit_waiting_time_hours, exit_waiting_time_minutes) + beacon_entering = "{:,}".format(beacon_entering) + beacon_exiting = "{:,}".format(beacon_exiting) + active_validators = "{:,}".format(active_validators) html_content = f""" - - Validator Queue + + Ethereum Validator Queue Status -

Ethereum 2.0 Validator Queue

-

Estimated waiting time for new validators: {entry_waiting_time}

-

Pending validators (entry queue): {beacon_entering}

-

Estimated waiting time for exit queue: {exit_waiting_time}

-

Pending validators (exit queue): {beacon_exiting}

-

Active validators: {active_validators}

+
+

Ethereum Validator Queue Status

+
+
+

Pending Activations

+
{beacon_entering}
+
validators
+
Estimated wait time:
+
{entry_waiting_time}
+
+
+

Active validators

+
{active_validators}
+
validators
+
+
+

Pending Withdrawals

+
{beacon_exiting}
+
validators
+
Estimated wait time:
+
{exit_waiting_time}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
""" diff --git a/index.html b/index.html index 7ee1abb8cb9..a03efca9342 100644 --- a/index.html +++ b/index.html @@ -3,35 +3,140 @@ - - Validator Queue + + Ethereum Validator Queue Status -

Ethereum 2.0 Validator Queue

-

Estimated waiting time for new validators: 652.0 hours and 40 minutes

-

Pending validators (entry queue): 48951

-

Estimated waiting time for exit queue: 0.0 hours and 0 minutes

-

Pending validators (exit queue): 0

-

Active validators: 572087

+
+

Ethereum Validator Queue Status

+
+
+

Pending Activations

+
75,611
+
validators
+
Estimated wait time:
+
37 days, 8 hours, and 7 minutes
+
+
+

Active validators

+
594,503
+
validators
+
+
+

Pending Withdrawals

+
0
+
validators
+
Estimated wait time:
+
0 minutes
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file