diff --git a/Dockerfile b/Dockerfile index aa203ab5..237d3f77 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,25 @@ # Use an official Python runtime as a parent image -FROM python:3.8-slim +FROM python:3.9 # Set the working directory in the container -WORKDIR /usr/src/app +WORKDIR /app -# Copy the current directory contents into the container at /usr/src/app -COPY . /usr/src/app +# Copy the current directory contents into the container +COPY . /app -# Install any needed packages specified in requirements.txt -RUN pip install -r requirements.txt +# Install cron and Python dependencies +RUN apt-get update && apt-get -y install cron && \ + pip3 install --no-cache-dir -r /app/requirements.txt + +# Setup cron jobs +COPY utils/crontab_updates /etc/cron.d/crontab_updates +RUN chmod 0644 /etc/cron.d/crontab_updates && \ + crontab /etc/cron.d/crontab_updates && \ + touch /var/log/cron.log + +# Make the entrypoint script executable and set it as the entrypoint +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh # Make port 8050 available to the world outside this container EXPOSE 8050 @@ -16,5 +27,5 @@ EXPOSE 8050 # Define environment variable ENV FLASK_APP app.py -# Run the application -CMD ["gunicorn", "-w", "4", "--timeout", "2000", "-b", "0.0.0.0:8050", "app:server"] +# Command to run the application and cron jobs +CMD ["entrypoint.sh"] diff --git a/conf/conf.yaml b/conf/conf.yaml index c8513adf..e2a4aef5 100644 --- a/conf/conf.yaml +++ b/conf/conf.yaml @@ -8,3 +8,58 @@ default_values: url: 'https://api.ergo.aap.cornell.edu/api/v1/boxes/unspent/byAddress/' token_ls: 'https://api.ergo.aap.cornell.edu/api/v1/tokens' base_api: 'http://15.204.211.130:4000/api/pools/ErgoSigmanauts' + stats_cols: [ + 'fee NUMERIC', # Numeric type for precision + 'paid NUMERIC', # Numeric type for decimal values + 'blocks INTEGER', # Integer value for block counts + 'last_block_found TIMESTAMP', # Timestamp for dates, assuming proper conversion before storage + 'enabled BOOLEAN', # Boolean type for true/false + 'minimumPayment NUMERIC', # Numeric type for precision of payments + 'payoutScheme VARCHAR(255)', # String type for defined payout schemes + 'connectedMiners INTEGER', # Integer for counting connected miners + 'poolHashrate NUMERIC', # Numeric type for decimal values + 'sharesPerSecond NUMERIC', # Numeric type for decimal values + 'networkType VARCHAR(50)', # String type for network types + 'networkHashrate NUMERIC', # Numeric type for hash rates + 'networkDifficulty NUMERIC', # Numeric type for network difficulty + 'lastNetworkBlockTime TIMESTAMP', # Timestamp for block times + 'blockHeight INTEGER', # Integer for block height values + 'connectedPeers INTEGER', # Integer for counting connected peers + 'rewardType VARCHAR(50)', # String type for reward types + 'poolEffort NUMERIC', # Numeric type for pool effort + 'poolTTF NUMERIC', # Numeric type for pool time to find + 'price NUMERIC', + 'insert_time_stamp TIMESTAMP'] # Timestamp for the exact time data was recorded + + block_cols: ['poolId VARCHAR(255)', + 'blockHeight INTEGER', + 'networkDifficulty NUMERIC', + 'status VARCHAR(255)', + 'confirmationProgress INTEGER', + 'effort NUMERIC', + 'transactionConfirmationData VARCHAR(255)', + 'reward NUMERIC', + 'infoLink VARCHAR(255)', + 'hash VARCHAR(255)', + 'miner VARCHAR(255)', + 'source VARCHAR(255)', + 'time_found VARCHAR(255)'] + + payment_headers: ['pendingShares NUMERIC', + 'pendingBalance NUMERIC', + 'totalPaid NUMERIC', + 'todayPaid NUMERIC', + 'Schema VARCHAR(50)', + 'Price NUMERIC', + 'lastPayment VARCHAR(50)', + 'lastPaymentLink TEXT', + 'participation NUMERIC', + 'created_at TIMESTAMP', + 'miner VARCHAR(100)'] + + live_worker_headers: ['worker VARCHAR(50)', 'hashrate NUMERIC', 'shares_per_second NUMERIC', + 'created TIMESTAMP', 'miner VARCHAR(100)', 'effort NUMERIC', + 'ttf NUMERIC', 'last_block_found VARCHAR(100)'] + + performance_headers: ['worker VARCHAR(50)', 'hashrate NUMERIC', 'shares_per_second NUMERIC', + 'created TIMESTAMP', 'miner VARCHAR(60)', 'insert_time_stamp TIMESTAMP'] \ No newline at end of file diff --git a/docker-compose-diy.yaml b/docker-compose-diy.yaml new file mode 100644 index 00000000..79bbe5a1 --- /dev/null +++ b/docker-compose-diy.yaml @@ -0,0 +1,29 @@ +version: '3.8' + +services: + db: + image: postgres:latest + environment: + POSTGRES_DB: mining-db + POSTGRES_USER: marctheshark + POSTGRES_PASSWORD: password + volumes: + - mining_data:/var/lib/postgresql/data + restart: unless-stopped + ports: + - "5431:5432" + + app: + build: + context: . + dockerfile: Dockerfile # Make sure this is the name of your Dockerfile + volumes: + - ./:/app + ports: + - "8050:8050" + restart: unless-stopped + depends_on: + - db + +volumes: + mining_data: diff --git a/docker-compose.yaml b/docker-compose.yaml index 925c5df1..283d1d7b 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,8 +1,36 @@ -version: '3' +version: '3.8' + services: - pool-ui: + db: + image: postgres:latest + environment: + POSTGRES_DB: mining-db + POSTGRES_USER: marctheshark + POSTGRES_PASSWORD: password + volumes: + - mining_data:/var/lib/postgresql/data + restart: unless-stopped + ports: + - "5431:5432" + + app: build: context: . + volumes: + - ./:/app + ports: + - "8050:8050" + restart: unless-stopped + depends_on: + - db + + pool-ui: image: ghcr.io/marctheshark3/sigmanaut-mining-pool-ui:main ports: - "8050:8050" + restart: unless-stopped + depends_on: + - db + +volumes: + mining_data: diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 00000000..de386759 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +echo "Starting cron..." +cron +echo "Cron started." + + +# Run the database initialization script +python3 -m utils.init_db + +# Start the web server with gunicorn +gunicorn -w 4 --timeout 2000 -b 0.0.0.0:8050 app:server diff --git a/layouts/front_page.py b/layouts/front_page.py index 5a1370f2..7cfa3586 100644 --- a/layouts/front_page.py +++ b/layouts/front_page.py @@ -1,15 +1,13 @@ import dash from dash import html, dcc, Input, Output, dash_table import dash_bootstrap_components as dbc -from utils.api_reader import SigmaWalletReader, PriceReader from pandas import DataFrame from utils.dash_utils import metric_row_style, image_style, create_row_card, card_style, image_card_style, bottom_row_style, bottom_image_style, card_color, large_text_color, small_text_color, background_color import plotly.graph_objs as go import plotly.express as px +from utils.api_2_db import DataSyncer -from dash import html -price_reader = PriceReader() -# sigma_reader = SigmaWalletReader(config_path="../conf") +db_sync = DataSyncer(config_path="../conf") debug = False @@ -78,20 +76,16 @@ def create_row_card(image, h2_text, p_text): html.P(p_text)]), style={'marginRight': 'auto', 'marginLeft': 'auto'}, width=4,) def setup_front_page_callbacks(app, reader): - reader.update_data() - @app.callback([Output('metric-1', 'children')], [Input('fp-int-4', 'n_intervals')]) def update_first_row(n): - reader.update_data() - data = reader.data - # data = reader.get_front_page_data() # - # _, ergo = price_reader.get(debug=debug) - ergo = reader.erg_price - # payout_schema = 'Schema: {}'.format(data['payoutScheme']) - n_miners = '{}'.format(data['connectedMiners']) - hashrate = '{} GH/s'.format(round(data['poolHashrate'], 3)) + data = db_sync.db.fetch_data('stats') + data = data[data.insert_time_stamp == max(data.insert_time_stamp)] + + ergo = data['price'].item() + n_miners = '{}'.format(data['connectedminers'].item()) + hashrate = '{} GH/s'.format(data['poolhashrate'].item()) row_1 = dbc.Row(justify='center', align='stretch', children=[create_row_card('assets/boltz.png', hashrate, 'Pool Hashrate'), @@ -105,31 +99,32 @@ def update_first_row(n): [Input('fp-int-1', 'n_intervals')]) def update_metrics(n): - # reader.update_data() - data = reader.data + + data = db_sync.db.fetch_data('stats') + data = data[data.insert_time_stamp == max(data.insert_time_stamp)] md = 4 row_2 = dbc.Row(children=[ dbc.Col(md=md, style={'padding': '10px'}, children=[ dbc.Card(style=bottom_row_style, children=[ - create_image_text_block('min-payout.png', 'Minimum Payout:', data['minimumPayment']), - create_image_text_block('percentage.png', 'Pool Fee:', '{}%'.format(data['fee'])), - create_image_text_block('ergo.png', 'Total Paid:', '{} ERG'.format(round(data['paid'], 3))), + create_image_text_block('min-payout.png', 'Minimum Payout:', data['minimumpayment'].item()), + create_image_text_block('percentage.png', 'Pool Fee:', '{}%'.format(data['fee'].item())), + create_image_text_block('ergo.png', 'Total Paid:', '{} ERG'.format(round(data['paid'].item(), 3))), ]) ]), dbc.Col(md=md, style={'padding': '10px'}, children=[ dbc.Card(style=bottom_row_style, children=[ - create_image_text_block('bolt.png', 'Network Hashrate:', '{} TH/s'.format(round(data['networkHashrate'], 3))), - create_image_text_block('gauge.png', 'Network Difficulty:', '{}P'.format(round(data['networkDifficulty'], 3))), - create_image_text_block('height.png', 'Block Height:', data['blockHeight']), + create_image_text_block('bolt.png', 'Network Hashrate:', '{} TH/s'.format(round(data['networkhashrate'].item(), 2))), + create_image_text_block('gauge.png', 'Network Difficulty:', '{}P'.format(round(data['networkdifficulty'].item(), 2))), + create_image_text_block('height.png', 'Block Height:', data['blockheight'].item()), ]) ]), dbc.Col(md=md, style={'padding': '10px'}, children=[ dbc.Card(style=bottom_row_style, children=[ - create_image_text_block('triangle.png', 'Schema:', data['payoutScheme']), - create_image_text_block('ergo.png', 'Blocks Found:', data['blocks']), - create_image_text_block('ergo.png', 'Current Block Effort:', round(data['poolEffort'], 3)), + create_image_text_block('triangle.png', 'Schema:', data['payoutscheme'].item()), + create_image_text_block('ergo.png', 'Blocks Found:', data['blocks'].item()), + create_image_text_block('ergo.png', 'Current Block Effort:', round(data['pooleffort'].item(), 3)), ]) ])]) return [row_2] @@ -140,24 +135,26 @@ def update_metrics(n): def update_plots(n, value): if value == 'effort': - block_df = reader.block_df + block_df = db_sync.db.fetch_data('block') + block_df = block_df.sort_values(['time_found']) + block_df['rolling_effort'] = block_df['effort'].expanding().mean() + block_df['effort'] = block_df['effort'] * 100 title = 'EFFORT AND DIFFICULTY' - block_df = block_df.sort_values('Time Found') - block_df['effort'] = block_df['effort'] * 100 - # block_df['Rolling Effort'] = block_df['effort'].expanding().mean() - response_df = block_df.melt(id_vars = ['Time Found'], value_vars=['Rolling Effort', 'effort', 'networkDifficulty']) + block_df = block_df.sort_values('time_found') + + response_df = block_df.melt(id_vars = ['time_found'], value_vars=['rolling_effort', 'effort', 'networkdifficulty']) - effort_response_chart = px.line(response_df[response_df['variable'] != 'networkDifficulty'], - x='Time Found', + effort_response_chart = px.line(response_df[response_df['variable'] != 'networkdifficulty'], + x='time_found', y='value', color='variable', markers=True) # Add 'networkDifficulty' on a secondary y-axis - effort_response_chart.add_trace(go.Scatter(x=response_df['Time Found'][response_df['variable'] == 'networkDifficulty'], - y=response_df['value'][response_df['variable'] == 'networkDifficulty'], - name='networkDifficulty', + effort_response_chart.add_trace(go.Scatter(x=response_df['time_found'][response_df['variable'] == 'networkdifficulty'], + y=response_df['value'][response_df['variable'] == 'networkdifficulty'], + name='networkdifficulty', yaxis='y2', marker=dict(color='rgba(255,0,0,0.5)'), # Adjust color accordingly mode='lines+markers')) @@ -177,11 +174,20 @@ def update_plots(n, value): return effort_response_chart, title title = 'HASHRATE OVER TIME' - total_hashrate_df = reader.get_total_hash_data() - total_hashrate_df = total_hashrate_df.sort_values(['Date']) - total_hashrate_df['Hashrate'] = total_hashrate_df['Hashrate'] - - total_hashrate_plot={'data': [go.Scatter(x=total_hashrate_df['Date'], y=total_hashrate_df['Hashrate'], + + performance_df = db_sync.db.fetch_data('performance') + performance_df = performance_df[performance_df.worker != 'totals'] + performance_df['hashrate'] = performance_df['hashrate'] / 1e3 + + total_hashrate_df = performance_df.groupby('created').agg({ + 'hashrate': 'sum', # Sum of hashrate + 'shares_per_second': 'sum', # Sum of shares_per_second + 'worker': 'nunique', # Count of unique workers + 'miner': 'nunique' # Count of unique miners + }).reset_index() + total_hashrate_df = total_hashrate_df.sort_values(['created']) + + total_hashrate_plot={'data': [go.Scatter(x=total_hashrate_df['created'], y=total_hashrate_df['hashrate'], mode='lines+markers', name='Hashrate Over Time', line={'color': small_text_color})], 'layout': go.Layout(xaxis = {'showgrid': False, 'title': 'Snap Shot Time'},yaxis = {'showgrid': True, 'title': 'GH/s'}, @@ -200,18 +206,34 @@ def update_plots(n, value): Input('dataset-dropdown', 'value')]) def update_content(n, selected_data): - block_df= reader.block_df + if selected_data == 'blocks': - block_df['Confirmation'] = round(block_df['confirmationProgress'], 2) - - block_df = block_df.filter(['Time Found', 'blockHeight', 'miner', 'effort [%]', 'reward [erg]', 'Confirmation [%]']) + block_df = db_sync.db.fetch_data('block') + block_df = block_df.filter(['time_found', 'blockheight', 'confirmationprogress', 'effort', 'reward', 'miner']) + block_df = block_df.sort_values(['time_found'], ascending=False) + block_df['effort'] = block_df['effort'] * 100 + + block_df = block_df.rename(columns={'effort': 'Effort [%]', 'time_found': 'Time Found', + 'blockheight': 'Height', 'miner': 'Miner', + 'reward': 'ERG Reward', 'confirmationprogress': 'Confirmation'}) df = block_df - df['miner'] = df['miner'].apply(lambda x: f"{x[:5]}...{x[-5:]}" if len(x) > 10 else x) + df = df[:15] title = 'Blocks Data' + elif selected_data == 'miners': - df = reader.get_latest_worker_samples(totals=True) - df = df.rename(columns={"Effort": "Current Effort [%]", "Hashrate": "MH/s", 'TTF': 'TTF [Days]'}) + df = db_sync.db.fetch_data('live_worker') + df = df[df.worker == 'totals'] + df = df.filter(['miner', 'hashrate', 'effort', 'ttf', 'last_block_found']) + df['miner'] = ['{}...{}'.format(miner[:3], miner[-5:]) for miner in df.miner] + df['hashrate'] = round(df['hashrate'], 2) + df = df.sort_values(['effort', 'hashrate'], ascending=False) + + df = df.rename(columns={'miner': 'Miner', + 'hashrate': 'MH/s', + 'effort': 'Current Effort [%]', + 'ttf': 'Days to Find', + 'last_block_found': 'Last Block Found'}) title = 'Current Top Miners' else: @@ -227,6 +249,7 @@ def update_content(n, selected_data): def get_layout(reader): return html.Div([dbc.Container(fluid=True, style={'backgroundColor': background_color, 'padding': '10px', 'justifyContent': 'center', 'fontFamily': 'sans-serif', 'color': '#FFFFFF', 'maxWidth': '960px' }, children=[ + dcc.Interval(id='fp-int-1', interval=60*1000, n_intervals=0), dcc.Interval(id='fp-int-2', interval=60*1000, n_intervals=0), dcc.Interval(id='fp-int-3', interval=60*1000, n_intervals=0), @@ -238,10 +261,21 @@ def get_layout(reader): # Detailed stats dbc.Row(id='metric-2', justify='center', style={'padding': '5px'}), + dbc.Row(justify='center', children=[ + html.Img(src='https://i.imgur.com/M84CKef.jpg', style={'height': 'auto%', 'width': 'auto'}), + html.Img(src='https://i.imgur.com/XvPvUgp.jpg', style={'height': 'auto%', 'width': 'auto'}), + html.Img(src='https://i.imgur.com/l0xluPE.jpg', style={'height': 'auto%', 'width': 'auto'}), + + html.Img(src='https://i.imgur.com/Sf6XAJv.jpg', style={'height': 'auto%', 'width': 'auto'}), + + + ]), + # Mining Address Input dbc.Row(justify='center', children=[ dbc.Col(md=8, children=[ + dcc.Input(id='mining-address-input', type='text', placeholder='Mining Address', style={ 'width': '100%', 'padding': '10px', @@ -252,7 +286,9 @@ def get_layout(reader): ]), # Start Mining Button + dbc.Row(justify='center', children=[ + html.Button('Start Mining ⛏️', id='start-mining-button', style={ 'marginTop': '20px', 'backgroundColor': button_color, @@ -398,4 +434,4 @@ def get_layout(reader): app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) app.layout = get_layout() setup_front_page_callbacks(app) - app.run_server(debug=True) + app.run_server(debug=True) \ No newline at end of file diff --git a/layouts/mining_page.py b/layouts/mining_page.py index 6b673df4..6fa35b88 100644 --- a/layouts/mining_page.py +++ b/layouts/mining_page.py @@ -1,4 +1,3 @@ -from utils.api_reader import SigmaWalletReader, PriceReader from utils.dash_utils import image_style, create_pie_chart, create_bar_chart, create_table_component, create_row_card, create_image_text_block, card_style, image_card_style, bottom_row_style, card_color, background_color, large_text_color, small_text_color, bottom_image_style, top_row_style, table_style from dash import Dash, html, dash_table, dcc, callback_context from dash.exceptions import PreventUpdate @@ -12,6 +11,11 @@ from flask_login import LoginManager, UserMixin, login_user from flask import Flask, request, session, redirect, url_for from flask_session import Session + +from utils.api_2_db import DataSyncer + +db_sync = DataSyncer(config_path="../conf") + debug = False server = Flask(__name__) server.config['SECRET_KEY'] = 'your_super_secret_key' # Change this to a random secret key @@ -20,8 +24,6 @@ button_color = large_text_color Session(server) -price_reader = PriceReader() -# sigma_reader = SigmaWalletReader(config_path="../conf") color_discrete_map = { 'Rolling Effort': 'black', @@ -36,18 +38,34 @@ def setup_mining_page_callbacks(app, reader): def update_front_row(n, pathname): - wallet = unquote(pathname.lstrip('/')) + miner = unquote(pathname.lstrip('/')) + wallet = miner - if wallet != 'Enter Your Address': - short_wallet = '{}...{}'.format(wallet[:5], wallet[-5:]) + if miner != 'Enter Your Address': + short_wallet = '{}...{}'.format(wallet[:3], wallet[-5:]) else: short_wallet = wallet - worker_df = reader.get_latest_worker_samples(True) - my_worker_df = worker_df[worker_df.Miner == short_wallet] - my_total_hash = round(list(my_worker_df.Hashrate)[0], ) - my_effort = list(my_worker_df.Effort)[0] - my_ttf = list(my_worker_df.TTF)[0] + worker_df = db_sync.db.fetch_data('live_worker') + total_df = worker_df[worker_df.worker == 'totals'] + my_worker_df = total_df[total_df.miner == miner] + latest_worker = my_worker_df[my_worker_df.created == max(my_worker_df.created)] + # try: + my_total_hash = latest_worker.hashrate.item() + # except ValueError: + # timenow = pd.Timestamp.now() + # db_sync.update_miner_data(timenow=timenow, payment=False, live_data=True, performance=False) + # worker_df = db_sync.db.fetch_data('live_worker') + # total_df = worker_df[worker_df.worker == 'totals'] + # my_worker_df = total_df[total_df.miner == miner] + # my_total_hash = my_worker_df.hashrate.item() + + my_effort = latest_worker.effort.item() + my_ttf = latest_worker.ttf.item() + + data = db_sync.db.fetch_data('stats') + data = data[data.insert_time_stamp == max(data.insert_time_stamp)] + block_df = reader.block_df block_df['miner'] = block_df['miner'].apply(lambda x: f"{x[:5]}...{x[-5:]}" if len(x) > 10 else x) @@ -56,9 +74,9 @@ def update_front_row(n, pathname): ### GATHERING POOL AND YOUR HASH TTF AND EFFORT ### - pool_effort_text = '{}%'.format(reader.data['poolEffort']) - pool_ttf_text = '{} Days'.format(reader.data['poolTTF']) - pool_hash_text = '{} GH/s'.format(reader.data['poolHashrate']) + pool_effort_text = '{}%'.format(data['pooleffort'].item()) + pool_ttf_text = '{} Days'.format(data['poolttf'].item()) + pool_hash_text = '{} GH/s'.format(data['poolhashrate'].item()) your_effort_text = '{}%'.format(my_effort) your_ttf_text = '{} Days'.format(my_ttf) @@ -95,18 +113,20 @@ def update_middle(n, pathname): wallet = unquote(pathname.lstrip('/')) ### PAYMENT STATS ### - my_payment = reader.get_miner_payment_stats(wallet) + payment = db_sync.db.fetch_data('payment') + payment = payment[payment.created_at == max(payment.created_at)] + my_payment = payment[payment.miner == wallet] payment_images ={ - 'Pending Shares': 'min-payout.png', - 'Pending Balance': 'triangle.png', - 'Total Paid': 'ergo.png', - 'Last Payment': 'coins.png', - 'Price': 'ergo.png', - 'Schema': 'ergo.png', + 'pendingshares': 'min-payout.png', + 'pendingbalance': 'triangle.png', + 'totalpaid': 'ergo.png', + 'lastpayment': 'coins.png', + 'price': 'ergo.png', + 'schema': 'ergo.png', } - payment_children = [create_image_text_block(text='{}: {}'.format(key, my_payment[key]), image=payment_images[key]) for key in payment_images.keys() if key != 'lastPaymentLink'] + payment_children = [create_image_text_block(text='{}: {}'.format(key, my_payment[key].item()), image=payment_images[key]) for key in payment_images.keys() if key != 'lastPaymentLink'] return payment_children[:3], payment_children[3:] @@ -118,40 +138,26 @@ def update_middle(n, pathname): [State('url', 'pathname')]) def update_outside(n, pathname): - wallet = unquote(pathname.lstrip('/')) + miner = unquote(pathname.lstrip('/')) ### PAYMENT STATS ### - my_payment = reader.get_miner_payment_stats(wallet) - all_payment_stats = [reader.get_miner_payment_stats(wallet) for wallet in reader.get_miner_ls()] - miners = reader.get_miner_ls() - ls = [] - for miner in miners: - d = reader.get_miner_payment_stats(miner) - shares = d['Pending Shares'] - ls.append([miner, shares]) - - df = pd.DataFrame(ls, columns=['Miner', 'Shares']) - total = df.Shares.sum() - df['participation'] = [shares / total for shares in df.Shares] - df['reward'] = df['participation'] * reader.block_reward - my_df = df[df.Miner == wallet] - try: - participation = round(my_df['participation'].values[0] * 100, 3) - except: - participation = 0 - # print(my_df['participation'], my_df) - - my_payment['Participation [%]']= participation + payment = db_sync.db.fetch_data('payment') + payment = payment[payment.created_at == max(payment.created_at)] + total = payment.pendingshares.sum() + payment['participation'] = [round(shares / total * 100, 2) for shares in payment.pendingshares] + my_payment = payment[payment.miner == miner] + + my_payment['Participation [%]']= my_payment['participation'].item() payment_images ={'Participation [%]': 'smileys.png', - 'Paid Today': 'ergo.png', - 'lastPaymentLink': 'ergo.png', + 'todaypaid': 'ergo.png', + 'lastpaymentlink': 'ergo.png', } - payment_children = [create_image_text_block(text='{}: {}'.format(key, my_payment[key]), image=payment_images[key]) for key in payment_images.keys() if key != 'lastPaymentLink'] + payment_children = [create_image_text_block(text='{}: {}'.format(key, my_payment[key].item()), image=payment_images[key]) for key in payment_images.keys() if key != 'lastpaymentlink'] link = html.Div(style=bottom_row_style, children=[ html.Img(src='assets/{}'.format('ergo.png'), style=bottom_image_style), - html.Span(dcc.Link('Last Payment Link', href=my_payment['lastPaymentLink'], target='_blank'), style={'padding': '10px'})]) + html.Span(dcc.Link('Last Payment Link', href=my_payment['lastpaymentlink'].item(), target='_blank'), style={'padding': '10px'})]) payment_children.append(link) @@ -165,10 +171,9 @@ def update_outside(n, pathname): def update_charts(n_intervals, pathname): wallet = unquote(pathname.lstrip('/')) - - block_df = reader.block_df # - worker_performace = reader.miner_sample_df - my_worker_performance = worker_performace[worker_performace.miner == wallet] + df = db_sync.db.fetch_data('performance') + my_worker_performance = df[df.miner == wallet] + my_worker_performance= my_worker_performance.sort_values('created') miner_performance_chart = px.line(my_worker_performance, x='created', @@ -200,29 +205,34 @@ def update_table(n_intervals, table, pathname): wallet = unquote(pathname.lstrip('/')) if wallet != 'Enter Your Address': - short_wallet = '{}...{}'.format(wallet[:5], wallet[-5:]) + short_wallet = '{}...{}'.format(wallet[:3], wallet[-5:]) else: short_wallet = wallet if table == 'workers': - df = reader.get_latest_worker_samples(False) - df = df[df.miner == wallet] - df = df.filter(['worker', 'hashrate', 'sharesPerSecond', 'Effort', 'TTF']) - df = df.rename(columns={"Effort": "Current Effort [%]", "hashrate": "MH/s", 'TTF': 'TTF [Days]'}) + df = db_sync.db.fetch_data('live_worker') + df = df[df.created == max(df.created)] + + df = df[df.miner == wallet] + df = df[df.worker != 'totals'] + df = df.filter(['worker', 'hashrate', 'sharesPerSecond', 'effort', 'ttf']) + df = df.rename(columns={"effort": "Current Effort [%]", "hashrate": "MH/s", 'ttf': 'TTF [Days]'}) title_2 = 'WORKER DATA' elif table == 'blocks': - block_df = reader.block_df # - my_block_df = block_df[block_df.miner == wallet] + block_df = db_sync.db.fetch_data('block') + my_block_df = block_df[block_df.miner == short_wallet] df = my_block_df print(df.columns) - df = df.filter(['Time Found', 'blockHeight', 'effort [%]', 'reward [erg]', 'Confirmation [%]']) + df['effort'] = 100 * df['effort'] + df = df.filter(['time_found', 'blockheight', 'effort', 'reward', 'confirmationprogress']) + df = df.rename(columns={'time_found': 'Time Found', 'blockheight': 'Height', + 'effort': 'Effort [%]', 'confirmationprogress': 'Confirmation [%]'}) title_2 = 'Your Blocks Found' columns = [{"name": i, "id": i} for i in df.columns] data = df.to_dict('records') - # print(first, second) return data, title_2 @@ -265,7 +275,7 @@ def get_layout(reader): {'label': 'Your Worker Data', 'value': 'workers'}, {'label': 'Your Block Data', 'value': 'blocks'} ], - value='workers', # Default value + value='blocks', # Default value style={'width': '300px', 'color': 'black'} ), style={'flex': '1'} diff --git a/price_data.csv b/price_data.csv new file mode 100644 index 00000000..c0c26e9e --- /dev/null +++ b/price_data.csv @@ -0,0 +1,2 @@ +,ergo,rosen-bridge,spectrum-finance +usd,1.26,0.081699,0.02817572 diff --git a/prototype.ipynb b/prototype.ipynb index 190d7dd7..36e69a02 100644 --- a/prototype.ipynb +++ b/prototype.ipynb @@ -3,739 +3,5337 @@ { "cell_type": "code", "execution_count": 1, - "id": "9e4f1413-71a8-4b4c-8ca7-ed6d5cd46f9e", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, + "id": "2f7ecc38-5e44-4bf6-b0f2-7bc3447737c2", + "metadata": {}, "outputs": [], "source": [ - "from utils.api_reader import SigmaWalletReader" + "from utils.db_util import PostgreSQLDatabase\n", + "from utils.api_reader import SigmaWalletReader\n", + "from datetime import datetime\n", + "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, - "id": "df7966d0-470e-40e6-9a89-a04f48d4233a", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: numpy in /home/whaleshark/miniconda3/lib/python3.12/site-packages (1.26.4)\n" - ] - } - ], - "source": [ - "!pip install numpy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9d97979d-020a-43d9-9f40-46114d65ceba", + "id": "d23a8542-7c68-42bb-a573-9fe902b78038", "metadata": {}, "outputs": [], "source": [ - "reader = SigmaWalletReader(config_path=\"../conf\")" + "def format_datetime(time_str):\n", + " # List of possible datetime formats to try\n", + " formats = [\n", + " \"%Y-%m-%dT%H:%M:%S.%fZ\", # datetime with microseconds and 'Z' timezone\n", + " \"%Y-%m-%dT%H:%M:%S\", # datetime without microseconds or timezone\n", + " \"%Y-%m-%dT%H:%M:%S%z\", # datetime with timezone offset\n", + " \"%Y-%m-%dT%H:%M:%SZ\" # datetime with 'Z' but without microseconds\n", + " ]\n", + " \n", + " # Attempt to parse the datetime string with each format\n", + " for fmt in formats:\n", + " try:\n", + " dt = datetime.strptime(time_str, fmt)\n", + " return dt.strftime(\"%Y-%m-%d %H:%M:%S\") # Converts to your desired format\n", + " except ValueError:\n", + " continue # Try the next format if the current one fails\n", + " \n", + " # If no format matches, raise an exception\n", + " raise ValueError(f\"Time data '{time_str}' does not match any expected format\")" ] }, { "cell_type": "code", - "execution_count": null, - "id": "29e42d9b-3327-46e2-b91e-7d10043950f6", + "execution_count": 3, + "id": "84c34201-a0a7-48cc-9c27-3c3382ae5d1e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "import numpy" + "database = PostgreSQLDatabase('marctheshark', 'password', 'localhost', 5432, 'mining-db')\n", + "database.connect()\n", + "database.get_cursor()" ] }, { "cell_type": "code", - "execution_count": null, - "id": "d86ed853-985b-40fc-8c89-1e2ea1f37ccd", + "execution_count": 4, + "id": "50b6c812-177b-469c-a4ec-fa75a165c5d2", "metadata": {}, "outputs": [], "source": [ - "data = reader.get_api_data('http://15.204.211.130:4000/api/pools/ErgoSigmanauts/miners/')\n", - "data" + "reader = SigmaWalletReader(config_path=\"../conf\")\n", + "reader.update_data()" ] }, { "cell_type": "code", - "execution_count": null, - "id": "372d7b7b-7723-4f53-9b66-1ad0848b4d1d", + "execution_count": 5, + "id": "18178c1c-da24-40d0-8cd1-4242cec9f48b", "metadata": {}, "outputs": [], "source": [ - "miner_ls = []\n", - "for sample in data:\n", - " miner_ls.append(sample['miner'])\n", - "\n", + "url = '{}/{}'.format(reader.base_api, 'blocks?pageSize=5000')\n", + "block_data = reader.get_api_data(url)\n", + "block_df = pd.DataFrame(block_data)\n", + "# block_df['rolling_effort'] =block_df['effort'].expanding().mean()\n", + "block_df = block_df.rename(columns={'created': 'time_found'})\n", + "block_df['time_found'] = [format_datetime(data) for data in block_df.time_found]\n", + "data = reader.data\n", "\n", - "miner_ls" + "# block_df = block_df.rename(columns={'Time Found': 'Time_Found', 'Rolling Effort' : 'Rolling_Effort',\n", + " # 'Confirmation [%]': 'Confirmation', 'reward [erg]': 'reward_erg', 'effort [%]': 'effort_percentage'})" ] }, { "cell_type": "code", - "execution_count": null, - "id": "3b4859c6-b30f-428c-b51a-fb99afdbbf26", + "execution_count": 6, + "id": "787e29f9-55ba-4c40-b839-b235bf91b5e3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'poolId': 'ErgoSigmanauts',\n", + " 'blockHeight': 1253410,\n", + " 'networkDifficulty': 354831.65524982265,\n", + " 'status': 'confirmed',\n", + " 'confirmationProgress': 1,\n", + " 'effort': 1.04586555676699,\n", + " 'transactionConfirmationData': '580c001f31e4fd3a',\n", + " 'reward': 27.0,\n", + " 'infoLink': 'https://explorer.ergoplatform.com/en/blocks/7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36fd366f626245429cec',\n", + " 'hash': '7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36fd366f626245429cec',\n", + " 'miner': '9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZSKz8K',\n", + " 'source': 'ErgoSigmanauts',\n", + " 'created': '2024-04-29T08:20:04.699821Z'}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "miners = {}\n", - "for sample in data:\n", - " miners[sample['miner']] = 0\n", - "for key in miners.keys():\n", - " url = '{}/{}'.format('http://15.204.211.130:4000/api/pools/ErgoSigmanauts/miners', key)\n", - " sample = reader.get_api_data(url)\n", - " miners[key] = sample['pendingShares']\n", - "miners" + "block_data[0]" ] }, { "cell_type": "code", - "execution_count": null, - "id": "4ddb876b-3406-43e6-bc1c-8de577282b07", + "execution_count": 7, + "id": "655255eb-a4ba-48ab-a137-1f70dc83b8e3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
poolIdblockHeightnetworkDifficultystatusconfirmationProgressefforttransactionConfirmationDatarewardinfoLinkhashminersourcetime_found
0ErgoSigmanauts1253410354831.655250confirmed11.045866580c001f31e4fd3a27.000000https://explorer.ergoplatform.com/en/blocks/7a...7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-29 08:20:04
1ErgoSigmanauts1253118362089.481987confirmed10.64787450239669e1ac4af827.000000https://explorer.ergoplatform.com/en/blocks/44...44167cd62e4406f726826b15a0fcf6e843fade6c445102...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-28 23:18:22
2ErgoSigmanauts1252956390351.076394confirmed10.11251757f9f469dba977c327.009200https://explorer.ergoplatform.com/en/blocks/d0...d009bdd64433367b30dcf2493ccfa43329d2383ca288b0...9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y...ErgoSigmanauts2024-04-28 17:16:48
3ErgoSigmanauts1252929390351.076394confirmed10.3130745016a01340d6b9ba27.653129https://explorer.ergoplatform.com/en/blocks/88...881144c4c46b08e39d59817863da508be56c215eafb8eb...9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN...ErgoSigmanauts2024-04-28 16:09:49
4ErgoSigmanauts1252840350627.704840confirmed10.96422857f1000efc558ff127.019200https://explorer.ergoplatform.com/en/blocks/93...9395fce740c65f238690a5639a2938e0bce75b8a28b065...9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE...ErgoSigmanauts2024-04-28 12:59:58
\n", + "
" + ], + "text/plain": [ + " poolId blockHeight networkDifficulty status \\\n", + "0 ErgoSigmanauts 1253410 354831.655250 confirmed \n", + "1 ErgoSigmanauts 1253118 362089.481987 confirmed \n", + "2 ErgoSigmanauts 1252956 390351.076394 confirmed \n", + "3 ErgoSigmanauts 1252929 390351.076394 confirmed \n", + "4 ErgoSigmanauts 1252840 350627.704840 confirmed \n", + "\n", + " confirmationProgress effort transactionConfirmationData reward \\\n", + "0 1 1.045866 580c001f31e4fd3a 27.000000 \n", + "1 1 0.647874 50239669e1ac4af8 27.000000 \n", + "2 1 0.112517 57f9f469dba977c3 27.009200 \n", + "3 1 0.313074 5016a01340d6b9ba 27.653129 \n", + "4 1 0.964228 57f1000efc558ff1 27.019200 \n", + "\n", + " infoLink \\\n", + "0 https://explorer.ergoplatform.com/en/blocks/7a... \n", + "1 https://explorer.ergoplatform.com/en/blocks/44... \n", + "2 https://explorer.ergoplatform.com/en/blocks/d0... \n", + "3 https://explorer.ergoplatform.com/en/blocks/88... \n", + "4 https://explorer.ergoplatform.com/en/blocks/93... \n", + "\n", + " hash \\\n", + "0 7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36... \n", + "1 44167cd62e4406f726826b15a0fcf6e843fade6c445102... \n", + "2 d009bdd64433367b30dcf2493ccfa43329d2383ca288b0... \n", + "3 881144c4c46b08e39d59817863da508be56c215eafb8eb... \n", + "4 9395fce740c65f238690a5639a2938e0bce75b8a28b065... \n", + "\n", + " miner source \\\n", + "0 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "1 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "2 9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y... ErgoSigmanauts \n", + "3 9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN... ErgoSigmanauts \n", + "4 9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE... ErgoSigmanauts \n", + "\n", + " time_found \n", + "0 2024-04-29 08:20:04 \n", + "1 2024-04-28 23:18:22 \n", + "2 2024-04-28 17:16:48 \n", + "3 2024-04-28 16:09:49 \n", + "4 2024-04-28 12:59:58 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Total of all values\n", - "total = sum(miners.values())\n", - "\n", - "# Assume a reward variable, say 10000 for this example\n", - "reward = 30\n", - "\n", - "# Calculate the percentage for each key based on its value and then determine the reward based on this percentage\n", - "rewards = {key: (value / total) * reward for key, value in miners.items()}\n", - "\n", - "rewards" + "block_df.head()" ] }, { "cell_type": "code", - "execution_count": null, - "id": "81777f3c-f7e5-4b00-a4da-188afd812e8d", + "execution_count": 8, + "id": "ed86fefd-3c5b-46d4-83c4-cd0f5ef80a48", "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "rewards_df = pd.DataFrame(list(rewards.items()), columns=['miner', 'reward'])\n", - "rewards_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "948b1fe5-cce7-4184-94f8-f695cbab4ea0", - "metadata": { - "scrolled": true - }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['poolId', 'blockHeight', 'networkDifficulty', 'status',\n", + " 'confirmationProgress', 'effort', 'transactionConfirmationData',\n", + " 'reward', 'infoLink', 'hash', 'miner', 'source', 'time_found'],\n", + " dtype='object')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "url = 'http://15.204.211.130:4000/api/pools/ErgoSigmanauts/miners/9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk'\n", - "data = reader.get_api_data(url)\n", - "samples = data['performanceSamples']\n", - "samples" + "block_df.columns" ] }, { "cell_type": "code", - "execution_count": null, - "id": "789f6800-f713-4c1a-ad75-add4bab19249", + "execution_count": 9, + "id": "448fe191-98eb-4b12-afe3-5085d9a33111", "metadata": {}, "outputs": [], "source": [ - "df = reader.get_miner_samples(wallet='9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk')" + "block_cols = ['poolId VARCHAR(255)',\n", + " 'blockHeight INTEGER',\n", + " 'networkDifficulty NUMERIC',\n", + " 'status VARCHAR(255)',\n", + " 'confirmationProgress NUMERIC',\n", + " 'effort NUMERIC',\n", + " 'transactionConfirmationData VARCHAR(255)',\n", + " 'reward NUMERIC', \n", + " 'infoLink VARCHAR(255)',\n", + " 'hash VARCHAR(255)', \n", + " 'miner VARCHAR(255)',\n", + " 'source VARCHAR(255)',\n", + " 'time_found TIMESTAMP',]" ] }, { "cell_type": "code", - "execution_count": null, - "id": "00445d3a-4718-47e0-8eda-26b9fd3ed2be", + "execution_count": 10, + "id": "966694da-50b5-4532-8200-84740a5ac648", "metadata": {}, "outputs": [], "source": [ - "df.empty" + "data_cols = [\n", + " 'fee NUMERIC', # Numeric type for precision\n", + " 'paid NUMERIC', # Numeric type for decimal values\n", + " 'blocks INTEGER', # Integer value for block counts\n", + " 'last_block_found TIMESTAMP', # Timestamp for dates, assuming proper conversion before storage\n", + " 'enabled BOOLEAN', # Boolean type for true/false\n", + " 'minimumPayment NUMERIC', # Numeric type for precision of payments\n", + " 'payoutScheme VARCHAR(255)', # String type for defined payout schemes\n", + " 'connectedMiners INTEGER', # Integer for counting connected miners\n", + " 'poolHashrate NUMERIC', # Numeric type for decimal values\n", + " 'sharesPerSecond NUMERIC', # Numeric type for decimal values\n", + " 'networkType VARCHAR(50)', # String type for network types\n", + " 'networkHashrate NUMERIC', # Numeric type for hash rates\n", + " 'networkDifficulty NUMERIC', # Numeric type for network difficulty\n", + " 'lastNetworkBlockTime TIMESTAMP', # Timestamp for block times\n", + " 'blockHeight INTEGER', # Integer for block height values\n", + " 'connectedPeers INTEGER', # Integer for counting connected peers\n", + " 'rewardType VARCHAR(50)', # String type for reward types\n", + " 'poolEffort NUMERIC', # Numeric type for pool effort\n", + " 'poolTTF NUMERIC', # Numeric type for pool time to find\n", + " # 'db_timestamp TIMESTAMP' # Timestamp for the exact time data was recorded\n", + "]" ] }, { "cell_type": "code", - "execution_count": null, - "id": "78c58501-c375-412c-a9b7-562b77faa88d", + "execution_count": 11, + "id": "b2bef5c1-f8df-4a4b-9a6b-a1af07d5af98", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'fee': 0.9,\n", + " 'paid': 1637.626309487606,\n", + " 'blocks': 60,\n", + " 'last_block_found': 'Monday, April 29, 2024 at 08:20:04 AM',\n", + " 'enabled': True,\n", + " 'minimumPayment': 0.5,\n", + " 'payoutScheme': 'PPLNS',\n", + " 'connectedMiners': 39,\n", + " 'poolHashrate': 58.17,\n", + " 'sharesPerSecond': 4,\n", + " 'networkType': 'mainnet',\n", + " 'networkHashrate': 13.741712072157867,\n", + " 'networkDifficulty': 1.649005448658944,\n", + " 'lastNetworkBlockTime': '2024-04-29T19:50:07.5828661Z',\n", + " 'blockHeight': 1253767,\n", + " 'connectedPeers': 109,\n", + " 'rewardType': 'POW',\n", + " 'poolEffort': 146.441,\n", + " 'poolTTF': 0.328}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "d = {'a': [1], \n", - " 'b': [2]}\n", - "pd.DataFrame.from_dict(d)" + "# data['db_timestamp'] = datetime.datetime.now()\n", + "del data['payoutSchemeConfig']\n", + "del data['extra']\n", + "data" ] }, { "cell_type": "code", "execution_count": null, - "id": "e1020365-7984-4708-a8d4-1cdc35e27ce1", + "id": "09a93c62-aee4-491d-9275-874a47982676", "metadata": {}, "outputs": [], - "source": [ - "import plotly.express as px\n", - "\n", - "fig = px.line(df, x='created', y='hashrate', color='worker', title='Hashrate Over Time for Each Worker')\n", - "fig.show()\n" - ] + "source": [] }, { "cell_type": "code", - "execution_count": null, - "id": "552e7636-5ab0-42fc-a9bf-1c1e0a172e4f", + "execution_count": 12, + "id": "648f4cbe-d870-4c0d-80d5-34ddf39ea83b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Table data deleted successfully.\n", + "Table block deleted successfully.\n" + ] + } + ], "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import random\n", - "\n", - "def generate_random_variable_list(n):\n", - " random_variable_list = []\n", - " for i in range(n):\n", - " random_variable = random.uniform(0.001, 5)\n", - " random_variable_list.append(random_variable)\n", - " return random_variable_list\n", + "database.delete_table('data')\n", + "database.delete_table('block')\n", "\n", - "n = 10 # number of random variables\n", - "y = generate_random_variable_list(n)\n", - "\n", - "x = [*range(0, n)]\n", - "\n", - "df = pd.DataFrame({'x': x, 'y':y})\n", - "df['z'] = df['y'].expanding().mean()\n", - "\n", - "\n", - "plt.plot(df['x'], df['y'], label='y')\n", - "plt.plot(df['x'], df['z'], label='z')\n", - "plt.xlabel('x')\n", - "plt.ylabel('y and z')\n", - "plt.title('Plotting y and z over x')\n", - "plt.legend()\n", - "plt.show()" + "database.create_table('data', data_cols)\n", + "database.create_table('block', block_cols)\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "fd16a61e-1eb9-48d3-9d6f-ae5aba2e6df6", + "execution_count": 13, + "id": "42021f22-82c1-4de4-9acc-48dedc466bb3", "metadata": {}, "outputs": [], "source": [ - "df" + "database.insert_data('data', data)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "b29d277d-0d5f-4eb8-9951-ef4897d557c9", + "execution_count": 14, + "id": "de4677b4-aacc-4c81-bf39-d07c441c3ced", "metadata": {}, - "outputs": [], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "46455eb2-b42c-4882-95c1-fea1fe41b897", - "metadata": {}, - "outputs": [], - "source": [ - "n = df.melt(id_vars=['x'])\n", - "n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9a878db0-d159-4318-98c7-533574ddafed", - "metadata": {}, - "outputs": [], - "source": [ - "random.randrange(0,5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "875331c5-c3b2-4d58-a517-7b4e25378622", - "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/whaleshark/Documents/sigmanaut-mining-pool-ui/utils/db_util.py:176: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " return pd.read_sql_query(query, self.conn)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
feepaidblockslast_block_foundenabledminimumpaymentpayoutschemeconnectedminerspoolhashratesharespersecondnetworktypenetworkhashratenetworkdifficultylastnetworkblocktimeblockheightconnectedpeersrewardtypepooleffortpoolttf
00.91637.626309602024-04-29 08:20:04True0.5PPLNS3958.174.0mainnet13.7417121.6490052024-04-29 19:50:07.5828661253767109POW146.4410.328
\n", + "
" + ], + "text/plain": [ + " fee paid blocks last_block_found enabled minimumpayment \\\n", + "0 0.9 1637.626309 60 2024-04-29 08:20:04 True 0.5 \n", + "\n", + " payoutscheme connectedminers poolhashrate sharespersecond networktype \\\n", + "0 PPLNS 39 58.17 4.0 mainnet \n", + "\n", + " networkhashrate networkdifficulty lastnetworkblocktime blockheight \\\n", + "0 13.741712 1.649005 2024-04-29 19:50:07.582866 1253767 \n", + "\n", + " connectedpeers rewardtype pooleffort poolttf \n", + "0 109 POW 146.441 0.328 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "url ='http://15.204.211.130:4000/api/pools/ErgoSigmanauts'\n", - "\n", - "pool = reader.get_api_data(url)['pool']\n", - "pool.keys()" + "database.fetch_data('data')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "f9ea973a-0471-4330-af72-a6388acc59e2", - "metadata": {}, + "execution_count": 15, + "id": "87504df7-41a7-4239-bf81-cacbf9525ac0", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "pool['poolEffort']" + "for index, row in block_df.iterrows():\n", + " database.insert_data('block', row.to_dict())\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "04a2a4a7-219a-460a-aa59-20f3dee6b6cf", - "metadata": {}, - "outputs": [], + "execution_count": 16, + "id": "bf955300-ebca-4f0f-aa1b-59b1f4753e3f", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/whaleshark/Documents/sigmanaut-mining-pool-ui/utils/db_util.py:176: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " return pd.read_sql_query(query, self.conn)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
poolidblockheightnetworkdifficultystatusconfirmationprogressefforttransactionconfirmationdatarewardinfolinkhashminersourcetime_found
0ErgoSigmanauts1253410354831.655250confirmed1.01.045866580c001f31e4fd3a27.000000https://explorer.ergoplatform.com/en/blocks/7a...7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-29 08:20:04
1ErgoSigmanauts1253118362089.481987confirmed1.00.64787450239669e1ac4af827.000000https://explorer.ergoplatform.com/en/blocks/44...44167cd62e4406f726826b15a0fcf6e843fade6c445102...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-28 23:18:22
2ErgoSigmanauts1252956390351.076394confirmed1.00.11251757f9f469dba977c327.009200https://explorer.ergoplatform.com/en/blocks/d0...d009bdd64433367b30dcf2493ccfa43329d2383ca288b0...9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y...ErgoSigmanauts2024-04-28 17:16:48
3ErgoSigmanauts1252929390351.076394confirmed1.00.3130745016a01340d6b9ba27.653129https://explorer.ergoplatform.com/en/blocks/88...881144c4c46b08e39d59817863da508be56c215eafb8eb...9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN...ErgoSigmanauts2024-04-28 16:09:49
4ErgoSigmanauts1252840350627.704840confirmed1.00.96422857f1000efc558ff127.019200https://explorer.ergoplatform.com/en/blocks/93...9395fce740c65f238690a5639a2938e0bce75b8a28b065...9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE...ErgoSigmanauts2024-04-28 12:59:58
5ErgoSigmanauts1252559422881.658950confirmed1.00.01770056dcc160776a8a7127.022100https://explorer.ergoplatform.com/en/blocks/f1...f12b63d2743427539774bdc9f76bb207fa7a82b659cfa4...9hSk13XDU8keWAp3KxKSgUVCkfDcw577jAjM6SgbRpuYeL...ErgoSigmanauts2024-04-28 03:06:52
6ErgoSigmanauts1252553422881.658950confirmed1.01.85688250230ed620a8fa0b27.000000https://explorer.ergoplatform.com/en/blocks/9d...9d7544bf89b699e7d31eaf49c4b8610d62d6545c1de9d2...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-28 02:55:03
7ErgoSigmanauts1251978380358.285885confirmed1.00.11252550a300044822864227.001000https://explorer.ergoplatform.com/en/blocks/58...58be0effcc39dc7fc6bbc745acfd627ff3e30eab98668c...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-27 07:59:45
8ErgoSigmanauts1251939366775.443497confirmed1.00.244779502468dac362205227.018200https://explorer.ergoplatform.com/en/blocks/a4...a4dc120a4aa17097a163160eeb41c3dba31780f4086491...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-27 06:54:45
9ErgoSigmanauts1251871366775.443497confirmed1.01.03993150d8fd9c81187de227.008800https://explorer.ergoplatform.com/en/blocks/2b...2be39f033f12f55638a0e9a8755b7f96b73d15b948990c...9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y...ErgoSigmanauts2024-04-27 04:31:16
10ErgoSigmanauts1251567388383.156547confirmed1.00.261117555f000b343364e427.005100https://explorer.ergoplatform.com/en/blocks/f8...f826ef482455161ca689de707f3c239b3ca8a6e7360a2c...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-26 18:24:58
11ErgoSigmanauts1251499388383.156547confirmed1.06.396079507971cae2ee4a1827.004200https://explorer.ergoplatform.com/en/blocks/c7...c7c63f408c339ae4482914cbb8e93ad48b17defd20ec90...9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd...ErgoSigmanauts2024-04-26 16:00:40
12ErgoSigmanauts1249527315887.249576confirmed1.00.34152750164a42c64cc4f127.015100https://explorer.ergoplatform.com/en/blocks/4f...4fea81e1a1a823f1c395a7d0757208381c9f6da4f68b83...9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN...ErgoSigmanauts2024-04-23 22:19:10
13ErgoSigmanauts1249440315887.249576confirmed1.00.01921650187b62b18da53527.010000https://explorer.ergoplatform.com/en/blocks/22...224c94abcd0ffa48553f6988c34bcb92c2490e76861f1c...9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu...ErgoSigmanauts2024-04-23 19:17:03
14ErgoSigmanauts1249432315887.249576confirmed1.00.6392275057d49b44b4ed2127.012200https://explorer.ergoplatform.com/en/blocks/ac...acb0c18d072bc0fc0d0e69e95cb07ba996b53ef0ac669a...9eZVqXVnrVWQKK19b7E7kp4ZyNqanp2z1mpKUJRaouNsme...ErgoSigmanauts2024-04-23 19:06:49
15ErgoSigmanauts1249230361687.597350confirmed1.01.2624301bdb3e4628f615be27.006300https://explorer.ergoplatform.com/en/blocks/2f...2f38ffbece540e4177f81615ad3130929dbf1855fcccff...9ggYKoC58jQkbGNhCKqcLMsuK3qCE5ieqTPx28KrY5jJ5S...ErgoSigmanauts2024-04-23 12:18:50
16ErgoSigmanauts1248838426627.604763confirmed1.00.351294186e549eb8340f1227.034400https://explorer.ergoplatform.com/en/blocks/17...177fd26d67b248b8fa2b0f734be71628114fa12249403a...9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC...ErgoSigmanauts2024-04-22 22:07:16
17ErgoSigmanauts1248716402639.913195confirmed1.00.6859161c96000783680ce227.008244https://explorer.ergoplatform.com/en/blocks/5f...5f999a0dbbaef1e2202acaa7a9c1dbea3cbcc7926dd9c8...9f5vwtxyRP87wmc8ezyKbL7ryaNhDrgWUVBEZpQKnw16SW...ErgoSigmanauts2024-04-22 18:11:34
18ErgoSigmanauts1248443380709.272335confirmed1.01.001987188b8a2690b7756927.007400https://explorer.ergoplatform.com/en/blocks/2c...2c43ae9a107e279e6aaf50ddda74652235cddc42d7f7e6...9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu...ErgoSigmanauts2024-04-22 09:12:21
19ErgoSigmanauts1248031396231.066521confirmed1.00.1612051c1800034e77b16627.001960https://explorer.ergoplatform.com/en/blocks/92...92e5d017e11243bae0295199fdab7b8b08ccb9363228ee...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-21 18:58:55
20ErgoSigmanauts1247949334193.979483confirmed1.00.0949271bf4a728749d7de827.001000https://explorer.ergoplatform.com/en/blocks/9a...9a9c4c8fbd571a877a7f197e40c4d33d265307b23634ad...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-21 16:57:09
21ErgoSigmanauts1247906334193.979483confirmed1.00.6902871a16000df545608327.026500https://explorer.ergoplatform.com/en/blocks/2e...2e086f5d1d55e2476586f0ae72caeb77d0093c2faef6c4...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-21 15:49:03
22ErgoSigmanauts1247634390680.078087confirmed1.03.0398631a1329402f2206ed27.069355https://explorer.ergoplatform.com/en/blocks/c7...c7b7ef3a8c7af63a7729de240de056beff246f9d99aebd...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-21 05:49:18
23ErgoSigmanauts1246555371421.349703confirmed1.00.53527512fc6a2219199f2a27.012000https://explorer.ergoplatform.com/en/blocks/40...40823fa0c172fc5f3a8ebcc79f8557f776d502abeceff0...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-19 17:13:40
24ErgoSigmanauts1246329338457.841118confirmed1.00.0333131642835a069e4fb927.025700https://explorer.ergoplatform.com/en/blocks/32...3255824876c9afc17a051e4fec4f2fb9a502d91a31d60e...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-19 10:06:26
25ErgoSigmanauts1246316338457.841118confirmed1.00.072236146857274f45ac2c27.180640https://explorer.ergoplatform.com/en/blocks/02...023d3db990a609673fb2143fdfd110f959928864ee5ba0...9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd...ErgoSigmanauts2024-04-19 09:41:15
26ErgoSigmanauts1246282338457.841118confirmed1.02.084016164237aca8296f1c27.012601https://explorer.ergoplatform.com/en/blocks/b2...b25a01e4b603f883cbe139725e8377ea798ef7bf5e5ffb...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-19 08:45:52
27ErgoSigmanauts1245573345942.822277confirmed1.00.11677212a8cc865d1eb6b127.001253https://explorer.ergoplatform.com/en/blocks/b3...b3dc77df25368a64370eba7b7e0f2392e5a9c3fe4cd297...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-04-18 09:31:37
28ErgoSigmanauts1245528323130.127436confirmed1.00.361345126a0007f2a34c7c27.000000https://explorer.ergoplatform.com/en/blocks/2d...2d2fd8c12850c9f1a00c38aa79aba813554f7a383c4be6...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-18 08:01:31
29ErgoSigmanauts1245375343213.854779confirmed1.00.384602126b001c1226e66627.004100https://explorer.ergoplatform.com/en/blocks/d0...d0b39e75edf0099c62ce1fc97bef7dd51695659255ec7f...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-18 03:11:44
30ErgoSigmanauts1245219385248.184230confirmed1.01.361363123200132a4f005327.001000https://explorer.ergoplatform.com/en/blocks/32...32df796eeeeb916349df58e3263011fc13e2064202638d...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-17 21:39:45
31ErgoSigmanauts1244611350337.673747confirmed1.00.30406013309b8b1531ac3d27.004400https://explorer.ergoplatform.com/en/blocks/4a...4ac405b82c909606840b4abb83acd42e79aa74ac9dfcfa...9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4...ErgoSigmanauts2024-04-17 01:03:11
32ErgoSigmanauts1244487347763.784750confirmed1.02.109182126b0037bf192dd927.004000https://explorer.ergoplatform.com/en/blocks/79...7994b89a991f3a3589d54772c4e30437894c691aa0dfd6...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-16 20:53:07
33ErgoSigmanauts1243556346496.758155confirmed1.00.384074121c61dad76dde6427.002200https://explorer.ergoplatform.com/en/blocks/d5...d51a06c21ece88a1935e2eca6a3d1ba1e82507dc7cb114...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-15 13:26:36
34ErgoSigmanauts1243309317174.205629confirmed1.00.4703621232000391a2d9da27.009000https://explorer.ergoplatform.com/en/blocks/d3...d37d915b800e4b8fce3eb97ace72d1b8ecf1c35eecbf52...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-15 05:58:59
35ErgoSigmanauts1243018353518.612001confirmed1.00.517238124d61659aa64c7a27.076500https://explorer.ergoplatform.com/en/blocks/a8...a8134a002699294a2cb40e3f4eb3603ede1bdcae3cd0de...9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC...ErgoSigmanauts2024-04-14 19:46:29
36ErgoSigmanauts1242682379295.328612confirmed1.01.39456112200009ea03884927.017500https://explorer.ergoplatform.com/en/blocks/2c...2c36f7618aef25e20373b4832dbbdc6f95784909a40218...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-14 07:53:57
37ErgoSigmanauts1241796370202.405388confirmed1.01.98051410c71b4fad01f31c27.052025https://explorer.ergoplatform.com/en/blocks/39...3951d2d140cca3c5138162008137ea4c703f1cdc4a16c2...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-13 01:40:15
38ErgoSigmanauts1240237406987.879722confirmed1.00.156104100fe6c78281bfae27.130969https://explorer.ergoplatform.com/en/blocks/c0...c0e3620bcbce50d12b892ec9c42106e803157d14bcfc96...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-10 21:52:48
39ErgoSigmanauts1240101411836.853619confirmed1.00.17779310da0014d0866a1a27.006200https://explorer.ergoplatform.com/en/blocks/10...106552ecd414d016d00bb6aac33233b40e0de0e96752ad...9f7851wUuymT3jiaaFQ5Uv3QUmCHsahCR43syFbc1nDRSH...ErgoSigmanauts2024-04-10 16:45:58
40ErgoSigmanauts1239922414752.684611confirmed1.00.37917010111463352887a327.001100https://explorer.ergoplatform.com/en/blocks/db...db56d46b7963b5dd508c2bdb1507303c8263e6ccad1b47...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-10 11:38:14
41ErgoSigmanauts1239612395105.076364confirmed1.01.27033110c7e206ff3da33e27.029100https://explorer.ergoplatform.com/en/blocks/c0...c006a33b7d2f4a4019919c278f5429608902fe3e51b1e1...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-09 23:57:08
42ErgoSigmanauts1238592386279.122336confirmed1.00.60845910c72dc2ea84ee3e27.002000https://explorer.ergoplatform.com/en/blocks/91...915a48e58976142360cc5233b6033ad2a3e2f06cda7dc1...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-08 14:35:09
43ErgoSigmanauts1238040399941.963788confirmed1.01.240973101010806c3bfec230.005000https://explorer.ergoplatform.com/en/blocks/ed...edd2c6e48ef6cc480c95a58dcb24c4125c1136d7aa4c22...9eZPTmn8zp5GJ7KZwTo8cEuxNdezWaY3hBbLeWid7EAZed...ErgoSigmanauts2024-04-07 19:55:43
44ErgoSigmanauts1236735385434.149366confirmed1.00.675790100d40c8c30375f930.025167https://explorer.ergoplatform.com/en/blocks/f4...f49ecdd5eff7e5d0d05d0eb65c7818f31fcd82ebf5df86...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-06 00:11:43
45ErgoSigmanauts1235990387916.169692confirmed1.00.52528620058216259db39230.010000https://explorer.ergoplatform.com/en/blocks/bd...bd3099462e5eba95a4e8e809232f6788f2664e4a344eae...9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq...ErgoSigmanauts2024-04-04 23:46:44
46ErgoSigmanauts1235365466883.931372confirmed1.00.169038d0db3663848642f530.068900https://explorer.ergoplatform.com/en/blocks/00...000eacceb597c08feeb2a67ea6f0b804d9dc185c0e0630...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-04 01:40:19
47ErgoSigmanauts1235136433886.497034confirmed1.00.348562d4481db8a168230330.007660https://explorer.ergoplatform.com/en/blocks/ba...babafdf183a977d3ef1cf8823f241e3393ac0472f9a00e...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-03 18:22:18
48ErgoSigmanauts1234733425282.536901confirmed1.01.926869d43cfb8db6bde05730.008316https://explorer.ergoplatform.com/en/blocks/85...85775b03bae1f4c46c3b444bd511838d5fb9cd326c8462...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-04-03 04:57:28
49ErgoSigmanauts1232662385380.245572confirmed1.00.025904d88e000ab46f7e8a30.000000https://explorer.ergoplatform.com/en/blocks/bf...bfce9fe97cbc219e80858ee257f664fd3ad9ff713ed12c...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-31 07:40:29
50ErgoSigmanauts1232628363957.496239confirmed1.00.237322d10ffd6af9eca40630.000000https://explorer.ergoplatform.com/en/blocks/48...48044bb6835294495eb17744326b63f3183a629ab44767...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-03-31 06:53:18
51ErgoSigmanauts1232487360630.583506confirmed1.01.012745dee5be1bf40de25e30.013800https://explorer.ergoplatform.com/en/blocks/0f...0f56bc5a2f2b9f179c81feeab3022723bc60df72ad4121...9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq...ErgoSigmanauts2024-03-31 02:11:27
52ErgoSigmanauts1231651367785.409859confirmed1.00.466819daa5cc820eedd3d930.001500https://explorer.ergoplatform.com/en/blocks/20...20b806d4bd9cc58f6cc04ffdeaffd6e68c07f66e422e78...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-29 22:22:38
53ErgoSigmanauts1231144405099.842403confirmed1.00.329434d88f00142c1483c130.002000https://explorer.ergoplatform.com/en/blocks/27...278a4a533165aa5c63f8f79bb8a1ab9d29e1a62d254139...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-29 04:26:22
54ErgoSigmanauts1230782360986.500966confirmed1.00.030553d00cd5ba5f2b167c30.088260https://explorer.ergoplatform.com/en/blocks/33...3360f32693fd991c229e6a3b095eb2ff6e0367dcbac370...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-03-28 16:41:02
55ErgoSigmanauts1230749360986.500966confirmed1.00.287231d8a48cee009b608c30.006550https://explorer.ergoplatform.com/en/blocks/2e...2e2b04e088834393eafa5aac17d0fc641f4a188d6dc873...9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4...ErgoSigmanauts2024-03-28 15:40:37
56ErgoSigmanauts1230547434381.378191confirmed1.00.797385d6c1191549ab2f0730.027600https://explorer.ergoplatform.com/en/blocks/c5...c5886b3606b842b4a0ecaeda2d6270ac3238e7e0da37d2...9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw...ErgoSigmanauts2024-03-28 08:26:49
57ErgoSigmanauts1230104347635.796935confirmed1.04.752955d153e8105c7c0b5730.001000https://explorer.ergoplatform.com/en/blocks/b0...b03937a8404d47fed3d7050a93a6e6b940100e4c008a66...9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw...ErgoSigmanauts2024-03-27 18:07:25
58ErgoSigmanauts1223980416310.690227confirmed1.00.895507300b000932aead3a30.007862https://explorer.ergoplatform.com/en/blocks/83...83c740633d4aa9e61775dcab0d2ef20dd4d11c275424fa...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-03-19 04:19:20
59ErgoSigmanauts1221911421209.622611confirmed1.02.867494705c89a6a4e552cf30.007100https://explorer.ergoplatform.com/en/blocks/47...47dd2792f0fd255fc8fc4b0a12903b351245fb7083ea5e...9iQS22vfWdF2N84Lvv9jgAMFGLyL7t17SWbHGEfaddaG7Z...ErgoSigmanauts2024-03-16 06:45:27
\n", + "
" + ], + "text/plain": [ + " poolid blockheight networkdifficulty status \\\n", + "0 ErgoSigmanauts 1253410 354831.655250 confirmed \n", + "1 ErgoSigmanauts 1253118 362089.481987 confirmed \n", + "2 ErgoSigmanauts 1252956 390351.076394 confirmed \n", + "3 ErgoSigmanauts 1252929 390351.076394 confirmed \n", + "4 ErgoSigmanauts 1252840 350627.704840 confirmed \n", + "5 ErgoSigmanauts 1252559 422881.658950 confirmed \n", + "6 ErgoSigmanauts 1252553 422881.658950 confirmed \n", + "7 ErgoSigmanauts 1251978 380358.285885 confirmed \n", + "8 ErgoSigmanauts 1251939 366775.443497 confirmed \n", + "9 ErgoSigmanauts 1251871 366775.443497 confirmed \n", + "10 ErgoSigmanauts 1251567 388383.156547 confirmed \n", + "11 ErgoSigmanauts 1251499 388383.156547 confirmed \n", + "12 ErgoSigmanauts 1249527 315887.249576 confirmed \n", + "13 ErgoSigmanauts 1249440 315887.249576 confirmed \n", + "14 ErgoSigmanauts 1249432 315887.249576 confirmed \n", + "15 ErgoSigmanauts 1249230 361687.597350 confirmed \n", + "16 ErgoSigmanauts 1248838 426627.604763 confirmed \n", + "17 ErgoSigmanauts 1248716 402639.913195 confirmed \n", + "18 ErgoSigmanauts 1248443 380709.272335 confirmed \n", + "19 ErgoSigmanauts 1248031 396231.066521 confirmed \n", + "20 ErgoSigmanauts 1247949 334193.979483 confirmed \n", + "21 ErgoSigmanauts 1247906 334193.979483 confirmed \n", + "22 ErgoSigmanauts 1247634 390680.078087 confirmed \n", + "23 ErgoSigmanauts 1246555 371421.349703 confirmed \n", + "24 ErgoSigmanauts 1246329 338457.841118 confirmed \n", + "25 ErgoSigmanauts 1246316 338457.841118 confirmed \n", + "26 ErgoSigmanauts 1246282 338457.841118 confirmed \n", + "27 ErgoSigmanauts 1245573 345942.822277 confirmed \n", + "28 ErgoSigmanauts 1245528 323130.127436 confirmed \n", + "29 ErgoSigmanauts 1245375 343213.854779 confirmed \n", + "30 ErgoSigmanauts 1245219 385248.184230 confirmed \n", + "31 ErgoSigmanauts 1244611 350337.673747 confirmed \n", + "32 ErgoSigmanauts 1244487 347763.784750 confirmed \n", + "33 ErgoSigmanauts 1243556 346496.758155 confirmed \n", + "34 ErgoSigmanauts 1243309 317174.205629 confirmed \n", + "35 ErgoSigmanauts 1243018 353518.612001 confirmed \n", + "36 ErgoSigmanauts 1242682 379295.328612 confirmed \n", + "37 ErgoSigmanauts 1241796 370202.405388 confirmed \n", + "38 ErgoSigmanauts 1240237 406987.879722 confirmed \n", + "39 ErgoSigmanauts 1240101 411836.853619 confirmed \n", + "40 ErgoSigmanauts 1239922 414752.684611 confirmed \n", + "41 ErgoSigmanauts 1239612 395105.076364 confirmed \n", + "42 ErgoSigmanauts 1238592 386279.122336 confirmed \n", + "43 ErgoSigmanauts 1238040 399941.963788 confirmed \n", + "44 ErgoSigmanauts 1236735 385434.149366 confirmed \n", + "45 ErgoSigmanauts 1235990 387916.169692 confirmed \n", + "46 ErgoSigmanauts 1235365 466883.931372 confirmed \n", + "47 ErgoSigmanauts 1235136 433886.497034 confirmed \n", + "48 ErgoSigmanauts 1234733 425282.536901 confirmed \n", + "49 ErgoSigmanauts 1232662 385380.245572 confirmed \n", + "50 ErgoSigmanauts 1232628 363957.496239 confirmed \n", + "51 ErgoSigmanauts 1232487 360630.583506 confirmed \n", + "52 ErgoSigmanauts 1231651 367785.409859 confirmed \n", + "53 ErgoSigmanauts 1231144 405099.842403 confirmed \n", + "54 ErgoSigmanauts 1230782 360986.500966 confirmed \n", + "55 ErgoSigmanauts 1230749 360986.500966 confirmed \n", + "56 ErgoSigmanauts 1230547 434381.378191 confirmed \n", + "57 ErgoSigmanauts 1230104 347635.796935 confirmed \n", + "58 ErgoSigmanauts 1223980 416310.690227 confirmed \n", + "59 ErgoSigmanauts 1221911 421209.622611 confirmed \n", + "\n", + " confirmationprogress effort transactionconfirmationdata reward \\\n", + "0 1.0 1.045866 580c001f31e4fd3a 27.000000 \n", + "1 1.0 0.647874 50239669e1ac4af8 27.000000 \n", + "2 1.0 0.112517 57f9f469dba977c3 27.009200 \n", + "3 1.0 0.313074 5016a01340d6b9ba 27.653129 \n", + "4 1.0 0.964228 57f1000efc558ff1 27.019200 \n", + "5 1.0 0.017700 56dcc160776a8a71 27.022100 \n", + "6 1.0 1.856882 50230ed620a8fa0b 27.000000 \n", + "7 1.0 0.112525 50a3000448228642 27.001000 \n", + "8 1.0 0.244779 502468dac3622052 27.018200 \n", + "9 1.0 1.039931 50d8fd9c81187de2 27.008800 \n", + "10 1.0 0.261117 555f000b343364e4 27.005100 \n", + "11 1.0 6.396079 507971cae2ee4a18 27.004200 \n", + "12 1.0 0.341527 50164a42c64cc4f1 27.015100 \n", + "13 1.0 0.019216 50187b62b18da535 27.010000 \n", + "14 1.0 0.639227 5057d49b44b4ed21 27.012200 \n", + "15 1.0 1.262430 1bdb3e4628f615be 27.006300 \n", + "16 1.0 0.351294 186e549eb8340f12 27.034400 \n", + "17 1.0 0.685916 1c96000783680ce2 27.008244 \n", + "18 1.0 1.001987 188b8a2690b77569 27.007400 \n", + "19 1.0 0.161205 1c1800034e77b166 27.001960 \n", + "20 1.0 0.094927 1bf4a728749d7de8 27.001000 \n", + "21 1.0 0.690287 1a16000df5456083 27.026500 \n", + "22 1.0 3.039863 1a1329402f2206ed 27.069355 \n", + "23 1.0 0.535275 12fc6a2219199f2a 27.012000 \n", + "24 1.0 0.033313 1642835a069e4fb9 27.025700 \n", + "25 1.0 0.072236 146857274f45ac2c 27.180640 \n", + "26 1.0 2.084016 164237aca8296f1c 27.012601 \n", + "27 1.0 0.116772 12a8cc865d1eb6b1 27.001253 \n", + "28 1.0 0.361345 126a0007f2a34c7c 27.000000 \n", + "29 1.0 0.384602 126b001c1226e666 27.004100 \n", + "30 1.0 1.361363 123200132a4f0053 27.001000 \n", + "31 1.0 0.304060 13309b8b1531ac3d 27.004400 \n", + "32 1.0 2.109182 126b0037bf192dd9 27.004000 \n", + "33 1.0 0.384074 121c61dad76dde64 27.002200 \n", + "34 1.0 0.470362 1232000391a2d9da 27.009000 \n", + "35 1.0 0.517238 124d61659aa64c7a 27.076500 \n", + "36 1.0 1.394561 12200009ea038849 27.017500 \n", + "37 1.0 1.980514 10c71b4fad01f31c 27.052025 \n", + "38 1.0 0.156104 100fe6c78281bfae 27.130969 \n", + "39 1.0 0.177793 10da0014d0866a1a 27.006200 \n", + "40 1.0 0.379170 10111463352887a3 27.001100 \n", + "41 1.0 1.270331 10c7e206ff3da33e 27.029100 \n", + "42 1.0 0.608459 10c72dc2ea84ee3e 27.002000 \n", + "43 1.0 1.240973 101010806c3bfec2 30.005000 \n", + "44 1.0 0.675790 100d40c8c30375f9 30.025167 \n", + "45 1.0 0.525286 20058216259db392 30.010000 \n", + "46 1.0 0.169038 d0db3663848642f5 30.068900 \n", + "47 1.0 0.348562 d4481db8a1682303 30.007660 \n", + "48 1.0 1.926869 d43cfb8db6bde057 30.008316 \n", + "49 1.0 0.025904 d88e000ab46f7e8a 30.000000 \n", + "50 1.0 0.237322 d10ffd6af9eca406 30.000000 \n", + "51 1.0 1.012745 dee5be1bf40de25e 30.013800 \n", + "52 1.0 0.466819 daa5cc820eedd3d9 30.001500 \n", + "53 1.0 0.329434 d88f00142c1483c1 30.002000 \n", + "54 1.0 0.030553 d00cd5ba5f2b167c 30.088260 \n", + "55 1.0 0.287231 d8a48cee009b608c 30.006550 \n", + "56 1.0 0.797385 d6c1191549ab2f07 30.027600 \n", + "57 1.0 4.752955 d153e8105c7c0b57 30.001000 \n", + "58 1.0 0.895507 300b000932aead3a 30.007862 \n", + "59 1.0 2.867494 705c89a6a4e552cf 30.007100 \n", + "\n", + " infolink \\\n", + "0 https://explorer.ergoplatform.com/en/blocks/7a... \n", + "1 https://explorer.ergoplatform.com/en/blocks/44... \n", + "2 https://explorer.ergoplatform.com/en/blocks/d0... \n", + "3 https://explorer.ergoplatform.com/en/blocks/88... \n", + "4 https://explorer.ergoplatform.com/en/blocks/93... \n", + "5 https://explorer.ergoplatform.com/en/blocks/f1... \n", + "6 https://explorer.ergoplatform.com/en/blocks/9d... \n", + "7 https://explorer.ergoplatform.com/en/blocks/58... \n", + "8 https://explorer.ergoplatform.com/en/blocks/a4... \n", + "9 https://explorer.ergoplatform.com/en/blocks/2b... \n", + "10 https://explorer.ergoplatform.com/en/blocks/f8... \n", + "11 https://explorer.ergoplatform.com/en/blocks/c7... \n", + "12 https://explorer.ergoplatform.com/en/blocks/4f... \n", + "13 https://explorer.ergoplatform.com/en/blocks/22... \n", + "14 https://explorer.ergoplatform.com/en/blocks/ac... \n", + "15 https://explorer.ergoplatform.com/en/blocks/2f... \n", + "16 https://explorer.ergoplatform.com/en/blocks/17... \n", + "17 https://explorer.ergoplatform.com/en/blocks/5f... \n", + "18 https://explorer.ergoplatform.com/en/blocks/2c... \n", + "19 https://explorer.ergoplatform.com/en/blocks/92... \n", + "20 https://explorer.ergoplatform.com/en/blocks/9a... \n", + "21 https://explorer.ergoplatform.com/en/blocks/2e... \n", + "22 https://explorer.ergoplatform.com/en/blocks/c7... \n", + "23 https://explorer.ergoplatform.com/en/blocks/40... \n", + "24 https://explorer.ergoplatform.com/en/blocks/32... \n", + "25 https://explorer.ergoplatform.com/en/blocks/02... \n", + "26 https://explorer.ergoplatform.com/en/blocks/b2... \n", + "27 https://explorer.ergoplatform.com/en/blocks/b3... \n", + "28 https://explorer.ergoplatform.com/en/blocks/2d... \n", + "29 https://explorer.ergoplatform.com/en/blocks/d0... \n", + "30 https://explorer.ergoplatform.com/en/blocks/32... \n", + "31 https://explorer.ergoplatform.com/en/blocks/4a... \n", + "32 https://explorer.ergoplatform.com/en/blocks/79... \n", + "33 https://explorer.ergoplatform.com/en/blocks/d5... \n", + "34 https://explorer.ergoplatform.com/en/blocks/d3... \n", + "35 https://explorer.ergoplatform.com/en/blocks/a8... \n", + "36 https://explorer.ergoplatform.com/en/blocks/2c... \n", + "37 https://explorer.ergoplatform.com/en/blocks/39... \n", + "38 https://explorer.ergoplatform.com/en/blocks/c0... \n", + "39 https://explorer.ergoplatform.com/en/blocks/10... \n", + "40 https://explorer.ergoplatform.com/en/blocks/db... \n", + "41 https://explorer.ergoplatform.com/en/blocks/c0... \n", + "42 https://explorer.ergoplatform.com/en/blocks/91... \n", + "43 https://explorer.ergoplatform.com/en/blocks/ed... \n", + "44 https://explorer.ergoplatform.com/en/blocks/f4... \n", + "45 https://explorer.ergoplatform.com/en/blocks/bd... \n", + "46 https://explorer.ergoplatform.com/en/blocks/00... \n", + "47 https://explorer.ergoplatform.com/en/blocks/ba... \n", + "48 https://explorer.ergoplatform.com/en/blocks/85... \n", + "49 https://explorer.ergoplatform.com/en/blocks/bf... \n", + "50 https://explorer.ergoplatform.com/en/blocks/48... \n", + "51 https://explorer.ergoplatform.com/en/blocks/0f... \n", + "52 https://explorer.ergoplatform.com/en/blocks/20... \n", + "53 https://explorer.ergoplatform.com/en/blocks/27... \n", + "54 https://explorer.ergoplatform.com/en/blocks/33... \n", + "55 https://explorer.ergoplatform.com/en/blocks/2e... \n", + "56 https://explorer.ergoplatform.com/en/blocks/c5... \n", + "57 https://explorer.ergoplatform.com/en/blocks/b0... \n", + "58 https://explorer.ergoplatform.com/en/blocks/83... \n", + "59 https://explorer.ergoplatform.com/en/blocks/47... \n", + "\n", + " hash \\\n", + "0 7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36... \n", + "1 44167cd62e4406f726826b15a0fcf6e843fade6c445102... \n", + "2 d009bdd64433367b30dcf2493ccfa43329d2383ca288b0... \n", + "3 881144c4c46b08e39d59817863da508be56c215eafb8eb... \n", + "4 9395fce740c65f238690a5639a2938e0bce75b8a28b065... \n", + "5 f12b63d2743427539774bdc9f76bb207fa7a82b659cfa4... \n", + "6 9d7544bf89b699e7d31eaf49c4b8610d62d6545c1de9d2... \n", + "7 58be0effcc39dc7fc6bbc745acfd627ff3e30eab98668c... \n", + "8 a4dc120a4aa17097a163160eeb41c3dba31780f4086491... \n", + "9 2be39f033f12f55638a0e9a8755b7f96b73d15b948990c... \n", + "10 f826ef482455161ca689de707f3c239b3ca8a6e7360a2c... \n", + "11 c7c63f408c339ae4482914cbb8e93ad48b17defd20ec90... \n", + "12 4fea81e1a1a823f1c395a7d0757208381c9f6da4f68b83... \n", + "13 224c94abcd0ffa48553f6988c34bcb92c2490e76861f1c... \n", + "14 acb0c18d072bc0fc0d0e69e95cb07ba996b53ef0ac669a... \n", + "15 2f38ffbece540e4177f81615ad3130929dbf1855fcccff... \n", + "16 177fd26d67b248b8fa2b0f734be71628114fa12249403a... \n", + "17 5f999a0dbbaef1e2202acaa7a9c1dbea3cbcc7926dd9c8... \n", + "18 2c43ae9a107e279e6aaf50ddda74652235cddc42d7f7e6... \n", + "19 92e5d017e11243bae0295199fdab7b8b08ccb9363228ee... \n", + "20 9a9c4c8fbd571a877a7f197e40c4d33d265307b23634ad... \n", + "21 2e086f5d1d55e2476586f0ae72caeb77d0093c2faef6c4... \n", + "22 c7b7ef3a8c7af63a7729de240de056beff246f9d99aebd... \n", + "23 40823fa0c172fc5f3a8ebcc79f8557f776d502abeceff0... \n", + "24 3255824876c9afc17a051e4fec4f2fb9a502d91a31d60e... \n", + "25 023d3db990a609673fb2143fdfd110f959928864ee5ba0... \n", + "26 b25a01e4b603f883cbe139725e8377ea798ef7bf5e5ffb... \n", + "27 b3dc77df25368a64370eba7b7e0f2392e5a9c3fe4cd297... \n", + "28 2d2fd8c12850c9f1a00c38aa79aba813554f7a383c4be6... \n", + "29 d0b39e75edf0099c62ce1fc97bef7dd51695659255ec7f... \n", + "30 32df796eeeeb916349df58e3263011fc13e2064202638d... \n", + "31 4ac405b82c909606840b4abb83acd42e79aa74ac9dfcfa... \n", + "32 7994b89a991f3a3589d54772c4e30437894c691aa0dfd6... \n", + "33 d51a06c21ece88a1935e2eca6a3d1ba1e82507dc7cb114... \n", + "34 d37d915b800e4b8fce3eb97ace72d1b8ecf1c35eecbf52... \n", + "35 a8134a002699294a2cb40e3f4eb3603ede1bdcae3cd0de... \n", + "36 2c36f7618aef25e20373b4832dbbdc6f95784909a40218... \n", + "37 3951d2d140cca3c5138162008137ea4c703f1cdc4a16c2... \n", + "38 c0e3620bcbce50d12b892ec9c42106e803157d14bcfc96... \n", + "39 106552ecd414d016d00bb6aac33233b40e0de0e96752ad... \n", + "40 db56d46b7963b5dd508c2bdb1507303c8263e6ccad1b47... \n", + "41 c006a33b7d2f4a4019919c278f5429608902fe3e51b1e1... \n", + "42 915a48e58976142360cc5233b6033ad2a3e2f06cda7dc1... \n", + "43 edd2c6e48ef6cc480c95a58dcb24c4125c1136d7aa4c22... \n", + "44 f49ecdd5eff7e5d0d05d0eb65c7818f31fcd82ebf5df86... \n", + "45 bd3099462e5eba95a4e8e809232f6788f2664e4a344eae... \n", + "46 000eacceb597c08feeb2a67ea6f0b804d9dc185c0e0630... \n", + "47 babafdf183a977d3ef1cf8823f241e3393ac0472f9a00e... \n", + "48 85775b03bae1f4c46c3b444bd511838d5fb9cd326c8462... \n", + "49 bfce9fe97cbc219e80858ee257f664fd3ad9ff713ed12c... \n", + "50 48044bb6835294495eb17744326b63f3183a629ab44767... \n", + "51 0f56bc5a2f2b9f179c81feeab3022723bc60df72ad4121... \n", + "52 20b806d4bd9cc58f6cc04ffdeaffd6e68c07f66e422e78... \n", + "53 278a4a533165aa5c63f8f79bb8a1ab9d29e1a62d254139... \n", + "54 3360f32693fd991c229e6a3b095eb2ff6e0367dcbac370... \n", + "55 2e2b04e088834393eafa5aac17d0fc641f4a188d6dc873... \n", + "56 c5886b3606b842b4a0ecaeda2d6270ac3238e7e0da37d2... \n", + "57 b03937a8404d47fed3d7050a93a6e6b940100e4c008a66... \n", + "58 83c740633d4aa9e61775dcab0d2ef20dd4d11c275424fa... \n", + "59 47dd2792f0fd255fc8fc4b0a12903b351245fb7083ea5e... \n", + "\n", + " miner source \\\n", + "0 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "1 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "2 9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y... ErgoSigmanauts \n", + "3 9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN... ErgoSigmanauts \n", + "4 9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE... ErgoSigmanauts \n", + "5 9hSk13XDU8keWAp3KxKSgUVCkfDcw577jAjM6SgbRpuYeL... ErgoSigmanauts \n", + "6 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "7 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "8 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "9 9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y... ErgoSigmanauts \n", + "10 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "11 9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd... ErgoSigmanauts \n", + "12 9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN... ErgoSigmanauts \n", + "13 9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu... ErgoSigmanauts \n", + "14 9eZVqXVnrVWQKK19b7E7kp4ZyNqanp2z1mpKUJRaouNsme... ErgoSigmanauts \n", + "15 9ggYKoC58jQkbGNhCKqcLMsuK3qCE5ieqTPx28KrY5jJ5S... ErgoSigmanauts \n", + "16 9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC... ErgoSigmanauts \n", + "17 9f5vwtxyRP87wmc8ezyKbL7ryaNhDrgWUVBEZpQKnw16SW... ErgoSigmanauts \n", + "18 9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu... ErgoSigmanauts \n", + "19 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "20 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "21 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "22 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "23 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "24 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "25 9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd... ErgoSigmanauts \n", + "26 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "27 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "28 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "29 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "30 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "31 9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4... ErgoSigmanauts \n", + "32 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "33 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "34 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "35 9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC... ErgoSigmanauts \n", + "36 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "37 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "38 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "39 9f7851wUuymT3jiaaFQ5Uv3QUmCHsahCR43syFbc1nDRSH... ErgoSigmanauts \n", + "40 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "41 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "42 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "43 9eZPTmn8zp5GJ7KZwTo8cEuxNdezWaY3hBbLeWid7EAZed... ErgoSigmanauts \n", + "44 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "45 9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq... ErgoSigmanauts \n", + "46 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "47 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "48 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "49 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "50 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "51 9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq... ErgoSigmanauts \n", + "52 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "53 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "54 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "55 9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4... ErgoSigmanauts \n", + "56 9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw... ErgoSigmanauts \n", + "57 9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw... ErgoSigmanauts \n", + "58 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "59 9iQS22vfWdF2N84Lvv9jgAMFGLyL7t17SWbHGEfaddaG7Z... ErgoSigmanauts \n", + "\n", + " time_found \n", + "0 2024-04-29 08:20:04 \n", + "1 2024-04-28 23:18:22 \n", + "2 2024-04-28 17:16:48 \n", + "3 2024-04-28 16:09:49 \n", + "4 2024-04-28 12:59:58 \n", + "5 2024-04-28 03:06:52 \n", + "6 2024-04-28 02:55:03 \n", + "7 2024-04-27 07:59:45 \n", + "8 2024-04-27 06:54:45 \n", + "9 2024-04-27 04:31:16 \n", + "10 2024-04-26 18:24:58 \n", + "11 2024-04-26 16:00:40 \n", + "12 2024-04-23 22:19:10 \n", + "13 2024-04-23 19:17:03 \n", + "14 2024-04-23 19:06:49 \n", + "15 2024-04-23 12:18:50 \n", + "16 2024-04-22 22:07:16 \n", + "17 2024-04-22 18:11:34 \n", + "18 2024-04-22 09:12:21 \n", + "19 2024-04-21 18:58:55 \n", + "20 2024-04-21 16:57:09 \n", + "21 2024-04-21 15:49:03 \n", + "22 2024-04-21 05:49:18 \n", + "23 2024-04-19 17:13:40 \n", + "24 2024-04-19 10:06:26 \n", + "25 2024-04-19 09:41:15 \n", + "26 2024-04-19 08:45:52 \n", + "27 2024-04-18 09:31:37 \n", + "28 2024-04-18 08:01:31 \n", + "29 2024-04-18 03:11:44 \n", + "30 2024-04-17 21:39:45 \n", + "31 2024-04-17 01:03:11 \n", + "32 2024-04-16 20:53:07 \n", + "33 2024-04-15 13:26:36 \n", + "34 2024-04-15 05:58:59 \n", + "35 2024-04-14 19:46:29 \n", + "36 2024-04-14 07:53:57 \n", + "37 2024-04-13 01:40:15 \n", + "38 2024-04-10 21:52:48 \n", + "39 2024-04-10 16:45:58 \n", + "40 2024-04-10 11:38:14 \n", + "41 2024-04-09 23:57:08 \n", + "42 2024-04-08 14:35:09 \n", + "43 2024-04-07 19:55:43 \n", + "44 2024-04-06 00:11:43 \n", + "45 2024-04-04 23:46:44 \n", + "46 2024-04-04 01:40:19 \n", + "47 2024-04-03 18:22:18 \n", + "48 2024-04-03 04:57:28 \n", + "49 2024-03-31 07:40:29 \n", + "50 2024-03-31 06:53:18 \n", + "51 2024-03-31 02:11:27 \n", + "52 2024-03-29 22:22:38 \n", + "53 2024-03-29 04:26:22 \n", + "54 2024-03-28 16:41:02 \n", + "55 2024-03-28 15:40:37 \n", + "56 2024-03-28 08:26:49 \n", + "57 2024-03-27 18:07:25 \n", + "58 2024-03-19 04:19:20 \n", + "59 2024-03-16 06:45:27 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "payment_data = pool['paymentProcessing']\n", - "del payment_data['enabled']\n", - "del payment_data['payoutSchemeConfig']\n", - "del payment_data['extra']" + "sample = database.fetch_data('block')\n", + "sample = sample.sort_values('blockheight', ascending=False)\n", + "sample" ] }, { "cell_type": "code", - "execution_count": null, - "id": "c7addd0e-06cd-4573-910d-2b6948e64273", + "execution_count": 17, + "id": "7b17a189-4564-4261-9899-38b2705a0787", "metadata": {}, "outputs": [], "source": [ - "payment_data" + "new_block_data = {\n", + " 'poolId': 'pool123',\n", + " 'blockHeight': 672835,\n", + " 'networkDifficulty': 19.963,\n", + " 'status': 'unconfirmed',\n", + " 'confirmationProgress': 0.7, # This is a critical field for the logic.\n", + " 'effort': 120.5,\n", + " 'transactionConfirmationData': 'tx12345',\n", + " 'reward': 6.25,\n", + " 'infoLink': 'http://example.com/info',\n", + " 'hash': 'hash_value_123456', # Unique identifier\n", + " 'miner': 'miner_name',\n", + " 'source': 'source_info',\n", + " 'created': '2022-01-01T12:00:00',\n", + " # 'rolling_effort': 10,\n", + "}\n", + "# database.update_or_insert('block', new_block_data)\n", + "# database.fetch_data('block')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "4ec326f7-81aa-44e2-8d7e-59fa6236dd4f", - "metadata": {}, - "outputs": [], + "execution_count": 18, + "id": "947f6417-0033-4e42-86e6-6b8a3eba9eb0", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/whaleshark/Documents/sigmanaut-mining-pool-ui/utils/db_util.py:176: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " return pd.read_sql_query(query, self.conn)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
poolidblockheightnetworkdifficultystatusconfirmationprogressefforttransactionconfirmationdatarewardinfolinkhashminersourcetime_found
0ErgoSigmanauts1253410354831.655250confirmed1.01.045866580c001f31e4fd3a27.000000https://explorer.ergoplatform.com/en/blocks/7a...7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-29 08:20:04
1ErgoSigmanauts1253118362089.481987confirmed1.00.64787450239669e1ac4af827.000000https://explorer.ergoplatform.com/en/blocks/44...44167cd62e4406f726826b15a0fcf6e843fade6c445102...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-28 23:18:22
2ErgoSigmanauts1252956390351.076394confirmed1.00.11251757f9f469dba977c327.009200https://explorer.ergoplatform.com/en/blocks/d0...d009bdd64433367b30dcf2493ccfa43329d2383ca288b0...9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y...ErgoSigmanauts2024-04-28 17:16:48
3ErgoSigmanauts1252929390351.076394confirmed1.00.3130745016a01340d6b9ba27.653129https://explorer.ergoplatform.com/en/blocks/88...881144c4c46b08e39d59817863da508be56c215eafb8eb...9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN...ErgoSigmanauts2024-04-28 16:09:49
4ErgoSigmanauts1252840350627.704840confirmed1.00.96422857f1000efc558ff127.019200https://explorer.ergoplatform.com/en/blocks/93...9395fce740c65f238690a5639a2938e0bce75b8a28b065...9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE...ErgoSigmanauts2024-04-28 12:59:58
5ErgoSigmanauts1252559422881.658950confirmed1.00.01770056dcc160776a8a7127.022100https://explorer.ergoplatform.com/en/blocks/f1...f12b63d2743427539774bdc9f76bb207fa7a82b659cfa4...9hSk13XDU8keWAp3KxKSgUVCkfDcw577jAjM6SgbRpuYeL...ErgoSigmanauts2024-04-28 03:06:52
6ErgoSigmanauts1252553422881.658950confirmed1.01.85688250230ed620a8fa0b27.000000https://explorer.ergoplatform.com/en/blocks/9d...9d7544bf89b699e7d31eaf49c4b8610d62d6545c1de9d2...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-28 02:55:03
7ErgoSigmanauts1251978380358.285885confirmed1.00.11252550a300044822864227.001000https://explorer.ergoplatform.com/en/blocks/58...58be0effcc39dc7fc6bbc745acfd627ff3e30eab98668c...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-27 07:59:45
8ErgoSigmanauts1251939366775.443497confirmed1.00.244779502468dac362205227.018200https://explorer.ergoplatform.com/en/blocks/a4...a4dc120a4aa17097a163160eeb41c3dba31780f4086491...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-27 06:54:45
9ErgoSigmanauts1251871366775.443497confirmed1.01.03993150d8fd9c81187de227.008800https://explorer.ergoplatform.com/en/blocks/2b...2be39f033f12f55638a0e9a8755b7f96b73d15b948990c...9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y...ErgoSigmanauts2024-04-27 04:31:16
10ErgoSigmanauts1251567388383.156547confirmed1.00.261117555f000b343364e427.005100https://explorer.ergoplatform.com/en/blocks/f8...f826ef482455161ca689de707f3c239b3ca8a6e7360a2c...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-26 18:24:58
11ErgoSigmanauts1251499388383.156547confirmed1.06.396079507971cae2ee4a1827.004200https://explorer.ergoplatform.com/en/blocks/c7...c7c63f408c339ae4482914cbb8e93ad48b17defd20ec90...9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd...ErgoSigmanauts2024-04-26 16:00:40
12ErgoSigmanauts1249527315887.249576confirmed1.00.34152750164a42c64cc4f127.015100https://explorer.ergoplatform.com/en/blocks/4f...4fea81e1a1a823f1c395a7d0757208381c9f6da4f68b83...9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN...ErgoSigmanauts2024-04-23 22:19:10
13ErgoSigmanauts1249440315887.249576confirmed1.00.01921650187b62b18da53527.010000https://explorer.ergoplatform.com/en/blocks/22...224c94abcd0ffa48553f6988c34bcb92c2490e76861f1c...9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu...ErgoSigmanauts2024-04-23 19:17:03
14ErgoSigmanauts1249432315887.249576confirmed1.00.6392275057d49b44b4ed2127.012200https://explorer.ergoplatform.com/en/blocks/ac...acb0c18d072bc0fc0d0e69e95cb07ba996b53ef0ac669a...9eZVqXVnrVWQKK19b7E7kp4ZyNqanp2z1mpKUJRaouNsme...ErgoSigmanauts2024-04-23 19:06:49
15ErgoSigmanauts1249230361687.597350confirmed1.01.2624301bdb3e4628f615be27.006300https://explorer.ergoplatform.com/en/blocks/2f...2f38ffbece540e4177f81615ad3130929dbf1855fcccff...9ggYKoC58jQkbGNhCKqcLMsuK3qCE5ieqTPx28KrY5jJ5S...ErgoSigmanauts2024-04-23 12:18:50
16ErgoSigmanauts1248838426627.604763confirmed1.00.351294186e549eb8340f1227.034400https://explorer.ergoplatform.com/en/blocks/17...177fd26d67b248b8fa2b0f734be71628114fa12249403a...9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC...ErgoSigmanauts2024-04-22 22:07:16
17ErgoSigmanauts1248716402639.913195confirmed1.00.6859161c96000783680ce227.008244https://explorer.ergoplatform.com/en/blocks/5f...5f999a0dbbaef1e2202acaa7a9c1dbea3cbcc7926dd9c8...9f5vwtxyRP87wmc8ezyKbL7ryaNhDrgWUVBEZpQKnw16SW...ErgoSigmanauts2024-04-22 18:11:34
18ErgoSigmanauts1248443380709.272335confirmed1.01.001987188b8a2690b7756927.007400https://explorer.ergoplatform.com/en/blocks/2c...2c43ae9a107e279e6aaf50ddda74652235cddc42d7f7e6...9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu...ErgoSigmanauts2024-04-22 09:12:21
19ErgoSigmanauts1248031396231.066521confirmed1.00.1612051c1800034e77b16627.001960https://explorer.ergoplatform.com/en/blocks/92...92e5d017e11243bae0295199fdab7b8b08ccb9363228ee...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-21 18:58:55
20ErgoSigmanauts1247949334193.979483confirmed1.00.0949271bf4a728749d7de827.001000https://explorer.ergoplatform.com/en/blocks/9a...9a9c4c8fbd571a877a7f197e40c4d33d265307b23634ad...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-21 16:57:09
21ErgoSigmanauts1247906334193.979483confirmed1.00.6902871a16000df545608327.026500https://explorer.ergoplatform.com/en/blocks/2e...2e086f5d1d55e2476586f0ae72caeb77d0093c2faef6c4...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-21 15:49:03
22ErgoSigmanauts1247634390680.078087confirmed1.03.0398631a1329402f2206ed27.069355https://explorer.ergoplatform.com/en/blocks/c7...c7b7ef3a8c7af63a7729de240de056beff246f9d99aebd...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-21 05:49:18
23ErgoSigmanauts1246555371421.349703confirmed1.00.53527512fc6a2219199f2a27.012000https://explorer.ergoplatform.com/en/blocks/40...40823fa0c172fc5f3a8ebcc79f8557f776d502abeceff0...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-19 17:13:40
24ErgoSigmanauts1246329338457.841118confirmed1.00.0333131642835a069e4fb927.025700https://explorer.ergoplatform.com/en/blocks/32...3255824876c9afc17a051e4fec4f2fb9a502d91a31d60e...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-19 10:06:26
25ErgoSigmanauts1246316338457.841118confirmed1.00.072236146857274f45ac2c27.180640https://explorer.ergoplatform.com/en/blocks/02...023d3db990a609673fb2143fdfd110f959928864ee5ba0...9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd...ErgoSigmanauts2024-04-19 09:41:15
26ErgoSigmanauts1246282338457.841118confirmed1.02.084016164237aca8296f1c27.012601https://explorer.ergoplatform.com/en/blocks/b2...b25a01e4b603f883cbe139725e8377ea798ef7bf5e5ffb...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-19 08:45:52
27ErgoSigmanauts1245573345942.822277confirmed1.00.11677212a8cc865d1eb6b127.001253https://explorer.ergoplatform.com/en/blocks/b3...b3dc77df25368a64370eba7b7e0f2392e5a9c3fe4cd297...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-04-18 09:31:37
28ErgoSigmanauts1245528323130.127436confirmed1.00.361345126a0007f2a34c7c27.000000https://explorer.ergoplatform.com/en/blocks/2d...2d2fd8c12850c9f1a00c38aa79aba813554f7a383c4be6...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-18 08:01:31
29ErgoSigmanauts1245375343213.854779confirmed1.00.384602126b001c1226e66627.004100https://explorer.ergoplatform.com/en/blocks/d0...d0b39e75edf0099c62ce1fc97bef7dd51695659255ec7f...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-18 03:11:44
30ErgoSigmanauts1245219385248.184230confirmed1.01.361363123200132a4f005327.001000https://explorer.ergoplatform.com/en/blocks/32...32df796eeeeb916349df58e3263011fc13e2064202638d...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-17 21:39:45
31ErgoSigmanauts1244611350337.673747confirmed1.00.30406013309b8b1531ac3d27.004400https://explorer.ergoplatform.com/en/blocks/4a...4ac405b82c909606840b4abb83acd42e79aa74ac9dfcfa...9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4...ErgoSigmanauts2024-04-17 01:03:11
32ErgoSigmanauts1244487347763.784750confirmed1.02.109182126b0037bf192dd927.004000https://explorer.ergoplatform.com/en/blocks/79...7994b89a991f3a3589d54772c4e30437894c691aa0dfd6...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-16 20:53:07
33ErgoSigmanauts1243556346496.758155confirmed1.00.384074121c61dad76dde6427.002200https://explorer.ergoplatform.com/en/blocks/d5...d51a06c21ece88a1935e2eca6a3d1ba1e82507dc7cb114...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-15 13:26:36
34ErgoSigmanauts1243309317174.205629confirmed1.00.4703621232000391a2d9da27.009000https://explorer.ergoplatform.com/en/blocks/d3...d37d915b800e4b8fce3eb97ace72d1b8ecf1c35eecbf52...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-15 05:58:59
35ErgoSigmanauts1243018353518.612001confirmed1.00.517238124d61659aa64c7a27.076500https://explorer.ergoplatform.com/en/blocks/a8...a8134a002699294a2cb40e3f4eb3603ede1bdcae3cd0de...9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC...ErgoSigmanauts2024-04-14 19:46:29
36ErgoSigmanauts1242682379295.328612confirmed1.01.39456112200009ea03884927.017500https://explorer.ergoplatform.com/en/blocks/2c...2c36f7618aef25e20373b4832dbbdc6f95784909a40218...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-14 07:53:57
37ErgoSigmanauts1241796370202.405388confirmed1.01.98051410c71b4fad01f31c27.052025https://explorer.ergoplatform.com/en/blocks/39...3951d2d140cca3c5138162008137ea4c703f1cdc4a16c2...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-13 01:40:15
38ErgoSigmanauts1240237406987.879722confirmed1.00.156104100fe6c78281bfae27.130969https://explorer.ergoplatform.com/en/blocks/c0...c0e3620bcbce50d12b892ec9c42106e803157d14bcfc96...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-10 21:52:48
39ErgoSigmanauts1240101411836.853619confirmed1.00.17779310da0014d0866a1a27.006200https://explorer.ergoplatform.com/en/blocks/10...106552ecd414d016d00bb6aac33233b40e0de0e96752ad...9f7851wUuymT3jiaaFQ5Uv3QUmCHsahCR43syFbc1nDRSH...ErgoSigmanauts2024-04-10 16:45:58
40ErgoSigmanauts1239922414752.684611confirmed1.00.37917010111463352887a327.001100https://explorer.ergoplatform.com/en/blocks/db...db56d46b7963b5dd508c2bdb1507303c8263e6ccad1b47...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-10 11:38:14
41ErgoSigmanauts1239612395105.076364confirmed1.01.27033110c7e206ff3da33e27.029100https://explorer.ergoplatform.com/en/blocks/c0...c006a33b7d2f4a4019919c278f5429608902fe3e51b1e1...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-09 23:57:08
42ErgoSigmanauts1238592386279.122336confirmed1.00.60845910c72dc2ea84ee3e27.002000https://explorer.ergoplatform.com/en/blocks/91...915a48e58976142360cc5233b6033ad2a3e2f06cda7dc1...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-08 14:35:09
43ErgoSigmanauts1238040399941.963788confirmed1.01.240973101010806c3bfec230.005000https://explorer.ergoplatform.com/en/blocks/ed...edd2c6e48ef6cc480c95a58dcb24c4125c1136d7aa4c22...9eZPTmn8zp5GJ7KZwTo8cEuxNdezWaY3hBbLeWid7EAZed...ErgoSigmanauts2024-04-07 19:55:43
44ErgoSigmanauts1236735385434.149366confirmed1.00.675790100d40c8c30375f930.025167https://explorer.ergoplatform.com/en/blocks/f4...f49ecdd5eff7e5d0d05d0eb65c7818f31fcd82ebf5df86...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-06 00:11:43
45ErgoSigmanauts1235990387916.169692confirmed1.00.52528620058216259db39230.010000https://explorer.ergoplatform.com/en/blocks/bd...bd3099462e5eba95a4e8e809232f6788f2664e4a344eae...9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq...ErgoSigmanauts2024-04-04 23:46:44
46ErgoSigmanauts1235365466883.931372confirmed1.00.169038d0db3663848642f530.068900https://explorer.ergoplatform.com/en/blocks/00...000eacceb597c08feeb2a67ea6f0b804d9dc185c0e0630...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-04 01:40:19
47ErgoSigmanauts1235136433886.497034confirmed1.00.348562d4481db8a168230330.007660https://explorer.ergoplatform.com/en/blocks/ba...babafdf183a977d3ef1cf8823f241e3393ac0472f9a00e...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-03 18:22:18
48ErgoSigmanauts1234733425282.536901confirmed1.01.926869d43cfb8db6bde05730.008316https://explorer.ergoplatform.com/en/blocks/85...85775b03bae1f4c46c3b444bd511838d5fb9cd326c8462...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-04-03 04:57:28
49ErgoSigmanauts1232662385380.245572confirmed1.00.025904d88e000ab46f7e8a30.000000https://explorer.ergoplatform.com/en/blocks/bf...bfce9fe97cbc219e80858ee257f664fd3ad9ff713ed12c...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-31 07:40:29
50ErgoSigmanauts1232628363957.496239confirmed1.00.237322d10ffd6af9eca40630.000000https://explorer.ergoplatform.com/en/blocks/48...48044bb6835294495eb17744326b63f3183a629ab44767...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-03-31 06:53:18
51ErgoSigmanauts1232487360630.583506confirmed1.01.012745dee5be1bf40de25e30.013800https://explorer.ergoplatform.com/en/blocks/0f...0f56bc5a2f2b9f179c81feeab3022723bc60df72ad4121...9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq...ErgoSigmanauts2024-03-31 02:11:27
52ErgoSigmanauts1231651367785.409859confirmed1.00.466819daa5cc820eedd3d930.001500https://explorer.ergoplatform.com/en/blocks/20...20b806d4bd9cc58f6cc04ffdeaffd6e68c07f66e422e78...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-29 22:22:38
53ErgoSigmanauts1231144405099.842403confirmed1.00.329434d88f00142c1483c130.002000https://explorer.ergoplatform.com/en/blocks/27...278a4a533165aa5c63f8f79bb8a1ab9d29e1a62d254139...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-29 04:26:22
54ErgoSigmanauts1230782360986.500966confirmed1.00.030553d00cd5ba5f2b167c30.088260https://explorer.ergoplatform.com/en/blocks/33...3360f32693fd991c229e6a3b095eb2ff6e0367dcbac370...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-03-28 16:41:02
55ErgoSigmanauts1230749360986.500966confirmed1.00.287231d8a48cee009b608c30.006550https://explorer.ergoplatform.com/en/blocks/2e...2e2b04e088834393eafa5aac17d0fc641f4a188d6dc873...9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4...ErgoSigmanauts2024-03-28 15:40:37
56ErgoSigmanauts1230547434381.378191confirmed1.00.797385d6c1191549ab2f0730.027600https://explorer.ergoplatform.com/en/blocks/c5...c5886b3606b842b4a0ecaeda2d6270ac3238e7e0da37d2...9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw...ErgoSigmanauts2024-03-28 08:26:49
57ErgoSigmanauts1230104347635.796935confirmed1.04.752955d153e8105c7c0b5730.001000https://explorer.ergoplatform.com/en/blocks/b0...b03937a8404d47fed3d7050a93a6e6b940100e4c008a66...9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw...ErgoSigmanauts2024-03-27 18:07:25
58ErgoSigmanauts1223980416310.690227confirmed1.00.895507300b000932aead3a30.007862https://explorer.ergoplatform.com/en/blocks/83...83c740633d4aa9e61775dcab0d2ef20dd4d11c275424fa...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-03-19 04:19:20
59ErgoSigmanauts1221911421209.622611confirmed1.02.867494705c89a6a4e552cf30.007100https://explorer.ergoplatform.com/en/blocks/47...47dd2792f0fd255fc8fc4b0a12903b351245fb7083ea5e...9iQS22vfWdF2N84Lvv9jgAMFGLyL7t17SWbHGEfaddaG7Z...ErgoSigmanauts2024-03-16 06:45:27
\n", + "
" + ], + "text/plain": [ + " poolid blockheight networkdifficulty status \\\n", + "0 ErgoSigmanauts 1253410 354831.655250 confirmed \n", + "1 ErgoSigmanauts 1253118 362089.481987 confirmed \n", + "2 ErgoSigmanauts 1252956 390351.076394 confirmed \n", + "3 ErgoSigmanauts 1252929 390351.076394 confirmed \n", + "4 ErgoSigmanauts 1252840 350627.704840 confirmed \n", + "5 ErgoSigmanauts 1252559 422881.658950 confirmed \n", + "6 ErgoSigmanauts 1252553 422881.658950 confirmed \n", + "7 ErgoSigmanauts 1251978 380358.285885 confirmed \n", + "8 ErgoSigmanauts 1251939 366775.443497 confirmed \n", + "9 ErgoSigmanauts 1251871 366775.443497 confirmed \n", + "10 ErgoSigmanauts 1251567 388383.156547 confirmed \n", + "11 ErgoSigmanauts 1251499 388383.156547 confirmed \n", + "12 ErgoSigmanauts 1249527 315887.249576 confirmed \n", + "13 ErgoSigmanauts 1249440 315887.249576 confirmed \n", + "14 ErgoSigmanauts 1249432 315887.249576 confirmed \n", + "15 ErgoSigmanauts 1249230 361687.597350 confirmed \n", + "16 ErgoSigmanauts 1248838 426627.604763 confirmed \n", + "17 ErgoSigmanauts 1248716 402639.913195 confirmed \n", + "18 ErgoSigmanauts 1248443 380709.272335 confirmed \n", + "19 ErgoSigmanauts 1248031 396231.066521 confirmed \n", + "20 ErgoSigmanauts 1247949 334193.979483 confirmed \n", + "21 ErgoSigmanauts 1247906 334193.979483 confirmed \n", + "22 ErgoSigmanauts 1247634 390680.078087 confirmed \n", + "23 ErgoSigmanauts 1246555 371421.349703 confirmed \n", + "24 ErgoSigmanauts 1246329 338457.841118 confirmed \n", + "25 ErgoSigmanauts 1246316 338457.841118 confirmed \n", + "26 ErgoSigmanauts 1246282 338457.841118 confirmed \n", + "27 ErgoSigmanauts 1245573 345942.822277 confirmed \n", + "28 ErgoSigmanauts 1245528 323130.127436 confirmed \n", + "29 ErgoSigmanauts 1245375 343213.854779 confirmed \n", + "30 ErgoSigmanauts 1245219 385248.184230 confirmed \n", + "31 ErgoSigmanauts 1244611 350337.673747 confirmed \n", + "32 ErgoSigmanauts 1244487 347763.784750 confirmed \n", + "33 ErgoSigmanauts 1243556 346496.758155 confirmed \n", + "34 ErgoSigmanauts 1243309 317174.205629 confirmed \n", + "35 ErgoSigmanauts 1243018 353518.612001 confirmed \n", + "36 ErgoSigmanauts 1242682 379295.328612 confirmed \n", + "37 ErgoSigmanauts 1241796 370202.405388 confirmed \n", + "38 ErgoSigmanauts 1240237 406987.879722 confirmed \n", + "39 ErgoSigmanauts 1240101 411836.853619 confirmed \n", + "40 ErgoSigmanauts 1239922 414752.684611 confirmed \n", + "41 ErgoSigmanauts 1239612 395105.076364 confirmed \n", + "42 ErgoSigmanauts 1238592 386279.122336 confirmed \n", + "43 ErgoSigmanauts 1238040 399941.963788 confirmed \n", + "44 ErgoSigmanauts 1236735 385434.149366 confirmed \n", + "45 ErgoSigmanauts 1235990 387916.169692 confirmed \n", + "46 ErgoSigmanauts 1235365 466883.931372 confirmed \n", + "47 ErgoSigmanauts 1235136 433886.497034 confirmed \n", + "48 ErgoSigmanauts 1234733 425282.536901 confirmed \n", + "49 ErgoSigmanauts 1232662 385380.245572 confirmed \n", + "50 ErgoSigmanauts 1232628 363957.496239 confirmed \n", + "51 ErgoSigmanauts 1232487 360630.583506 confirmed \n", + "52 ErgoSigmanauts 1231651 367785.409859 confirmed \n", + "53 ErgoSigmanauts 1231144 405099.842403 confirmed \n", + "54 ErgoSigmanauts 1230782 360986.500966 confirmed \n", + "55 ErgoSigmanauts 1230749 360986.500966 confirmed \n", + "56 ErgoSigmanauts 1230547 434381.378191 confirmed \n", + "57 ErgoSigmanauts 1230104 347635.796935 confirmed \n", + "58 ErgoSigmanauts 1223980 416310.690227 confirmed \n", + "59 ErgoSigmanauts 1221911 421209.622611 confirmed \n", + "\n", + " confirmationprogress effort transactionconfirmationdata reward \\\n", + "0 1.0 1.045866 580c001f31e4fd3a 27.000000 \n", + "1 1.0 0.647874 50239669e1ac4af8 27.000000 \n", + "2 1.0 0.112517 57f9f469dba977c3 27.009200 \n", + "3 1.0 0.313074 5016a01340d6b9ba 27.653129 \n", + "4 1.0 0.964228 57f1000efc558ff1 27.019200 \n", + "5 1.0 0.017700 56dcc160776a8a71 27.022100 \n", + "6 1.0 1.856882 50230ed620a8fa0b 27.000000 \n", + "7 1.0 0.112525 50a3000448228642 27.001000 \n", + "8 1.0 0.244779 502468dac3622052 27.018200 \n", + "9 1.0 1.039931 50d8fd9c81187de2 27.008800 \n", + "10 1.0 0.261117 555f000b343364e4 27.005100 \n", + "11 1.0 6.396079 507971cae2ee4a18 27.004200 \n", + "12 1.0 0.341527 50164a42c64cc4f1 27.015100 \n", + "13 1.0 0.019216 50187b62b18da535 27.010000 \n", + "14 1.0 0.639227 5057d49b44b4ed21 27.012200 \n", + "15 1.0 1.262430 1bdb3e4628f615be 27.006300 \n", + "16 1.0 0.351294 186e549eb8340f12 27.034400 \n", + "17 1.0 0.685916 1c96000783680ce2 27.008244 \n", + "18 1.0 1.001987 188b8a2690b77569 27.007400 \n", + "19 1.0 0.161205 1c1800034e77b166 27.001960 \n", + "20 1.0 0.094927 1bf4a728749d7de8 27.001000 \n", + "21 1.0 0.690287 1a16000df5456083 27.026500 \n", + "22 1.0 3.039863 1a1329402f2206ed 27.069355 \n", + "23 1.0 0.535275 12fc6a2219199f2a 27.012000 \n", + "24 1.0 0.033313 1642835a069e4fb9 27.025700 \n", + "25 1.0 0.072236 146857274f45ac2c 27.180640 \n", + "26 1.0 2.084016 164237aca8296f1c 27.012601 \n", + "27 1.0 0.116772 12a8cc865d1eb6b1 27.001253 \n", + "28 1.0 0.361345 126a0007f2a34c7c 27.000000 \n", + "29 1.0 0.384602 126b001c1226e666 27.004100 \n", + "30 1.0 1.361363 123200132a4f0053 27.001000 \n", + "31 1.0 0.304060 13309b8b1531ac3d 27.004400 \n", + "32 1.0 2.109182 126b0037bf192dd9 27.004000 \n", + "33 1.0 0.384074 121c61dad76dde64 27.002200 \n", + "34 1.0 0.470362 1232000391a2d9da 27.009000 \n", + "35 1.0 0.517238 124d61659aa64c7a 27.076500 \n", + "36 1.0 1.394561 12200009ea038849 27.017500 \n", + "37 1.0 1.980514 10c71b4fad01f31c 27.052025 \n", + "38 1.0 0.156104 100fe6c78281bfae 27.130969 \n", + "39 1.0 0.177793 10da0014d0866a1a 27.006200 \n", + "40 1.0 0.379170 10111463352887a3 27.001100 \n", + "41 1.0 1.270331 10c7e206ff3da33e 27.029100 \n", + "42 1.0 0.608459 10c72dc2ea84ee3e 27.002000 \n", + "43 1.0 1.240973 101010806c3bfec2 30.005000 \n", + "44 1.0 0.675790 100d40c8c30375f9 30.025167 \n", + "45 1.0 0.525286 20058216259db392 30.010000 \n", + "46 1.0 0.169038 d0db3663848642f5 30.068900 \n", + "47 1.0 0.348562 d4481db8a1682303 30.007660 \n", + "48 1.0 1.926869 d43cfb8db6bde057 30.008316 \n", + "49 1.0 0.025904 d88e000ab46f7e8a 30.000000 \n", + "50 1.0 0.237322 d10ffd6af9eca406 30.000000 \n", + "51 1.0 1.012745 dee5be1bf40de25e 30.013800 \n", + "52 1.0 0.466819 daa5cc820eedd3d9 30.001500 \n", + "53 1.0 0.329434 d88f00142c1483c1 30.002000 \n", + "54 1.0 0.030553 d00cd5ba5f2b167c 30.088260 \n", + "55 1.0 0.287231 d8a48cee009b608c 30.006550 \n", + "56 1.0 0.797385 d6c1191549ab2f07 30.027600 \n", + "57 1.0 4.752955 d153e8105c7c0b57 30.001000 \n", + "58 1.0 0.895507 300b000932aead3a 30.007862 \n", + "59 1.0 2.867494 705c89a6a4e552cf 30.007100 \n", + "\n", + " infolink \\\n", + "0 https://explorer.ergoplatform.com/en/blocks/7a... \n", + "1 https://explorer.ergoplatform.com/en/blocks/44... \n", + "2 https://explorer.ergoplatform.com/en/blocks/d0... \n", + "3 https://explorer.ergoplatform.com/en/blocks/88... \n", + "4 https://explorer.ergoplatform.com/en/blocks/93... \n", + "5 https://explorer.ergoplatform.com/en/blocks/f1... \n", + "6 https://explorer.ergoplatform.com/en/blocks/9d... \n", + "7 https://explorer.ergoplatform.com/en/blocks/58... \n", + "8 https://explorer.ergoplatform.com/en/blocks/a4... \n", + "9 https://explorer.ergoplatform.com/en/blocks/2b... \n", + "10 https://explorer.ergoplatform.com/en/blocks/f8... \n", + "11 https://explorer.ergoplatform.com/en/blocks/c7... \n", + "12 https://explorer.ergoplatform.com/en/blocks/4f... \n", + "13 https://explorer.ergoplatform.com/en/blocks/22... \n", + "14 https://explorer.ergoplatform.com/en/blocks/ac... \n", + "15 https://explorer.ergoplatform.com/en/blocks/2f... \n", + "16 https://explorer.ergoplatform.com/en/blocks/17... \n", + "17 https://explorer.ergoplatform.com/en/blocks/5f... \n", + "18 https://explorer.ergoplatform.com/en/blocks/2c... \n", + "19 https://explorer.ergoplatform.com/en/blocks/92... \n", + "20 https://explorer.ergoplatform.com/en/blocks/9a... \n", + "21 https://explorer.ergoplatform.com/en/blocks/2e... \n", + "22 https://explorer.ergoplatform.com/en/blocks/c7... \n", + "23 https://explorer.ergoplatform.com/en/blocks/40... \n", + "24 https://explorer.ergoplatform.com/en/blocks/32... \n", + "25 https://explorer.ergoplatform.com/en/blocks/02... \n", + "26 https://explorer.ergoplatform.com/en/blocks/b2... \n", + "27 https://explorer.ergoplatform.com/en/blocks/b3... \n", + "28 https://explorer.ergoplatform.com/en/blocks/2d... \n", + "29 https://explorer.ergoplatform.com/en/blocks/d0... \n", + "30 https://explorer.ergoplatform.com/en/blocks/32... \n", + "31 https://explorer.ergoplatform.com/en/blocks/4a... \n", + "32 https://explorer.ergoplatform.com/en/blocks/79... \n", + "33 https://explorer.ergoplatform.com/en/blocks/d5... \n", + "34 https://explorer.ergoplatform.com/en/blocks/d3... \n", + "35 https://explorer.ergoplatform.com/en/blocks/a8... \n", + "36 https://explorer.ergoplatform.com/en/blocks/2c... \n", + "37 https://explorer.ergoplatform.com/en/blocks/39... \n", + "38 https://explorer.ergoplatform.com/en/blocks/c0... \n", + "39 https://explorer.ergoplatform.com/en/blocks/10... \n", + "40 https://explorer.ergoplatform.com/en/blocks/db... \n", + "41 https://explorer.ergoplatform.com/en/blocks/c0... \n", + "42 https://explorer.ergoplatform.com/en/blocks/91... \n", + "43 https://explorer.ergoplatform.com/en/blocks/ed... \n", + "44 https://explorer.ergoplatform.com/en/blocks/f4... \n", + "45 https://explorer.ergoplatform.com/en/blocks/bd... \n", + "46 https://explorer.ergoplatform.com/en/blocks/00... \n", + "47 https://explorer.ergoplatform.com/en/blocks/ba... \n", + "48 https://explorer.ergoplatform.com/en/blocks/85... \n", + "49 https://explorer.ergoplatform.com/en/blocks/bf... \n", + "50 https://explorer.ergoplatform.com/en/blocks/48... \n", + "51 https://explorer.ergoplatform.com/en/blocks/0f... \n", + "52 https://explorer.ergoplatform.com/en/blocks/20... \n", + "53 https://explorer.ergoplatform.com/en/blocks/27... \n", + "54 https://explorer.ergoplatform.com/en/blocks/33... \n", + "55 https://explorer.ergoplatform.com/en/blocks/2e... \n", + "56 https://explorer.ergoplatform.com/en/blocks/c5... \n", + "57 https://explorer.ergoplatform.com/en/blocks/b0... \n", + "58 https://explorer.ergoplatform.com/en/blocks/83... \n", + "59 https://explorer.ergoplatform.com/en/blocks/47... \n", + "\n", + " hash \\\n", + "0 7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36... \n", + "1 44167cd62e4406f726826b15a0fcf6e843fade6c445102... \n", + "2 d009bdd64433367b30dcf2493ccfa43329d2383ca288b0... \n", + "3 881144c4c46b08e39d59817863da508be56c215eafb8eb... \n", + "4 9395fce740c65f238690a5639a2938e0bce75b8a28b065... \n", + "5 f12b63d2743427539774bdc9f76bb207fa7a82b659cfa4... \n", + "6 9d7544bf89b699e7d31eaf49c4b8610d62d6545c1de9d2... \n", + "7 58be0effcc39dc7fc6bbc745acfd627ff3e30eab98668c... \n", + "8 a4dc120a4aa17097a163160eeb41c3dba31780f4086491... \n", + "9 2be39f033f12f55638a0e9a8755b7f96b73d15b948990c... \n", + "10 f826ef482455161ca689de707f3c239b3ca8a6e7360a2c... \n", + "11 c7c63f408c339ae4482914cbb8e93ad48b17defd20ec90... \n", + "12 4fea81e1a1a823f1c395a7d0757208381c9f6da4f68b83... \n", + "13 224c94abcd0ffa48553f6988c34bcb92c2490e76861f1c... \n", + "14 acb0c18d072bc0fc0d0e69e95cb07ba996b53ef0ac669a... \n", + "15 2f38ffbece540e4177f81615ad3130929dbf1855fcccff... \n", + "16 177fd26d67b248b8fa2b0f734be71628114fa12249403a... \n", + "17 5f999a0dbbaef1e2202acaa7a9c1dbea3cbcc7926dd9c8... \n", + "18 2c43ae9a107e279e6aaf50ddda74652235cddc42d7f7e6... \n", + "19 92e5d017e11243bae0295199fdab7b8b08ccb9363228ee... \n", + "20 9a9c4c8fbd571a877a7f197e40c4d33d265307b23634ad... \n", + "21 2e086f5d1d55e2476586f0ae72caeb77d0093c2faef6c4... \n", + "22 c7b7ef3a8c7af63a7729de240de056beff246f9d99aebd... \n", + "23 40823fa0c172fc5f3a8ebcc79f8557f776d502abeceff0... \n", + "24 3255824876c9afc17a051e4fec4f2fb9a502d91a31d60e... \n", + "25 023d3db990a609673fb2143fdfd110f959928864ee5ba0... \n", + "26 b25a01e4b603f883cbe139725e8377ea798ef7bf5e5ffb... \n", + "27 b3dc77df25368a64370eba7b7e0f2392e5a9c3fe4cd297... \n", + "28 2d2fd8c12850c9f1a00c38aa79aba813554f7a383c4be6... \n", + "29 d0b39e75edf0099c62ce1fc97bef7dd51695659255ec7f... \n", + "30 32df796eeeeb916349df58e3263011fc13e2064202638d... \n", + "31 4ac405b82c909606840b4abb83acd42e79aa74ac9dfcfa... \n", + "32 7994b89a991f3a3589d54772c4e30437894c691aa0dfd6... \n", + "33 d51a06c21ece88a1935e2eca6a3d1ba1e82507dc7cb114... \n", + "34 d37d915b800e4b8fce3eb97ace72d1b8ecf1c35eecbf52... \n", + "35 a8134a002699294a2cb40e3f4eb3603ede1bdcae3cd0de... \n", + "36 2c36f7618aef25e20373b4832dbbdc6f95784909a40218... \n", + "37 3951d2d140cca3c5138162008137ea4c703f1cdc4a16c2... \n", + "38 c0e3620bcbce50d12b892ec9c42106e803157d14bcfc96... \n", + "39 106552ecd414d016d00bb6aac33233b40e0de0e96752ad... \n", + "40 db56d46b7963b5dd508c2bdb1507303c8263e6ccad1b47... \n", + "41 c006a33b7d2f4a4019919c278f5429608902fe3e51b1e1... \n", + "42 915a48e58976142360cc5233b6033ad2a3e2f06cda7dc1... \n", + "43 edd2c6e48ef6cc480c95a58dcb24c4125c1136d7aa4c22... \n", + "44 f49ecdd5eff7e5d0d05d0eb65c7818f31fcd82ebf5df86... \n", + "45 bd3099462e5eba95a4e8e809232f6788f2664e4a344eae... \n", + "46 000eacceb597c08feeb2a67ea6f0b804d9dc185c0e0630... \n", + "47 babafdf183a977d3ef1cf8823f241e3393ac0472f9a00e... \n", + "48 85775b03bae1f4c46c3b444bd511838d5fb9cd326c8462... \n", + "49 bfce9fe97cbc219e80858ee257f664fd3ad9ff713ed12c... \n", + "50 48044bb6835294495eb17744326b63f3183a629ab44767... \n", + "51 0f56bc5a2f2b9f179c81feeab3022723bc60df72ad4121... \n", + "52 20b806d4bd9cc58f6cc04ffdeaffd6e68c07f66e422e78... \n", + "53 278a4a533165aa5c63f8f79bb8a1ab9d29e1a62d254139... \n", + "54 3360f32693fd991c229e6a3b095eb2ff6e0367dcbac370... \n", + "55 2e2b04e088834393eafa5aac17d0fc641f4a188d6dc873... \n", + "56 c5886b3606b842b4a0ecaeda2d6270ac3238e7e0da37d2... \n", + "57 b03937a8404d47fed3d7050a93a6e6b940100e4c008a66... \n", + "58 83c740633d4aa9e61775dcab0d2ef20dd4d11c275424fa... \n", + "59 47dd2792f0fd255fc8fc4b0a12903b351245fb7083ea5e... \n", + "\n", + " miner source \\\n", + "0 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "1 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "2 9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y... ErgoSigmanauts \n", + "3 9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN... ErgoSigmanauts \n", + "4 9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE... ErgoSigmanauts \n", + "5 9hSk13XDU8keWAp3KxKSgUVCkfDcw577jAjM6SgbRpuYeL... ErgoSigmanauts \n", + "6 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "7 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "8 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "9 9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y... ErgoSigmanauts \n", + "10 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "11 9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd... ErgoSigmanauts \n", + "12 9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN... ErgoSigmanauts \n", + "13 9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu... ErgoSigmanauts \n", + "14 9eZVqXVnrVWQKK19b7E7kp4ZyNqanp2z1mpKUJRaouNsme... ErgoSigmanauts \n", + "15 9ggYKoC58jQkbGNhCKqcLMsuK3qCE5ieqTPx28KrY5jJ5S... ErgoSigmanauts \n", + "16 9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC... ErgoSigmanauts \n", + "17 9f5vwtxyRP87wmc8ezyKbL7ryaNhDrgWUVBEZpQKnw16SW... ErgoSigmanauts \n", + "18 9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu... ErgoSigmanauts \n", + "19 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "20 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "21 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "22 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "23 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "24 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "25 9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd... ErgoSigmanauts \n", + "26 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "27 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "28 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "29 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "30 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "31 9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4... ErgoSigmanauts \n", + "32 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "33 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "34 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "35 9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC... ErgoSigmanauts \n", + "36 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "37 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "38 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "39 9f7851wUuymT3jiaaFQ5Uv3QUmCHsahCR43syFbc1nDRSH... ErgoSigmanauts \n", + "40 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "41 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "42 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "43 9eZPTmn8zp5GJ7KZwTo8cEuxNdezWaY3hBbLeWid7EAZed... ErgoSigmanauts \n", + "44 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "45 9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq... ErgoSigmanauts \n", + "46 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "47 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "48 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "49 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "50 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "51 9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq... ErgoSigmanauts \n", + "52 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "53 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "54 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "55 9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4... ErgoSigmanauts \n", + "56 9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw... ErgoSigmanauts \n", + "57 9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw... ErgoSigmanauts \n", + "58 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "59 9iQS22vfWdF2N84Lvv9jgAMFGLyL7t17SWbHGEfaddaG7Z... ErgoSigmanauts \n", + "\n", + " time_found \n", + "0 2024-04-29 08:20:04 \n", + "1 2024-04-28 23:18:22 \n", + "2 2024-04-28 17:16:48 \n", + "3 2024-04-28 16:09:49 \n", + "4 2024-04-28 12:59:58 \n", + "5 2024-04-28 03:06:52 \n", + "6 2024-04-28 02:55:03 \n", + "7 2024-04-27 07:59:45 \n", + "8 2024-04-27 06:54:45 \n", + "9 2024-04-27 04:31:16 \n", + "10 2024-04-26 18:24:58 \n", + "11 2024-04-26 16:00:40 \n", + "12 2024-04-23 22:19:10 \n", + "13 2024-04-23 19:17:03 \n", + "14 2024-04-23 19:06:49 \n", + "15 2024-04-23 12:18:50 \n", + "16 2024-04-22 22:07:16 \n", + "17 2024-04-22 18:11:34 \n", + "18 2024-04-22 09:12:21 \n", + "19 2024-04-21 18:58:55 \n", + "20 2024-04-21 16:57:09 \n", + "21 2024-04-21 15:49:03 \n", + "22 2024-04-21 05:49:18 \n", + "23 2024-04-19 17:13:40 \n", + "24 2024-04-19 10:06:26 \n", + "25 2024-04-19 09:41:15 \n", + "26 2024-04-19 08:45:52 \n", + "27 2024-04-18 09:31:37 \n", + "28 2024-04-18 08:01:31 \n", + "29 2024-04-18 03:11:44 \n", + "30 2024-04-17 21:39:45 \n", + "31 2024-04-17 01:03:11 \n", + "32 2024-04-16 20:53:07 \n", + "33 2024-04-15 13:26:36 \n", + "34 2024-04-15 05:58:59 \n", + "35 2024-04-14 19:46:29 \n", + "36 2024-04-14 07:53:57 \n", + "37 2024-04-13 01:40:15 \n", + "38 2024-04-10 21:52:48 \n", + "39 2024-04-10 16:45:58 \n", + "40 2024-04-10 11:38:14 \n", + "41 2024-04-09 23:57:08 \n", + "42 2024-04-08 14:35:09 \n", + "43 2024-04-07 19:55:43 \n", + "44 2024-04-06 00:11:43 \n", + "45 2024-04-04 23:46:44 \n", + "46 2024-04-04 01:40:19 \n", + "47 2024-04-03 18:22:18 \n", + "48 2024-04-03 04:57:28 \n", + "49 2024-03-31 07:40:29 \n", + "50 2024-03-31 06:53:18 \n", + "51 2024-03-31 02:11:27 \n", + "52 2024-03-29 22:22:38 \n", + "53 2024-03-29 04:26:22 \n", + "54 2024-03-28 16:41:02 \n", + "55 2024-03-28 15:40:37 \n", + "56 2024-03-28 08:26:49 \n", + "57 2024-03-27 18:07:25 \n", + "58 2024-03-19 04:19:20 \n", + "59 2024-03-16 06:45:27 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "port_data = pool['ports']\n", + "block_data.append(new_block_data)\n", + "for data in block_data:\n", + " # data['rolling_effort'] = data['effort'].expanding().mean()\n", + " data['time_found'] = format_datetime(data.pop('created'))\n", + " data['confirmationProgress'] = data['confirmationProgress'] * 100\n", + " data['networkDifficulty'] = round(data['networkDifficulty'], 2)\n", + " data['effort'] = round(data['effort'], 2)\n", + " data['reward'] = round(data['reward'], 2)\n", + " data['miner'] = '{}...{}'.format(data['miner'][:3], data['miner'][-5:])\n", + " # database.update_or_insert('block', data)\n", "\n", - "ls = []\n", - "for port in port_data:\n", - " temp = port_data[port]\n", - " if 'pikes_peak' in temp['name']:\n", - " high_or_low = 'Greater Than 10GH/s'\n", - " else:\n", - " high_or_low = 'Lower Than 10GH/s'\n", - " ls.append([temp['name'], port, high_or_low, temp['tls']])\n", - "df = pd.DataFrame(ls, columns=['Name', 'Port', 'Hashrate Threshold', 'TLS'])\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5783369d-a845-464b-8b71-9e8367654aa7", - "metadata": {}, - "outputs": [], - "source": [ - "pool_fee = pool['poolFeePercent']\n", - "pool_stats = pool['poolStats']\n", - "net_stats = pool['networkStats']\n", - "total_paid = pool['totalPaid']\n", - "total_blocks = pool['totalBlocks']\n", - "last_block_found = pool['lastPoolBlockTime']\n", - "pool_effort = pool['poolEffort']" + "database.fetch_data('block')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "633f2021-d800-4a91-8856-2df66b1d4a08", - "metadata": {}, - "outputs": [], - "source": [ - "net_stats\n", - "del net_stats['connectedPeers']\n", - "del net_stats['rewardType']\n", - "del net_stats['networkType']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7da87e9e-2f1b-4666-9dc0-07317362fc94", - "metadata": {}, - "outputs": [], - "source": [ - "pool_stats" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bb63de0b-8816-4168-bf78-06f494565f7c", - "metadata": {}, - "outputs": [], - "source": [ - "import dash" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cfbfee47-dfba-4e6f-957d-959e8ee5eb4a", - "metadata": {}, - "outputs": [], - "source": [ - "data = reader.get_front_page_data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fad6250d-b195-4de8-9cc4-856bb8882fb3", - "metadata": {}, - "outputs": [], + "execution_count": 19, + "id": "64e890c1-c59e-4ac8-9bc2-98664033a5a1", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/whaleshark/Documents/sigmanaut-mining-pool-ui/utils/db_util.py:176: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " return pd.read_sql_query(query, self.conn)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
poolidblockheightnetworkdifficultystatusconfirmationprogressefforttransactionconfirmationdatarewardinfolinkhashminersourcetime_found
0ErgoSigmanauts1253410354831.655250confirmed1.01.045866580c001f31e4fd3a27.000000https://explorer.ergoplatform.com/en/blocks/7a...7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-29 08:20:04
1ErgoSigmanauts1253118362089.481987confirmed1.00.64787450239669e1ac4af827.000000https://explorer.ergoplatform.com/en/blocks/44...44167cd62e4406f726826b15a0fcf6e843fade6c445102...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-28 23:18:22
2ErgoSigmanauts1252956390351.076394confirmed1.00.11251757f9f469dba977c327.009200https://explorer.ergoplatform.com/en/blocks/d0...d009bdd64433367b30dcf2493ccfa43329d2383ca288b0...9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y...ErgoSigmanauts2024-04-28 17:16:48
3ErgoSigmanauts1252929390351.076394confirmed1.00.3130745016a01340d6b9ba27.653129https://explorer.ergoplatform.com/en/blocks/88...881144c4c46b08e39d59817863da508be56c215eafb8eb...9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN...ErgoSigmanauts2024-04-28 16:09:49
4ErgoSigmanauts1252840350627.704840confirmed1.00.96422857f1000efc558ff127.019200https://explorer.ergoplatform.com/en/blocks/93...9395fce740c65f238690a5639a2938e0bce75b8a28b065...9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE...ErgoSigmanauts2024-04-28 12:59:58
5ErgoSigmanauts1252559422881.658950confirmed1.00.01770056dcc160776a8a7127.022100https://explorer.ergoplatform.com/en/blocks/f1...f12b63d2743427539774bdc9f76bb207fa7a82b659cfa4...9hSk13XDU8keWAp3KxKSgUVCkfDcw577jAjM6SgbRpuYeL...ErgoSigmanauts2024-04-28 03:06:52
6ErgoSigmanauts1252553422881.658950confirmed1.01.85688250230ed620a8fa0b27.000000https://explorer.ergoplatform.com/en/blocks/9d...9d7544bf89b699e7d31eaf49c4b8610d62d6545c1de9d2...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-28 02:55:03
7ErgoSigmanauts1251978380358.285885confirmed1.00.11252550a300044822864227.001000https://explorer.ergoplatform.com/en/blocks/58...58be0effcc39dc7fc6bbc745acfd627ff3e30eab98668c...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-27 07:59:45
8ErgoSigmanauts1251939366775.443497confirmed1.00.244779502468dac362205227.018200https://explorer.ergoplatform.com/en/blocks/a4...a4dc120a4aa17097a163160eeb41c3dba31780f4086491...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-27 06:54:45
9ErgoSigmanauts1251871366775.443497confirmed1.01.03993150d8fd9c81187de227.008800https://explorer.ergoplatform.com/en/blocks/2b...2be39f033f12f55638a0e9a8755b7f96b73d15b948990c...9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y...ErgoSigmanauts2024-04-27 04:31:16
10ErgoSigmanauts1251567388383.156547confirmed1.00.261117555f000b343364e427.005100https://explorer.ergoplatform.com/en/blocks/f8...f826ef482455161ca689de707f3c239b3ca8a6e7360a2c...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-26 18:24:58
11ErgoSigmanauts1251499388383.156547confirmed1.06.396079507971cae2ee4a1827.004200https://explorer.ergoplatform.com/en/blocks/c7...c7c63f408c339ae4482914cbb8e93ad48b17defd20ec90...9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd...ErgoSigmanauts2024-04-26 16:00:40
12ErgoSigmanauts1249527315887.249576confirmed1.00.34152750164a42c64cc4f127.015100https://explorer.ergoplatform.com/en/blocks/4f...4fea81e1a1a823f1c395a7d0757208381c9f6da4f68b83...9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN...ErgoSigmanauts2024-04-23 22:19:10
13ErgoSigmanauts1249440315887.249576confirmed1.00.01921650187b62b18da53527.010000https://explorer.ergoplatform.com/en/blocks/22...224c94abcd0ffa48553f6988c34bcb92c2490e76861f1c...9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu...ErgoSigmanauts2024-04-23 19:17:03
14ErgoSigmanauts1249432315887.249576confirmed1.00.6392275057d49b44b4ed2127.012200https://explorer.ergoplatform.com/en/blocks/ac...acb0c18d072bc0fc0d0e69e95cb07ba996b53ef0ac669a...9eZVqXVnrVWQKK19b7E7kp4ZyNqanp2z1mpKUJRaouNsme...ErgoSigmanauts2024-04-23 19:06:49
15ErgoSigmanauts1249230361687.597350confirmed1.01.2624301bdb3e4628f615be27.006300https://explorer.ergoplatform.com/en/blocks/2f...2f38ffbece540e4177f81615ad3130929dbf1855fcccff...9ggYKoC58jQkbGNhCKqcLMsuK3qCE5ieqTPx28KrY5jJ5S...ErgoSigmanauts2024-04-23 12:18:50
16ErgoSigmanauts1248838426627.604763confirmed1.00.351294186e549eb8340f1227.034400https://explorer.ergoplatform.com/en/blocks/17...177fd26d67b248b8fa2b0f734be71628114fa12249403a...9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC...ErgoSigmanauts2024-04-22 22:07:16
17ErgoSigmanauts1248716402639.913195confirmed1.00.6859161c96000783680ce227.008244https://explorer.ergoplatform.com/en/blocks/5f...5f999a0dbbaef1e2202acaa7a9c1dbea3cbcc7926dd9c8...9f5vwtxyRP87wmc8ezyKbL7ryaNhDrgWUVBEZpQKnw16SW...ErgoSigmanauts2024-04-22 18:11:34
18ErgoSigmanauts1248443380709.272335confirmed1.01.001987188b8a2690b7756927.007400https://explorer.ergoplatform.com/en/blocks/2c...2c43ae9a107e279e6aaf50ddda74652235cddc42d7f7e6...9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu...ErgoSigmanauts2024-04-22 09:12:21
19ErgoSigmanauts1248031396231.066521confirmed1.00.1612051c1800034e77b16627.001960https://explorer.ergoplatform.com/en/blocks/92...92e5d017e11243bae0295199fdab7b8b08ccb9363228ee...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-21 18:58:55
20ErgoSigmanauts1247949334193.979483confirmed1.00.0949271bf4a728749d7de827.001000https://explorer.ergoplatform.com/en/blocks/9a...9a9c4c8fbd571a877a7f197e40c4d33d265307b23634ad...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-21 16:57:09
21ErgoSigmanauts1247906334193.979483confirmed1.00.6902871a16000df545608327.026500https://explorer.ergoplatform.com/en/blocks/2e...2e086f5d1d55e2476586f0ae72caeb77d0093c2faef6c4...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-21 15:49:03
22ErgoSigmanauts1247634390680.078087confirmed1.03.0398631a1329402f2206ed27.069355https://explorer.ergoplatform.com/en/blocks/c7...c7b7ef3a8c7af63a7729de240de056beff246f9d99aebd...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-21 05:49:18
23ErgoSigmanauts1246555371421.349703confirmed1.00.53527512fc6a2219199f2a27.012000https://explorer.ergoplatform.com/en/blocks/40...40823fa0c172fc5f3a8ebcc79f8557f776d502abeceff0...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-19 17:13:40
24ErgoSigmanauts1246329338457.841118confirmed1.00.0333131642835a069e4fb927.025700https://explorer.ergoplatform.com/en/blocks/32...3255824876c9afc17a051e4fec4f2fb9a502d91a31d60e...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-19 10:06:26
25ErgoSigmanauts1246316338457.841118confirmed1.00.072236146857274f45ac2c27.180640https://explorer.ergoplatform.com/en/blocks/02...023d3db990a609673fb2143fdfd110f959928864ee5ba0...9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd...ErgoSigmanauts2024-04-19 09:41:15
26ErgoSigmanauts1246282338457.841118confirmed1.02.084016164237aca8296f1c27.012601https://explorer.ergoplatform.com/en/blocks/b2...b25a01e4b603f883cbe139725e8377ea798ef7bf5e5ffb...9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG...ErgoSigmanauts2024-04-19 08:45:52
27ErgoSigmanauts1245573345942.822277confirmed1.00.11677212a8cc865d1eb6b127.001253https://explorer.ergoplatform.com/en/blocks/b3...b3dc77df25368a64370eba7b7e0f2392e5a9c3fe4cd297...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-04-18 09:31:37
28ErgoSigmanauts1245528323130.127436confirmed1.00.361345126a0007f2a34c7c27.000000https://explorer.ergoplatform.com/en/blocks/2d...2d2fd8c12850c9f1a00c38aa79aba813554f7a383c4be6...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-18 08:01:31
29ErgoSigmanauts1245375343213.854779confirmed1.00.384602126b001c1226e66627.004100https://explorer.ergoplatform.com/en/blocks/d0...d0b39e75edf0099c62ce1fc97bef7dd51695659255ec7f...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-18 03:11:44
30ErgoSigmanauts1245219385248.184230confirmed1.01.361363123200132a4f005327.001000https://explorer.ergoplatform.com/en/blocks/32...32df796eeeeb916349df58e3263011fc13e2064202638d...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-17 21:39:45
31ErgoSigmanauts1244611350337.673747confirmed1.00.30406013309b8b1531ac3d27.004400https://explorer.ergoplatform.com/en/blocks/4a...4ac405b82c909606840b4abb83acd42e79aa74ac9dfcfa...9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4...ErgoSigmanauts2024-04-17 01:03:11
32ErgoSigmanauts1244487347763.784750confirmed1.02.109182126b0037bf192dd927.004000https://explorer.ergoplatform.com/en/blocks/79...7994b89a991f3a3589d54772c4e30437894c691aa0dfd6...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-04-16 20:53:07
33ErgoSigmanauts1243556346496.758155confirmed1.00.384074121c61dad76dde6427.002200https://explorer.ergoplatform.com/en/blocks/d5...d51a06c21ece88a1935e2eca6a3d1ba1e82507dc7cb114...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-15 13:26:36
34ErgoSigmanauts1243309317174.205629confirmed1.00.4703621232000391a2d9da27.009000https://explorer.ergoplatform.com/en/blocks/d3...d37d915b800e4b8fce3eb97ace72d1b8ecf1c35eecbf52...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-15 05:58:59
35ErgoSigmanauts1243018353518.612001confirmed1.00.517238124d61659aa64c7a27.076500https://explorer.ergoplatform.com/en/blocks/a8...a8134a002699294a2cb40e3f4eb3603ede1bdcae3cd0de...9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC...ErgoSigmanauts2024-04-14 19:46:29
36ErgoSigmanauts1242682379295.328612confirmed1.01.39456112200009ea03884927.017500https://explorer.ergoplatform.com/en/blocks/2c...2c36f7618aef25e20373b4832dbbdc6f95784909a40218...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-04-14 07:53:57
37ErgoSigmanauts1241796370202.405388confirmed1.01.98051410c71b4fad01f31c27.052025https://explorer.ergoplatform.com/en/blocks/39...3951d2d140cca3c5138162008137ea4c703f1cdc4a16c2...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-13 01:40:15
38ErgoSigmanauts1240237406987.879722confirmed1.00.156104100fe6c78281bfae27.130969https://explorer.ergoplatform.com/en/blocks/c0...c0e3620bcbce50d12b892ec9c42106e803157d14bcfc96...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-10 21:52:48
39ErgoSigmanauts1240101411836.853619confirmed1.00.17779310da0014d0866a1a27.006200https://explorer.ergoplatform.com/en/blocks/10...106552ecd414d016d00bb6aac33233b40e0de0e96752ad...9f7851wUuymT3jiaaFQ5Uv3QUmCHsahCR43syFbc1nDRSH...ErgoSigmanauts2024-04-10 16:45:58
40ErgoSigmanauts1239922414752.684611confirmed1.00.37917010111463352887a327.001100https://explorer.ergoplatform.com/en/blocks/db...db56d46b7963b5dd508c2bdb1507303c8263e6ccad1b47...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-10 11:38:14
41ErgoSigmanauts1239612395105.076364confirmed1.01.27033110c7e206ff3da33e27.029100https://explorer.ergoplatform.com/en/blocks/c0...c006a33b7d2f4a4019919c278f5429608902fe3e51b1e1...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-09 23:57:08
42ErgoSigmanauts1238592386279.122336confirmed1.00.60845910c72dc2ea84ee3e27.002000https://explorer.ergoplatform.com/en/blocks/91...915a48e58976142360cc5233b6033ad2a3e2f06cda7dc1...9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ...ErgoSigmanauts2024-04-08 14:35:09
43ErgoSigmanauts1238040399941.963788confirmed1.01.240973101010806c3bfec230.005000https://explorer.ergoplatform.com/en/blocks/ed...edd2c6e48ef6cc480c95a58dcb24c4125c1136d7aa4c22...9eZPTmn8zp5GJ7KZwTo8cEuxNdezWaY3hBbLeWid7EAZed...ErgoSigmanauts2024-04-07 19:55:43
44ErgoSigmanauts1236735385434.149366confirmed1.00.675790100d40c8c30375f930.025167https://explorer.ergoplatform.com/en/blocks/f4...f49ecdd5eff7e5d0d05d0eb65c7818f31fcd82ebf5df86...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-06 00:11:43
45ErgoSigmanauts1235990387916.169692confirmed1.00.52528620058216259db39230.010000https://explorer.ergoplatform.com/en/blocks/bd...bd3099462e5eba95a4e8e809232f6788f2664e4a344eae...9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq...ErgoSigmanauts2024-04-04 23:46:44
46ErgoSigmanauts1235365466883.931372confirmed1.00.169038d0db3663848642f530.068900https://explorer.ergoplatform.com/en/blocks/00...000eacceb597c08feeb2a67ea6f0b804d9dc185c0e0630...9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ...ErgoSigmanauts2024-04-04 01:40:19
47ErgoSigmanauts1235136433886.497034confirmed1.00.348562d4481db8a168230330.007660https://explorer.ergoplatform.com/en/blocks/ba...babafdf183a977d3ef1cf8823f241e3393ac0472f9a00e...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-04-03 18:22:18
48ErgoSigmanauts1234733425282.536901confirmed1.01.926869d43cfb8db6bde05730.008316https://explorer.ergoplatform.com/en/blocks/85...85775b03bae1f4c46c3b444bd511838d5fb9cd326c8462...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-04-03 04:57:28
49ErgoSigmanauts1232662385380.245572confirmed1.00.025904d88e000ab46f7e8a30.000000https://explorer.ergoplatform.com/en/blocks/bf...bfce9fe97cbc219e80858ee257f664fd3ad9ff713ed12c...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-31 07:40:29
50ErgoSigmanauts1232628363957.496239confirmed1.00.237322d10ffd6af9eca40630.000000https://explorer.ergoplatform.com/en/blocks/48...48044bb6835294495eb17744326b63f3183a629ab44767...9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K...ErgoSigmanauts2024-03-31 06:53:18
51ErgoSigmanauts1232487360630.583506confirmed1.01.012745dee5be1bf40de25e30.013800https://explorer.ergoplatform.com/en/blocks/0f...0f56bc5a2f2b9f179c81feeab3022723bc60df72ad4121...9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq...ErgoSigmanauts2024-03-31 02:11:27
52ErgoSigmanauts1231651367785.409859confirmed1.00.466819daa5cc820eedd3d930.001500https://explorer.ergoplatform.com/en/blocks/20...20b806d4bd9cc58f6cc04ffdeaffd6e68c07f66e422e78...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-29 22:22:38
53ErgoSigmanauts1231144405099.842403confirmed1.00.329434d88f00142c1483c130.002000https://explorer.ergoplatform.com/en/blocks/27...278a4a533165aa5c63f8f79bb8a1ab9d29e1a62d254139...9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV...ErgoSigmanauts2024-03-29 04:26:22
54ErgoSigmanauts1230782360986.500966confirmed1.00.030553d00cd5ba5f2b167c30.088260https://explorer.ergoplatform.com/en/blocks/33...3360f32693fd991c229e6a3b095eb2ff6e0367dcbac370...9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ...ErgoSigmanauts2024-03-28 16:41:02
55ErgoSigmanauts1230749360986.500966confirmed1.00.287231d8a48cee009b608c30.006550https://explorer.ergoplatform.com/en/blocks/2e...2e2b04e088834393eafa5aac17d0fc641f4a188d6dc873...9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4...ErgoSigmanauts2024-03-28 15:40:37
56ErgoSigmanauts1230547434381.378191confirmed1.00.797385d6c1191549ab2f0730.027600https://explorer.ergoplatform.com/en/blocks/c5...c5886b3606b842b4a0ecaeda2d6270ac3238e7e0da37d2...9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw...ErgoSigmanauts2024-03-28 08:26:49
57ErgoSigmanauts1230104347635.796935confirmed1.04.752955d153e8105c7c0b5730.001000https://explorer.ergoplatform.com/en/blocks/b0...b03937a8404d47fed3d7050a93a6e6b940100e4c008a66...9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw...ErgoSigmanauts2024-03-27 18:07:25
58ErgoSigmanauts1223980416310.690227confirmed1.00.895507300b000932aead3a30.007862https://explorer.ergoplatform.com/en/blocks/83...83c740633d4aa9e61775dcab0d2ef20dd4d11c275424fa...9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ...ErgoSigmanauts2024-03-19 04:19:20
59ErgoSigmanauts1221911421209.622611confirmed1.02.867494705c89a6a4e552cf30.007100https://explorer.ergoplatform.com/en/blocks/47...47dd2792f0fd255fc8fc4b0a12903b351245fb7083ea5e...9iQS22vfWdF2N84Lvv9jgAMFGLyL7t17SWbHGEfaddaG7Z...ErgoSigmanauts2024-03-16 06:45:27
\n", + "
" + ], + "text/plain": [ + " poolid blockheight networkdifficulty status \\\n", + "0 ErgoSigmanauts 1253410 354831.655250 confirmed \n", + "1 ErgoSigmanauts 1253118 362089.481987 confirmed \n", + "2 ErgoSigmanauts 1252956 390351.076394 confirmed \n", + "3 ErgoSigmanauts 1252929 390351.076394 confirmed \n", + "4 ErgoSigmanauts 1252840 350627.704840 confirmed \n", + "5 ErgoSigmanauts 1252559 422881.658950 confirmed \n", + "6 ErgoSigmanauts 1252553 422881.658950 confirmed \n", + "7 ErgoSigmanauts 1251978 380358.285885 confirmed \n", + "8 ErgoSigmanauts 1251939 366775.443497 confirmed \n", + "9 ErgoSigmanauts 1251871 366775.443497 confirmed \n", + "10 ErgoSigmanauts 1251567 388383.156547 confirmed \n", + "11 ErgoSigmanauts 1251499 388383.156547 confirmed \n", + "12 ErgoSigmanauts 1249527 315887.249576 confirmed \n", + "13 ErgoSigmanauts 1249440 315887.249576 confirmed \n", + "14 ErgoSigmanauts 1249432 315887.249576 confirmed \n", + "15 ErgoSigmanauts 1249230 361687.597350 confirmed \n", + "16 ErgoSigmanauts 1248838 426627.604763 confirmed \n", + "17 ErgoSigmanauts 1248716 402639.913195 confirmed \n", + "18 ErgoSigmanauts 1248443 380709.272335 confirmed \n", + "19 ErgoSigmanauts 1248031 396231.066521 confirmed \n", + "20 ErgoSigmanauts 1247949 334193.979483 confirmed \n", + "21 ErgoSigmanauts 1247906 334193.979483 confirmed \n", + "22 ErgoSigmanauts 1247634 390680.078087 confirmed \n", + "23 ErgoSigmanauts 1246555 371421.349703 confirmed \n", + "24 ErgoSigmanauts 1246329 338457.841118 confirmed \n", + "25 ErgoSigmanauts 1246316 338457.841118 confirmed \n", + "26 ErgoSigmanauts 1246282 338457.841118 confirmed \n", + "27 ErgoSigmanauts 1245573 345942.822277 confirmed \n", + "28 ErgoSigmanauts 1245528 323130.127436 confirmed \n", + "29 ErgoSigmanauts 1245375 343213.854779 confirmed \n", + "30 ErgoSigmanauts 1245219 385248.184230 confirmed \n", + "31 ErgoSigmanauts 1244611 350337.673747 confirmed \n", + "32 ErgoSigmanauts 1244487 347763.784750 confirmed \n", + "33 ErgoSigmanauts 1243556 346496.758155 confirmed \n", + "34 ErgoSigmanauts 1243309 317174.205629 confirmed \n", + "35 ErgoSigmanauts 1243018 353518.612001 confirmed \n", + "36 ErgoSigmanauts 1242682 379295.328612 confirmed \n", + "37 ErgoSigmanauts 1241796 370202.405388 confirmed \n", + "38 ErgoSigmanauts 1240237 406987.879722 confirmed \n", + "39 ErgoSigmanauts 1240101 411836.853619 confirmed \n", + "40 ErgoSigmanauts 1239922 414752.684611 confirmed \n", + "41 ErgoSigmanauts 1239612 395105.076364 confirmed \n", + "42 ErgoSigmanauts 1238592 386279.122336 confirmed \n", + "43 ErgoSigmanauts 1238040 399941.963788 confirmed \n", + "44 ErgoSigmanauts 1236735 385434.149366 confirmed \n", + "45 ErgoSigmanauts 1235990 387916.169692 confirmed \n", + "46 ErgoSigmanauts 1235365 466883.931372 confirmed \n", + "47 ErgoSigmanauts 1235136 433886.497034 confirmed \n", + "48 ErgoSigmanauts 1234733 425282.536901 confirmed \n", + "49 ErgoSigmanauts 1232662 385380.245572 confirmed \n", + "50 ErgoSigmanauts 1232628 363957.496239 confirmed \n", + "51 ErgoSigmanauts 1232487 360630.583506 confirmed \n", + "52 ErgoSigmanauts 1231651 367785.409859 confirmed \n", + "53 ErgoSigmanauts 1231144 405099.842403 confirmed \n", + "54 ErgoSigmanauts 1230782 360986.500966 confirmed \n", + "55 ErgoSigmanauts 1230749 360986.500966 confirmed \n", + "56 ErgoSigmanauts 1230547 434381.378191 confirmed \n", + "57 ErgoSigmanauts 1230104 347635.796935 confirmed \n", + "58 ErgoSigmanauts 1223980 416310.690227 confirmed \n", + "59 ErgoSigmanauts 1221911 421209.622611 confirmed \n", + "\n", + " confirmationprogress effort transactionconfirmationdata reward \\\n", + "0 1.0 1.045866 580c001f31e4fd3a 27.000000 \n", + "1 1.0 0.647874 50239669e1ac4af8 27.000000 \n", + "2 1.0 0.112517 57f9f469dba977c3 27.009200 \n", + "3 1.0 0.313074 5016a01340d6b9ba 27.653129 \n", + "4 1.0 0.964228 57f1000efc558ff1 27.019200 \n", + "5 1.0 0.017700 56dcc160776a8a71 27.022100 \n", + "6 1.0 1.856882 50230ed620a8fa0b 27.000000 \n", + "7 1.0 0.112525 50a3000448228642 27.001000 \n", + "8 1.0 0.244779 502468dac3622052 27.018200 \n", + "9 1.0 1.039931 50d8fd9c81187de2 27.008800 \n", + "10 1.0 0.261117 555f000b343364e4 27.005100 \n", + "11 1.0 6.396079 507971cae2ee4a18 27.004200 \n", + "12 1.0 0.341527 50164a42c64cc4f1 27.015100 \n", + "13 1.0 0.019216 50187b62b18da535 27.010000 \n", + "14 1.0 0.639227 5057d49b44b4ed21 27.012200 \n", + "15 1.0 1.262430 1bdb3e4628f615be 27.006300 \n", + "16 1.0 0.351294 186e549eb8340f12 27.034400 \n", + "17 1.0 0.685916 1c96000783680ce2 27.008244 \n", + "18 1.0 1.001987 188b8a2690b77569 27.007400 \n", + "19 1.0 0.161205 1c1800034e77b166 27.001960 \n", + "20 1.0 0.094927 1bf4a728749d7de8 27.001000 \n", + "21 1.0 0.690287 1a16000df5456083 27.026500 \n", + "22 1.0 3.039863 1a1329402f2206ed 27.069355 \n", + "23 1.0 0.535275 12fc6a2219199f2a 27.012000 \n", + "24 1.0 0.033313 1642835a069e4fb9 27.025700 \n", + "25 1.0 0.072236 146857274f45ac2c 27.180640 \n", + "26 1.0 2.084016 164237aca8296f1c 27.012601 \n", + "27 1.0 0.116772 12a8cc865d1eb6b1 27.001253 \n", + "28 1.0 0.361345 126a0007f2a34c7c 27.000000 \n", + "29 1.0 0.384602 126b001c1226e666 27.004100 \n", + "30 1.0 1.361363 123200132a4f0053 27.001000 \n", + "31 1.0 0.304060 13309b8b1531ac3d 27.004400 \n", + "32 1.0 2.109182 126b0037bf192dd9 27.004000 \n", + "33 1.0 0.384074 121c61dad76dde64 27.002200 \n", + "34 1.0 0.470362 1232000391a2d9da 27.009000 \n", + "35 1.0 0.517238 124d61659aa64c7a 27.076500 \n", + "36 1.0 1.394561 12200009ea038849 27.017500 \n", + "37 1.0 1.980514 10c71b4fad01f31c 27.052025 \n", + "38 1.0 0.156104 100fe6c78281bfae 27.130969 \n", + "39 1.0 0.177793 10da0014d0866a1a 27.006200 \n", + "40 1.0 0.379170 10111463352887a3 27.001100 \n", + "41 1.0 1.270331 10c7e206ff3da33e 27.029100 \n", + "42 1.0 0.608459 10c72dc2ea84ee3e 27.002000 \n", + "43 1.0 1.240973 101010806c3bfec2 30.005000 \n", + "44 1.0 0.675790 100d40c8c30375f9 30.025167 \n", + "45 1.0 0.525286 20058216259db392 30.010000 \n", + "46 1.0 0.169038 d0db3663848642f5 30.068900 \n", + "47 1.0 0.348562 d4481db8a1682303 30.007660 \n", + "48 1.0 1.926869 d43cfb8db6bde057 30.008316 \n", + "49 1.0 0.025904 d88e000ab46f7e8a 30.000000 \n", + "50 1.0 0.237322 d10ffd6af9eca406 30.000000 \n", + "51 1.0 1.012745 dee5be1bf40de25e 30.013800 \n", + "52 1.0 0.466819 daa5cc820eedd3d9 30.001500 \n", + "53 1.0 0.329434 d88f00142c1483c1 30.002000 \n", + "54 1.0 0.030553 d00cd5ba5f2b167c 30.088260 \n", + "55 1.0 0.287231 d8a48cee009b608c 30.006550 \n", + "56 1.0 0.797385 d6c1191549ab2f07 30.027600 \n", + "57 1.0 4.752955 d153e8105c7c0b57 30.001000 \n", + "58 1.0 0.895507 300b000932aead3a 30.007862 \n", + "59 1.0 2.867494 705c89a6a4e552cf 30.007100 \n", + "\n", + " infolink \\\n", + "0 https://explorer.ergoplatform.com/en/blocks/7a... \n", + "1 https://explorer.ergoplatform.com/en/blocks/44... \n", + "2 https://explorer.ergoplatform.com/en/blocks/d0... \n", + "3 https://explorer.ergoplatform.com/en/blocks/88... \n", + "4 https://explorer.ergoplatform.com/en/blocks/93... \n", + "5 https://explorer.ergoplatform.com/en/blocks/f1... \n", + "6 https://explorer.ergoplatform.com/en/blocks/9d... \n", + "7 https://explorer.ergoplatform.com/en/blocks/58... \n", + "8 https://explorer.ergoplatform.com/en/blocks/a4... \n", + "9 https://explorer.ergoplatform.com/en/blocks/2b... \n", + "10 https://explorer.ergoplatform.com/en/blocks/f8... \n", + "11 https://explorer.ergoplatform.com/en/blocks/c7... \n", + "12 https://explorer.ergoplatform.com/en/blocks/4f... \n", + "13 https://explorer.ergoplatform.com/en/blocks/22... \n", + "14 https://explorer.ergoplatform.com/en/blocks/ac... \n", + "15 https://explorer.ergoplatform.com/en/blocks/2f... \n", + "16 https://explorer.ergoplatform.com/en/blocks/17... \n", + "17 https://explorer.ergoplatform.com/en/blocks/5f... \n", + "18 https://explorer.ergoplatform.com/en/blocks/2c... \n", + "19 https://explorer.ergoplatform.com/en/blocks/92... \n", + "20 https://explorer.ergoplatform.com/en/blocks/9a... \n", + "21 https://explorer.ergoplatform.com/en/blocks/2e... \n", + "22 https://explorer.ergoplatform.com/en/blocks/c7... \n", + "23 https://explorer.ergoplatform.com/en/blocks/40... \n", + "24 https://explorer.ergoplatform.com/en/blocks/32... \n", + "25 https://explorer.ergoplatform.com/en/blocks/02... \n", + "26 https://explorer.ergoplatform.com/en/blocks/b2... \n", + "27 https://explorer.ergoplatform.com/en/blocks/b3... \n", + "28 https://explorer.ergoplatform.com/en/blocks/2d... \n", + "29 https://explorer.ergoplatform.com/en/blocks/d0... \n", + "30 https://explorer.ergoplatform.com/en/blocks/32... \n", + "31 https://explorer.ergoplatform.com/en/blocks/4a... \n", + "32 https://explorer.ergoplatform.com/en/blocks/79... \n", + "33 https://explorer.ergoplatform.com/en/blocks/d5... \n", + "34 https://explorer.ergoplatform.com/en/blocks/d3... \n", + "35 https://explorer.ergoplatform.com/en/blocks/a8... \n", + "36 https://explorer.ergoplatform.com/en/blocks/2c... \n", + "37 https://explorer.ergoplatform.com/en/blocks/39... \n", + "38 https://explorer.ergoplatform.com/en/blocks/c0... \n", + "39 https://explorer.ergoplatform.com/en/blocks/10... \n", + "40 https://explorer.ergoplatform.com/en/blocks/db... \n", + "41 https://explorer.ergoplatform.com/en/blocks/c0... \n", + "42 https://explorer.ergoplatform.com/en/blocks/91... \n", + "43 https://explorer.ergoplatform.com/en/blocks/ed... \n", + "44 https://explorer.ergoplatform.com/en/blocks/f4... \n", + "45 https://explorer.ergoplatform.com/en/blocks/bd... \n", + "46 https://explorer.ergoplatform.com/en/blocks/00... \n", + "47 https://explorer.ergoplatform.com/en/blocks/ba... \n", + "48 https://explorer.ergoplatform.com/en/blocks/85... \n", + "49 https://explorer.ergoplatform.com/en/blocks/bf... \n", + "50 https://explorer.ergoplatform.com/en/blocks/48... \n", + "51 https://explorer.ergoplatform.com/en/blocks/0f... \n", + "52 https://explorer.ergoplatform.com/en/blocks/20... \n", + "53 https://explorer.ergoplatform.com/en/blocks/27... \n", + "54 https://explorer.ergoplatform.com/en/blocks/33... \n", + "55 https://explorer.ergoplatform.com/en/blocks/2e... \n", + "56 https://explorer.ergoplatform.com/en/blocks/c5... \n", + "57 https://explorer.ergoplatform.com/en/blocks/b0... \n", + "58 https://explorer.ergoplatform.com/en/blocks/83... \n", + "59 https://explorer.ergoplatform.com/en/blocks/47... \n", + "\n", + " hash \\\n", + "0 7a3bf34be6481b99c1f3f4aa9364c4b48a287d45156f36... \n", + "1 44167cd62e4406f726826b15a0fcf6e843fade6c445102... \n", + "2 d009bdd64433367b30dcf2493ccfa43329d2383ca288b0... \n", + "3 881144c4c46b08e39d59817863da508be56c215eafb8eb... \n", + "4 9395fce740c65f238690a5639a2938e0bce75b8a28b065... \n", + "5 f12b63d2743427539774bdc9f76bb207fa7a82b659cfa4... \n", + "6 9d7544bf89b699e7d31eaf49c4b8610d62d6545c1de9d2... \n", + "7 58be0effcc39dc7fc6bbc745acfd627ff3e30eab98668c... \n", + "8 a4dc120a4aa17097a163160eeb41c3dba31780f4086491... \n", + "9 2be39f033f12f55638a0e9a8755b7f96b73d15b948990c... \n", + "10 f826ef482455161ca689de707f3c239b3ca8a6e7360a2c... \n", + "11 c7c63f408c339ae4482914cbb8e93ad48b17defd20ec90... \n", + "12 4fea81e1a1a823f1c395a7d0757208381c9f6da4f68b83... \n", + "13 224c94abcd0ffa48553f6988c34bcb92c2490e76861f1c... \n", + "14 acb0c18d072bc0fc0d0e69e95cb07ba996b53ef0ac669a... \n", + "15 2f38ffbece540e4177f81615ad3130929dbf1855fcccff... \n", + "16 177fd26d67b248b8fa2b0f734be71628114fa12249403a... \n", + "17 5f999a0dbbaef1e2202acaa7a9c1dbea3cbcc7926dd9c8... \n", + "18 2c43ae9a107e279e6aaf50ddda74652235cddc42d7f7e6... \n", + "19 92e5d017e11243bae0295199fdab7b8b08ccb9363228ee... \n", + "20 9a9c4c8fbd571a877a7f197e40c4d33d265307b23634ad... \n", + "21 2e086f5d1d55e2476586f0ae72caeb77d0093c2faef6c4... \n", + "22 c7b7ef3a8c7af63a7729de240de056beff246f9d99aebd... \n", + "23 40823fa0c172fc5f3a8ebcc79f8557f776d502abeceff0... \n", + "24 3255824876c9afc17a051e4fec4f2fb9a502d91a31d60e... \n", + "25 023d3db990a609673fb2143fdfd110f959928864ee5ba0... \n", + "26 b25a01e4b603f883cbe139725e8377ea798ef7bf5e5ffb... \n", + "27 b3dc77df25368a64370eba7b7e0f2392e5a9c3fe4cd297... \n", + "28 2d2fd8c12850c9f1a00c38aa79aba813554f7a383c4be6... \n", + "29 d0b39e75edf0099c62ce1fc97bef7dd51695659255ec7f... \n", + "30 32df796eeeeb916349df58e3263011fc13e2064202638d... \n", + "31 4ac405b82c909606840b4abb83acd42e79aa74ac9dfcfa... \n", + "32 7994b89a991f3a3589d54772c4e30437894c691aa0dfd6... \n", + "33 d51a06c21ece88a1935e2eca6a3d1ba1e82507dc7cb114... \n", + "34 d37d915b800e4b8fce3eb97ace72d1b8ecf1c35eecbf52... \n", + "35 a8134a002699294a2cb40e3f4eb3603ede1bdcae3cd0de... \n", + "36 2c36f7618aef25e20373b4832dbbdc6f95784909a40218... \n", + "37 3951d2d140cca3c5138162008137ea4c703f1cdc4a16c2... \n", + "38 c0e3620bcbce50d12b892ec9c42106e803157d14bcfc96... \n", + "39 106552ecd414d016d00bb6aac33233b40e0de0e96752ad... \n", + "40 db56d46b7963b5dd508c2bdb1507303c8263e6ccad1b47... \n", + "41 c006a33b7d2f4a4019919c278f5429608902fe3e51b1e1... \n", + "42 915a48e58976142360cc5233b6033ad2a3e2f06cda7dc1... \n", + "43 edd2c6e48ef6cc480c95a58dcb24c4125c1136d7aa4c22... \n", + "44 f49ecdd5eff7e5d0d05d0eb65c7818f31fcd82ebf5df86... \n", + "45 bd3099462e5eba95a4e8e809232f6788f2664e4a344eae... \n", + "46 000eacceb597c08feeb2a67ea6f0b804d9dc185c0e0630... \n", + "47 babafdf183a977d3ef1cf8823f241e3393ac0472f9a00e... \n", + "48 85775b03bae1f4c46c3b444bd511838d5fb9cd326c8462... \n", + "49 bfce9fe97cbc219e80858ee257f664fd3ad9ff713ed12c... \n", + "50 48044bb6835294495eb17744326b63f3183a629ab44767... \n", + "51 0f56bc5a2f2b9f179c81feeab3022723bc60df72ad4121... \n", + "52 20b806d4bd9cc58f6cc04ffdeaffd6e68c07f66e422e78... \n", + "53 278a4a533165aa5c63f8f79bb8a1ab9d29e1a62d254139... \n", + "54 3360f32693fd991c229e6a3b095eb2ff6e0367dcbac370... \n", + "55 2e2b04e088834393eafa5aac17d0fc641f4a188d6dc873... \n", + "56 c5886b3606b842b4a0ecaeda2d6270ac3238e7e0da37d2... \n", + "57 b03937a8404d47fed3d7050a93a6e6b940100e4c008a66... \n", + "58 83c740633d4aa9e61775dcab0d2ef20dd4d11c275424fa... \n", + "59 47dd2792f0fd255fc8fc4b0a12903b351245fb7083ea5e... \n", + "\n", + " miner source \\\n", + "0 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "1 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "2 9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y... ErgoSigmanauts \n", + "3 9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN... ErgoSigmanauts \n", + "4 9hNJcmkKcMmrphpc12deJJi6gNcgiX269VEEZCCgLVBPiE... ErgoSigmanauts \n", + "5 9hSk13XDU8keWAp3KxKSgUVCkfDcw577jAjM6SgbRpuYeL... ErgoSigmanauts \n", + "6 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "7 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "8 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "9 9fxwXaXp7x3i8gzfZ5zqMJJK1DbtyUeVGQL3mBaCg2cB8y... ErgoSigmanauts \n", + "10 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "11 9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd... ErgoSigmanauts \n", + "12 9fRQ8iCiCZekAewtjHmu7AmucWjvBTNUMeBFtnNkpfyWsN... ErgoSigmanauts \n", + "13 9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu... ErgoSigmanauts \n", + "14 9eZVqXVnrVWQKK19b7E7kp4ZyNqanp2z1mpKUJRaouNsme... ErgoSigmanauts \n", + "15 9ggYKoC58jQkbGNhCKqcLMsuK3qCE5ieqTPx28KrY5jJ5S... ErgoSigmanauts \n", + "16 9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC... ErgoSigmanauts \n", + "17 9f5vwtxyRP87wmc8ezyKbL7ryaNhDrgWUVBEZpQKnw16SW... ErgoSigmanauts \n", + "18 9f3FRr4XudxVs1V35At1X5yj7LmQmnWqG46LqFKVNRf2Tu... ErgoSigmanauts \n", + "19 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "20 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "21 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "22 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "23 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "24 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "25 9fHLdYBz5fPdDfMkGMfAsuj6EfXCpmM4GkamT23xeT3hzd... ErgoSigmanauts \n", + "26 9h6bjuzth7XDNeBxwFjpYSfmUkfBiepE8MGJcvmsVkeCtG... ErgoSigmanauts \n", + "27 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "28 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "29 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "30 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "31 9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4... ErgoSigmanauts \n", + "32 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "33 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "34 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "35 9iJkieXSookLtaYr8JZ8A8nKuev9dzRMwxkGjuyQebnQgC... ErgoSigmanauts \n", + "36 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "37 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "38 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "39 9f7851wUuymT3jiaaFQ5Uv3QUmCHsahCR43syFbc1nDRSH... ErgoSigmanauts \n", + "40 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "41 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "42 9exkqG2KBpdeHKby84pSehSZt9sKQitAqjuguHXdd25eEJ... ErgoSigmanauts \n", + "43 9eZPTmn8zp5GJ7KZwTo8cEuxNdezWaY3hBbLeWid7EAZed... ErgoSigmanauts \n", + "44 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "45 9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq... ErgoSigmanauts \n", + "46 9i3P4Ah9jp7nnSNMg6gxjXXHEWjkkBbPJR5RLRkMwEt3DZ... ErgoSigmanauts \n", + "47 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "48 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "49 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "50 9g4f585vPtgA5PKhSRcaPBhtfW3HYRw2qe3aemxxnD5Y1K... ErgoSigmanauts \n", + "51 9hT1c9NNUeNF8nxcE4zyzb6Ui2ypFcSjNKxrSj3hJkQKvq... ErgoSigmanauts \n", + "52 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "53 9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPV... ErgoSigmanauts \n", + "54 9gXo8m2VyHvQ3FGvCg1GNWfyM5uX27BEKNCXDjQ6GiFsMJ... ErgoSigmanauts \n", + "55 9gwk97nY8Uc6kLcSYs4ueWttY5EKyfsrbiyVQWFdUaWvd4... ErgoSigmanauts \n", + "56 9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw... ErgoSigmanauts \n", + "57 9fYvQMsMN3NNaw33cAFnRdyHy1DpxtxfADvGqUV3ocLptw... ErgoSigmanauts \n", + "58 9i8wsL9HYe4wRtuxXtnvki31uGJd6avKoQ79BXbz2sHWNZ... ErgoSigmanauts \n", + "59 9iQS22vfWdF2N84Lvv9jgAMFGLyL7t17SWbHGEfaddaG7Z... ErgoSigmanauts \n", + "\n", + " time_found \n", + "0 2024-04-29 08:20:04 \n", + "1 2024-04-28 23:18:22 \n", + "2 2024-04-28 17:16:48 \n", + "3 2024-04-28 16:09:49 \n", + "4 2024-04-28 12:59:58 \n", + "5 2024-04-28 03:06:52 \n", + "6 2024-04-28 02:55:03 \n", + "7 2024-04-27 07:59:45 \n", + "8 2024-04-27 06:54:45 \n", + "9 2024-04-27 04:31:16 \n", + "10 2024-04-26 18:24:58 \n", + "11 2024-04-26 16:00:40 \n", + "12 2024-04-23 22:19:10 \n", + "13 2024-04-23 19:17:03 \n", + "14 2024-04-23 19:06:49 \n", + "15 2024-04-23 12:18:50 \n", + "16 2024-04-22 22:07:16 \n", + "17 2024-04-22 18:11:34 \n", + "18 2024-04-22 09:12:21 \n", + "19 2024-04-21 18:58:55 \n", + "20 2024-04-21 16:57:09 \n", + "21 2024-04-21 15:49:03 \n", + "22 2024-04-21 05:49:18 \n", + "23 2024-04-19 17:13:40 \n", + "24 2024-04-19 10:06:26 \n", + "25 2024-04-19 09:41:15 \n", + "26 2024-04-19 08:45:52 \n", + "27 2024-04-18 09:31:37 \n", + "28 2024-04-18 08:01:31 \n", + "29 2024-04-18 03:11:44 \n", + "30 2024-04-17 21:39:45 \n", + "31 2024-04-17 01:03:11 \n", + "32 2024-04-16 20:53:07 \n", + "33 2024-04-15 13:26:36 \n", + "34 2024-04-15 05:58:59 \n", + "35 2024-04-14 19:46:29 \n", + "36 2024-04-14 07:53:57 \n", + "37 2024-04-13 01:40:15 \n", + "38 2024-04-10 21:52:48 \n", + "39 2024-04-10 16:45:58 \n", + "40 2024-04-10 11:38:14 \n", + "41 2024-04-09 23:57:08 \n", + "42 2024-04-08 14:35:09 \n", + "43 2024-04-07 19:55:43 \n", + "44 2024-04-06 00:11:43 \n", + "45 2024-04-04 23:46:44 \n", + "46 2024-04-04 01:40:19 \n", + "47 2024-04-03 18:22:18 \n", + "48 2024-04-03 04:57:28 \n", + "49 2024-03-31 07:40:29 \n", + "50 2024-03-31 06:53:18 \n", + "51 2024-03-31 02:11:27 \n", + "52 2024-03-29 22:22:38 \n", + "53 2024-03-29 04:26:22 \n", + "54 2024-03-28 16:41:02 \n", + "55 2024-03-28 15:40:37 \n", + "56 2024-03-28 08:26:49 \n", + "57 2024-03-27 18:07:25 \n", + "58 2024-03-19 04:19:20 \n", + "59 2024-03-16 06:45:27 " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "data['poolHashrate'] = data['poolHashrate'] / 1e9 #GIGA\n", - "data['poolHashrate'] " + "data = {\n", + " 'poolId': 'pool123',\n", + " 'blockHeight': 672835,\n", + " 'networkDifficulty': 19.963,\n", + " 'status': 'confirmed',\n", + " 'confirmationProgress': 1, # This is a critical field for the logic.\n", + " 'effort': 120.5,\n", + " 'transactionConfirmationData': 'tx12345',\n", + " 'reward': 6.25,\n", + " 'infoLink': 'http://example.com/info',\n", + " 'hash': 'hash_value_123456', # Unique identifier\n", + " 'miner': 'miner_name',\n", + " 'source': 'source_info',\n", + " 'created': '2022-01-01T12:00:00'\n", + "}\n", + "# block_data.append(new_block_data_2)\n", + "# for data in block_data:\n", + " # data['rolling_effort'] = data['effort'].expanding().mean()\n", + "data['time_found'] = format_datetime(data.pop('created'))\n", + "data['confirmationProgress'] = data['confirmationProgress'] * 100\n", + "data['networkDifficulty'] = round(data['networkDifficulty'], 2)\n", + "data['effort'] = round(data['effort'], 2)\n", + "data['reward'] = round(data['reward'], 2)\n", + "data['miner'] = '{}...{}'.format(data['miner'][:3], data['miner'][-5:])\n", + "# database.update_or_insert('block', data)\n", + "\n", + "database.fetch_data('block')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "2db9c6ad-154b-4340-bdfc-6db9a5dd4e70", + "execution_count": 20, + "id": "87e75bbe-1f4e-408c-bca1-4f4bc691e749", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'Pending Shares': 208.313,\n", + " 'Pending Balance': 0.0,\n", + " 'Total Paid': 294.063,\n", + " 'Paid Today': 4.638893254129,\n", + " 'Schema': 'PPLNS',\n", + " 'Price': 1.33,\n", + " 'Last Payment': '2024-04-29',\n", + " 'lastPaymentLink': 'https://explorer.ergoplatform.com/en/transactions/32a60bfa02c91a2bd6c8a010b682ab9e43dcd58b1a768f6fe9ac6595c9145c9c'}" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "data" + "reader.get_miner_payment_stats('9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "7eb58bdc-ad12-4b33-8593-74be1ebcef08", + "execution_count": 21, + "id": "023eb723-741b-480e-a696-ac772a258c46", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "51" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "last_block_found" + "len('9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "175d7e4a-9a01-458e-a265-3eee1d16bebb", + "execution_count": 22, + "id": "b606029e-c7e4-47a1-b1b5-9902c645bea1", "metadata": {}, "outputs": [], "source": [ - "df = reader.get_all_miner_data('9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk')\n", - "df" + "payment_headers = ['pendingShares NUMERIC',\n", + " 'pendingBalance NUMERIC',\n", + " 'totalPaid NUMERIC',\n", + " 'todayPaid NUMERIC',\n", + " 'Schema VARCHAR(50)',\n", + " 'Price NUMERIC',\n", + " 'lastPayment VARCHAR(50)',\n", + " 'lastPaymentLink TEXT',\n", + " 'created_at TIMESTAMP',\n", + " 'miner VARCHAR(100)']\n", + "\n", + "live_worker_headers = ['worker VARCHAR(50)', 'hashrate NUMERIC', 'shares_per_second NUMERIC',\n", + " 'created TIMESTAMP', 'miner VARCHAR(100)', 'effort NUMERIC',\n", + " 'ttf NUMERIC', 'last_block_found VARCHAR(100)']\n", + "\n", + "performance_headers = ['worker VARCHAR(50)', 'hashrate NUMERIC', 'shares_per_second NUMERIC',\n", + " 'created TIMESTAMP', 'miner VARCHAR(60)']\n" ] }, { "cell_type": "code", - "execution_count": null, - "id": "4c016022-edd8-4876-8033-e1c4c9b252f4", + "execution_count": 23, + "id": "33e18bdb-6bd5-4f77-8ef3-38e6e86225a1", "metadata": {}, "outputs": [], "source": [ - "df[df.wallet == '9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk']" + "def worker_to_df(data):\n", + " rows = []\n", + " for worker, details in data['workers'].items():\n", + " row = {\n", + " 'worker': worker,\n", + " 'hashrate': round(details['hashrate'] / 1e6, 2), #MH/s\n", + " 'shares_per_second': round(details['sharesPerSecond'], 2),\n", + " 'created': format_datetime(data['created'])\n", + " }\n", + " rows.append(row)\n", + " \n", + " # Create DataFrame\n", + " return pd.DataFrame(rows)\n", + "\n", + "def insert_df_rows(df, table):\n", + " for index, row in df.iterrows():\n", + " database.insert_data(table, row.to_dict())\n" ] }, { "cell_type": "code", "execution_count": null, - "id": "5cebf792-a5c3-4c17-b632-0ac384b23b3d", - "metadata": {}, - "outputs": [], + "id": "ed44bf4e-691d-4a53-ad56-2e43d56153d5", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/whaleshark/Documents/sigmanaut-mining-pool-ui/utils/db_util.py:176: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " return pd.read_sql_query(query, self.conn)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['pendingShares', 'pendingBalance', 'totalPaid', 'todayPaid', 'lastPayment', 'lastPaymentLink', 'Schema', 'Price'])\n" + ] + } + ], "source": [ - "from datetime import datetime\n", - "import pytz\n", + "database = PostgreSQLDatabase('marctheshark', 'password', 'localhost', 5432, 'mining-db')\n", + "database.connect()\n", + "database.get_cursor()\n", + "\n", + "# database.delete_table('payment')\n", + "# database.delete_table('live_worker')\n", + "# database.delete_table('performance')\n", + "database.create_table('payment', payment_headers)\n", + "database.create_table('live_worker', live_worker_headers)\n", + "database.create_table('performance', performance_headers)\n", + "\n", + "miner_data = reader.get_api_data('{}/{}'.format(reader.base_api, 'miners?pageSize=5000'))\n", + "miner_ls = [sample['miner'] for sample in miner_data]\n", + "\n", + "time_now = pd.Timestamp.now()\n", + "stats = database.fetch_data('data')\n", + "block_data = database.fetch_data('block')\n", + "networkHashrate = stats['networkhashrate'][0] # use logic to get the lastest not just the first index\n", + "networkDifficulty = stats['networkdifficulty'][0]\n", + "for miner in miner_ls:\n", + " # miner = '9hR5AWGMWcp9vvMvuiGNVzoiDfBztQqzBiK67iZwLCDWYLuUTaw'\n", + " # miner = '9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk'\n", + " url = '{}/{}/{}'.format(reader.base_api, 'miners', miner)\n", + " mining_data = reader.get_api_data(url)\n", + " # print(mining_data.keys())\n", "\n", - "def calculate_mining_effort(network_difficulty, network_hashrate, pool_hashrate, last_block_timestamp):\n", - " \"\"\"\n", - " Calculate the mining effort for the pool to find a block on Ergo blockchain based on the given timestamp.\n", - " \n", - " :param network_difficulty: The current difficulty of the Ergo network.\n", - " :param network_hashrate: The total hash rate of the Ergo network (in hashes per second).\n", - " :param pool_hashrate: The hash rate of the mining pool (in hashes per second).\n", - " :param last_block_timestamp: Timestamp of the last block found in ISO 8601 format.\n", - " :return: The estimated mining effort for the pool.\n", - " \"\"\"\n", - " # Parse the last block timestamp\n", - " time_format = '%Y-%m-%d %H:%M:%S' \n", - " last_block_time = datetime.strptime(last_block_timestamp, time_format)\n", - " last_block_time = last_block_time.replace(tzinfo=pytz.utc) # Assume the timestamp is in UTC\n", - " \n", - " # Get the current time in UTC\n", - " now = datetime.now(pytz.utc)\n", - " \n", - " # Calculate the time difference in seconds\n", - " time_since_last_block = (now - last_block_time).total_seconds()\n", - " \n", - " # Hashes to find a block at current difficulty\n", - " hashes_to_find_block = network_difficulty # This is a simplification\n", " \n", - " # Total hashes by the network in the time since last block\n", - " total_network_hashes = network_hashrate * time_since_last_block\n", + " payment_data = {k: v for k, v in mining_data.items() if k not in ['performance', 'performanceSamples']}\n", + " payment_data['Schema'] = 'PPLNS'\n", + " payment_data['Price'] = 2.0\n", + "\n", + " try:\n", + " payment_data['lastPayment'] = mining_data['lastPayment'][:-17]\n", + " payment_data['lastPaymentLink'] = mining_data['lastPaymentLink']\n", + " \n", + " except KeyError: \n", + " payment_data['lastPayment'] = 'N/A'\n", + " payment_data['lastPaymentLink'] = 'Keep Mining!'\n", + "\n", + " except TypeError:\n", + " payment_data['lastPayment'] = 'N/A'\n", + " payment_data['lastPaymentLink'] = 'Keep Mining!'\n", + " print(payment_data.keys())\n", " \n", - " # Pool's share of the total network hashes\n", - " pool_share_of_hashes = (pool_hashrate / network_hashrate) * total_network_hashes\n", + " performance_samples = mining_data.pop('performanceSamples')\n", " \n", - " # Effort is the pool's share of hashes divided by the number of hashes to find a block\n", - " effort = pool_share_of_hashes / hashes_to_find_block\n", + " payment_data['created_at'] = time_now\n", + " payment_data['miner'] = miner\n", + " # short_miner = '{}...{}'.format(data['miner'][:3], data['miner'][-5:])\n", + " miner_blocks = block_data[block_data.miner == miner]\n", " \n", - " return effort\n", + " performance_df = pd.concat(worker_to_df(sample) for sample in performance_samples)\n", + " performance_df['miner'] = miner\n", "\n", - "# Example usage:\n", - "network_difficulty = 1.83e15 # Example difficulty\n", - "network_hashrate = 15.4e12 # Example total network hash rate (1 PH/s)\n", - "pool_hashrate = 13.3e9 # Example pool hash rate (100 TH/s)\n", - "last_block_timestamp = \"2024-03-31 07:40:29\"\n", + " if miner_blocks.empty:\n", + " # still need to adjust to pull from performance table for this miner\n", + " latest = min(performance_df.created)\n", + " last_block_found = 'N/A'\n", "\n", - "effort = calculate_mining_effort(network_difficulty, network_hashrate, pool_hashrate, last_block_timestamp)\n", - "print(f\"The estimated mining effort for the pool since the last block is: {effort}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "944ef89b-18af-497c-94de-c9e905763d88", - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import datetime\n", - "\n", - "date_time_str = '2024-03-19 04:19:20'\n", - "format = '%Y-%m-%d %H:%M:%S' # Added a space between '%d' and '%H'\n", - "date_time_obj = datetime.strptime(date_time_str, format)\n", + " else:\n", + " latest = str(max(miner_blocks.time_found))\n", + " last_block_found = latest\n", "\n", - "print(date_time_obj)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "192c454d-04e6-4d9a-b604-7e74cfbd5a33", - "metadata": {}, - "outputs": [], - "source": [ - "type(date_time_str)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21e26329-64c6-4df0-a389-8b3cee19fa68", - "metadata": {}, - "outputs": [], - "source": [ - "miners = reader.get_miner_ls()\n", - "data = []\n", - "for miner in miners:\n", - " temp = reader.get_miner_samples(miner)\n", - " data.append(temp)\n", + " try:\n", + " live_performance = mining_data.pop('performance')\n", + " live_df = worker_to_df(live_performance)\n", + " live_df['miner'] = miner\n", + " live_df['effort'] = [reader.calculate_mining_effort(networkDifficulty, networkHashrate,\n", + " temp_hash, latest) for temp_hash in live_df.hashrate]\n", + " live_df['ttf'] = [reader.calculate_time_to_find_block(networkDifficulty, networkHashrate,\n", + " temp_hash) for temp_hash in live_df.hashrate]\n", + " live_df['last_block_found'] = last_block_found\n", + " \n", + " insert_df_rows(live_df, 'live_worker') \n", + " print('live worker inserted')\n", + " \n", + " except KeyError:\n", + " live_df = pd.DataFrame()\n", + " print('no live data')\n", + " \n", + " database.insert_data('payment', payment_data)\n", + " print('payments inserted')\n", "\n", - "df = pd.concat(data)" + " insert_df_rows(performance_df, 'performance') \n", + " print('performance inserted')\n", + " # break\n" ] }, { "cell_type": "code", "execution_count": null, - "id": "c48a8d55-40e4-4e31-bd83-bc88efecf7cd", + "id": "632ec239-2721-4f5f-9bcd-e9592622f183", "metadata": {}, "outputs": [], "source": [ - "df" + "lw = database.fetch_data('live_worker')\n", + "lw" ] }, { "cell_type": "code", "execution_count": null, - "id": "483b65a3-52bd-44a7-aff4-2dfb99e38320", + "id": "91ba8790-2106-4b10-8498-7a8b151df1df", "metadata": {}, "outputs": [], "source": [ - "ls = []\n", - "for date in df.created.unique():\n", - " temp = df[df.created == date]\n", - " ls.append([date, temp.hashrate.sum() /1e9])\n", - "\n", - "n = pd.DataFrame(ls, columns=['Date', 'Hashrate'])" + "df = database.fetch_data('performance')\n", + "df.head()# need to create totals per created column for total hashrate plot" ] }, { "cell_type": "code", "execution_count": null, - "id": "fc62e6bc-59fd-489f-8212-a7d0d58d938d", + "id": "1553dcfc-06e4-40a9-bc2e-bff1a1d415f4", "metadata": {}, "outputs": [], "source": [ - "n" + "aggregated_df = df.groupby('created').agg({\n", + " 'hashrate': 'sum', # Sum of hashrate\n", + " 'shares_per_second': 'sum', # Sum of shares_per_second\n", + " 'worker': 'nunique', # Count of unique workers\n", + " 'miner': 'nunique' # Count of unique miners\n", + "})" ] }, { "cell_type": "code", "execution_count": null, - "id": "13d9541c-bdfc-41bc-bb94-273a213ae049", + "id": "72f378de-b73e-4766-bd92-3877a58ff28d", "metadata": {}, "outputs": [], "source": [ - "df = reader.get_all_miner_data('9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk')\n", - "ls = []\n", - "for miner in df.miner.unique():\n", - " temp = df[df.miner == miner]\n", - " ls.append([miner, temp.hashrate.sum(), temp.sharesPerSecond.sum()])\n", - "\n", - "d = pd.DataFrame(ls, columns=['Miner', 'Hashrate', 'SharesPerSecond'])\n", - "d.Miner.unique()[0]" + "aggregated_df['hashrate'] = aggregated_df['hashrate'] / 1e3 # converts MH/s to Gh/s\n", + "aggregated_df.sort_values(['created'])" ] }, { "cell_type": "code", "execution_count": null, - "id": "586604e4-7657-446c-b7a5-682790405127", + "id": "cfe43a1b-9634-4e6e-84ca-bac8d95bbadc", "metadata": {}, "outputs": [], "source": [ - "latest = max(df.created)\n", - "latest_data = df[df.created == latest]\n", - "my_data = latest_data[latest_data.my_wallet == True]\n", - "my_data = my_data.filter(['worker', 'hashrate', 'sharesPerSecond'])\n", - "total_hash = my_data.hashrate.sum()\n", - "total_shares = my_data.sharesPerSecond.sum()\n", - "ls = ['Totals', total_hash, total_shares]\n", - "\n", - "d = pd.DataFrame([ls], columns=['worker', 'hashrate', 'sharesPerSecond'])\n", - "data = pd.concat([my_data, d])\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cdc7b9b0-df6d-43d0-be31-b0a98c6440e6", - "metadata": {}, - "outputs": [], - "source": [ - "data.hashrate" + "df = database.fetch_data('payment')\n", + "df" ] }, { "cell_type": "code", "execution_count": null, - "id": "807083a5-2e79-4a48-a899-b026caffbd91", + "id": "9f89db75-7384-42f9-982f-95160f68a7c3", "metadata": {}, "outputs": [], "source": [ - "data['ttf'] = [reader.calculate_time_to_find_block(network_difficulty, network_hashrate, hash, latest) for hash in data.hashrate]\n", - "data['effort'] = [reader.calculate_mining_effort(network_difficulty, network_hashrate, hash, latest) for hash in data.hashrate]" + "block = database.fetch_data('block')" ] }, { "cell_type": "code", "execution_count": null, - "id": "cbbdeebd-227a-419d-ad7f-3da615fb4c05", - "metadata": {}, + "id": "0add200d-87cf-4d81-9377-6152824aafa3", + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "wallet ='9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk'" + "block" ] }, { "cell_type": "code", "execution_count": null, - "id": "397d7fca-17f0-4d0a-b0d9-8bb40f18ecdb", + "id": "b37dcb7b-a82c-468f-9fc5-108541ad9d93", "metadata": {}, "outputs": [], "source": [ - "reader.get_all_miner_data(wallet)" + "block.effort.sum() / len(block.effort)" ] }, { "cell_type": "code", "execution_count": null, - "id": "1b86a5dd-74da-4b79-8be6-a548c3c27556", + "id": "c4815e68-b77d-4513-b240-a9d134115a08", "metadata": {}, "outputs": [], "source": [ - "pool_df, _ = reader.get_pool_stats(wallet) \n", - "mining_df, performance_df = reader.get_mining_stats(wallet)" + "block['effort'].expanding().mean()" ] }, { "cell_type": "code", - "execution_count": null, - "id": "cf5f2d8a-13c5-43fa-a641-bf3b2fadaa0a", + "execution_count": 7, + "id": "f44984f1-404b-4546-9305-53601c503d4f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'created': '2024-04-29T19:56:34.604302Z',\n", + " 'workers': {'GRAYSPEAK': {'hashrate': 2201226604, 'sharesPerSecond': 0.075},\n", + " 'LAPLATAPEAK': {'hashrate': 323835960, 'sharesPerSecond': 0.055},\n", + " 'MT-MASSIVE': {'hashrate': 1057033456, 'sharesPerSecond': 0.078},\n", + " 'PIKESPEAK': {'hashrate': 1489246187, 'sharesPerSecond': 0.07}}}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "mining_df" + "miner = '9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk'\n", + "url = '{}/{}/{}'.format(reader.base_api, 'miners', miner)\n", + "mining_data = reader.get_api_data(url)\n", + "live_performance = mining_data.pop('performance')\n", + "live_performance" ] }, { "cell_type": "code", - "execution_count": null, - "id": "cf76bab9-5ba5-4719-b0b0-3e48a344c273", + "execution_count": 14, + "id": "a6ad9402-47ec-4fca-aa8a-9518f3c4080f", "metadata": {}, "outputs": [], "source": [ - "miners = reader.get_miner_ls()\n", - "ls = []\n", - "for miner in miners:\n", - " df, _ = reader.get_mining_stats(miner)\n", - " shares = df[df['Mining Stats'] == 'pendingShares'].Values[0]\n", - " ls.append([miner, shares])\n", + "def worker_to_df(data):\n", + " rows = []\n", + " total_hash = 0\n", + " total_shares = 0\n", + " for worker, details in data['workers'].items():\n", + " hashrate = round(details['hashrate'] / 1e6, 2)\n", + " shares = round(details['sharesPerSecond'], 2)\n", + " row = {\n", + " 'worker': worker,\n", + " 'hashrate': hashrate, #MH/s\n", + " 'shares_per_second': shares,\n", + " 'created': format_datetime(data['created'])\n", + " }\n", + " rows.append(row)\n", + " total_hash += hashrate\n", + " total_shares += shares\n", "\n", - "n_df = pd.DataFrame(ls, columns=['Miner', 'Shares'])\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1060c93a-1612-4fc0-a0d4-d327c8a1eff1", - "metadata": {}, - "outputs": [], - "source": [ - "total = n_df.Shares.sum()\n", - "n_df['p'] = [shares / total for shares in n_df.Shares]\n", - "n_df['r'] = n_df['p'] * 30" + " totals = {'worker': 'totals',\n", + " 'hashrate': total_hash, #MH/s\n", + " 'shares_per_second': total_shares,\n", + " 'created': format_datetime(data['created'])\n", + " }\n", + " rows.append(totals)\n", + " \n", + " print(rows)\n", + " # Create DataFrame\n", + " return pd.DataFrame(rows)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "b6a28994-d187-4c24-8528-b6863455b5ed", - "metadata": {}, - "outputs": [], - "source": [ - "n_df\n", - "my_df = n_df[n_df.Miner == wallet]\n", - "participation = my_df.p\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "abe6a887-a300-48b5-8d0b-2ee11ba739f1", + "execution_count": 15, + "id": "62ca44e7-ab37-47a9-a7cc-7b575899df04", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'worker': 'GRAYSPEAK', 'hashrate': 2201.23, 'shares_per_second': 0.07, 'created': '2024-04-29 19:56:34'}, {'worker': 'LAPLATAPEAK', 'hashrate': 323.84, 'shares_per_second': 0.06, 'created': '2024-04-29 19:56:34'}, {'worker': 'MT-MASSIVE', 'hashrate': 1057.03, 'shares_per_second': 0.08, 'created': '2024-04-29 19:56:34'}, {'worker': 'PIKESPEAK', 'hashrate': 1489.25, 'shares_per_second': 0.07, 'created': '2024-04-29 19:56:34'}, {'worker': 'totals', 'hashrate': 5071.35, 'shares_per_second': 0.28, 'created': '2024-04-29 19:56:34'}]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workerhashrateshares_per_secondcreated
0GRAYSPEAK2201.230.072024-04-29 19:56:34
1LAPLATAPEAK323.840.062024-04-29 19:56:34
2MT-MASSIVE1057.030.082024-04-29 19:56:34
3PIKESPEAK1489.250.072024-04-29 19:56:34
4totals5071.350.282024-04-29 19:56:34
\n", + "
" + ], + "text/plain": [ + " worker hashrate shares_per_second created\n", + "0 GRAYSPEAK 2201.23 0.07 2024-04-29 19:56:34\n", + "1 LAPLATAPEAK 323.84 0.06 2024-04-29 19:56:34\n", + "2 MT-MASSIVE 1057.03 0.08 2024-04-29 19:56:34\n", + "3 PIKESPEAK 1489.25 0.07 2024-04-29 19:56:34\n", + "4 totals 5071.35 0.28 2024-04-29 19:56:34" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "participation.values[0]" + "worker_to_df(live_performance)" ] }, { "cell_type": "code", "execution_count": null, - "id": "f17c2109-e58b-497e-8165-aec2abbfe3e7", + "id": "eda3bc88-ed55-4120-b052-8c59754ed14c", "metadata": {}, "outputs": [], "source": [] diff --git a/requirements.txt b/requirements.txt index dc800c14..9ff50953 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ hydra-core dash +requests pandas dash-bootstrap-components pycoingecko @@ -11,4 +12,5 @@ requests flask-session dash-auth locust -cachelib \ No newline at end of file +cachelib +psycopg2-binary diff --git a/testing_2_db.ipynb b/testing_2_db.ipynb new file mode 100644 index 00000000..a6416ea0 --- /dev/null +++ b/testing_2_db.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "96944386-e139-4ef4-9d86-26463244ff6f", + "metadata": {}, + "outputs": [], + "source": [ + "from utils.api_2_db import DataSyncer\n", + "import pandas as pd\n", + "from utils.update_blocks_and_workers import update_blocks_and_live_workers\n", + "from utils.update_payment_and_performance import update_payment_and_performance\n", + "from utils.update_pool_stats import update_pool_stats\n", + "from utils.init_db import init_db" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "11604c9d-4ef6-48da-939f-fac113478414", + "metadata": {}, + "outputs": [], + "source": [ + "db_sync = DataSyncer(config_path=\"../conf\")\n", + "miner = '9ehJZvPDgvCNNd2zTQHxnSpcCAtb1kHbEN1VAgeoRD5DPVApYkk'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4994b7a3-98ce-48ba-9635-3850b2a6f9fd", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "db_sync.__delete_table__()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7fd703d1-62a2-4def-a041-09dad714ab9e", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "intializing DB\n", + "Batch 1/1: Deleted up to 100 rows from stats\n", + "UPDATED STATS TABLE SUCCESFULLY\n", + "UPDATED BLOCK TABLE SUCCESFULLY\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/whaleshark/Documents/sigmanaut-mining-pool-ui/utils/db_util.py:222: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " return pd.read_sql_query(query, self.conn)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['fee', 'paid', 'blocks', 'last_block_found', 'enabled',\n", + " 'minimumpayment', 'payoutscheme', 'connectedminers', 'poolhashrate',\n", + " 'sharespersecond', 'networktype', 'networkhashrate',\n", + " 'networkdifficulty', 'lastnetworkblocktime', 'blockheight',\n", + " 'connectedpeers', 'rewardtype', 'pooleffort', 'poolttf', 'price',\n", + " 'insert_time_stamp'],\n", + " dtype='object')\n", + "no live data for miner 9fGzn8VCszvFMXo2KDrQiVowwSdchVT13ygX26RKUfkjcruRq7J\n", + "no live data for miner 9gHULKUh8kLBBc6F6ddtyzeyhzz2KzGerPbFw7ZHmSUPrRGfnoz\n", + "UPDATED LIVE WORK, PERFORMANCE, AND PAYMENT TABLES SUCCESFULLY\n", + "complete\n" + ] + } + ], + "source": [ + "init_db()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1a091c8-8c73-4dcf-b74d-26832707cae3", + "metadata": {}, + "outputs": [], + "source": [ + "update_pool_stats()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b586b668-4840-46f4-b2c6-d169ecf87f16", + "metadata": {}, + "outputs": [], + "source": [ + "update_blocks_and_live_workers()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bae6d28-ddd3-4b9e-9d34-34eeff29e80b", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "df = db_sync.db.fetch_data('performance')\n", + "df = df[df.miner == miner]\n", + "df = df[df.worker == 'GRAYSPEAK']\n", + "df[df.created == '2024-05-06 16:00:00']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "419e47a1-3e7f-4636-8735-415e9d483ad1", + "metadata": {}, + "outputs": [], + "source": [ + "worker_df = db_sync.db.fetch_data('live_worker')\n", + "total_df = worker_df[worker_df.worker == 'totals']\n", + "my_worker_df = total_df[total_df.miner == miner]\n", + "latest_worker = my_worker_df[my_worker_df.created == max(my_worker_df.created)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "426a7e20-dc50-4ee0-aa96-b0cb419058f2", + "metadata": {}, + "outputs": [], + "source": [ + "my_total_hash = latest_worker.hashrate.item()\n", + "my_total_hash" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92e7468a-4474-45cc-8b02-a12bcb93aa3c", + "metadata": {}, + "outputs": [], + "source": [ + "update_payment_and_performance()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "729c6b38-f34e-454d-9325-630be159eb62", + "metadata": {}, + "outputs": [], + "source": [ + "update_pool_stats()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dca3cb9d-d4de-411b-8832-5dd41d582542", + "metadata": {}, + "outputs": [], + "source": [ + "df = db_sync.db.fetch_data('performance')\n", + "my_worker_performance = df[df.miner == miner]\n", + "t_df = my_worker_performance[my_worker_performance.worker == 'totals']\n", + "t_df.sort_values('created')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c8d68d7-4500-43b2-9c1d-efe09cb65d29", + "metadata": {}, + "outputs": [], + "source": [ + "db_sync.db.get_db_size()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "718f6add-07eb-4e71-9df8-3c6b6a81fc4f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/utils/api_2_db.py b/utils/api_2_db.py new file mode 100644 index 00000000..2560e659 --- /dev/null +++ b/utils/api_2_db.py @@ -0,0 +1,405 @@ +import requests +from hydra import compose, initialize +from omegaconf import DictConfig, OmegaConf +from pandas import DataFrame, concat, to_datetime +from pycoingecko import CoinGeckoAPI +from datetime import datetime +from hydra.core.global_hydra import GlobalHydra +import pytz +import pandas as pd + +try: + from utils.db_util import PostgreSQLDatabase +except ModuleNotFoundError: + from db_util import PostgreSQLDatabase + +def format_datetime(time_str): + # List of possible datetime formats to try + formats = [ + "%Y-%m-%dT%H:%M:%S.%fZ", # datetime with microseconds and 'Z' timezone + "%Y-%m-%dT%H:%M:%S", # datetime without microseconds or timezone + "%Y-%m-%dT%H:%M:%S%z", # datetime with timezone offset + "%Y-%m-%dT%H:%M:%SZ" # datetime with 'Z' but without microseconds + ] + + # Attempt to parse the datetime string with each format + for fmt in formats: + try: + dt = datetime.strptime(time_str, fmt) + return dt.strftime("%Y-%m-%d %H:%M:%S") # Converts to your desired format + except ValueError: + continue # Try the next format if the current one fails + + # If no format matches, raise an exception + raise ValueError(f"Time data '{time_str}' does not match any expected format") + +def worker_to_df(data): + rows = [] + total_hash = 0 + total_shares = 0 + for worker, details in data['workers'].items(): + hashrate = round(details['hashrate'] / 1e6, 2) + shares = round(details['sharesPerSecond'], 2) + row = { + 'worker': worker, + 'hashrate': hashrate, #MH/s + 'shares_per_second': shares, + 'created': format_datetime(data['created']) + } + rows.append(row) + total_hash += hashrate + total_shares += shares + + totals = {'worker': 'totals', + 'hashrate': total_hash, #MH/s + 'shares_per_second': total_shares, + 'created': format_datetime(data['created']) + } + rows.append(totals) + + # Create DataFrame + return pd.DataFrame(rows) + +class PriceReader: + def __init__(self): + self.cg = CoinGeckoAPI() + + def get(self, debug=False): + # Fetch current price of Bitcoin (BTC) and Ergo (ERG) in USD + if debug: + return 10, 10 + else: + prices = self.cg.get_price(ids=['bitcoin', 'ergo'], vs_currencies='usd') + btc_price = prices['bitcoin']['usd'] + erg_price = prices['ergo']['usd'] + return btc_price, erg_price + +class DataSyncer: + def __init__(self, config_path: str): + self.block_reward = 27 #need to calc this from emissions.csv + self.config_path = config_path + self.price_reader = PriceReader() + try: + initialize(config_path, self.config_path, version_base=None) + except ValueError: + GlobalHydra.instance().clear() + initialize(config_path, self.config_path, version_base=None) + cfg = compose(config_name='conf') + + self.api = cfg.default_values.url + self.token_id = cfg.user_defined.token_id + self.token_ls = cfg.default_values.token_ls + self.base_api = cfg.default_values.base_api + self.stats_headers = cfg.default_values.stats_cols + self.block_headers = cfg.default_values.block_cols + self.payment_headers = cfg.default_values.payment_headers + self.live_worker_headers = cfg.default_values.live_worker_headers + self.performance_headers = cfg.default_values.performance_headers + self.miner_sample_df = DataFrame(columns=['created']) + + self.data = {'poolEffort': 0} + + self.db = PostgreSQLDatabase('marctheshark', 'password', 'db', 5432, 'mining-db') + self.db.connect() + self.db.get_cursor() + + def get_api_data(self, api_url): + try: + # Send a GET request to the API + response = requests.get(api_url) + + # Check if the request was successful (status code 200) + if response.status_code == 200: + # Parse the response as JSON (assuming the API returns JSON data) + data = response.json() + return data + else: + print(f"Failed to retrieve data: Status code {response.status_code}") + return None + + except requests.exceptions.RequestException as e: + # Handle any exceptions that occur during the request + print(f"An error occurred: {e}") + return None + + def __create_table__(self): + self.db.create_table('stats', self.stats_headers) + self.db.create_table('block', self.block_headers) + self.db.create_table('payment', self.payment_headers) + self.db.create_table('live_worker', self.live_worker_headers) + self.db.create_table('performance', self.performance_headers) + return True + + def __delete_table__(self): + self.db.delete_data_in_batches('stats', 100) + self.db.delete_data_in_batches('block') + self.db.delete_data_in_batches('payment') + self.db.delete_data_in_batches('live_worker') + self.db.delete_data_in_batches('performance') + return True + + def insert_df_rows(self, df, table, columns): + for index, row in df.iterrows(): + # self.db.insert_data(table, row.to_dict()) + self.db.update_or_insert(table, row.to_dict(), columns) + + def update_pool_stats(self, timenow): + ''' + The purpose of this method is to grab all the relevant stats of the pool and network + ''' + stats = self.get_api_data(self.base_api)['pool'] + # last_block_found = str(format_datetime(stats['lastPoolBlockTime'])) + last_block_found = stats['lastPoolBlockTime'] + format_string = '%Y-%m-%dT%H:%M:%S.%fZ' + date_time_obj = datetime.strptime(last_block_found, format_string) + last_block_found = date_time_obj.strftime('%Y-%m-%d %H:%M:%S') + + self.data = {'fee': stats['poolFeePercent'], + 'paid': stats['totalPaid'], + 'blocks': stats['totalBlocks'], + 'last_block_found': last_block_found, + } + + + payment_data = stats['paymentProcessing'] # dict + pool_stats = stats['poolStats'] # dict + net_stats = stats['networkStats'] # dict + + for key in payment_data.keys(): + self.data[key] = payment_data[key] + + for key in pool_stats.keys(): + self.data[key] = pool_stats[key] + + for key in net_stats.keys(): + self.data[key] = net_stats[key] + + self.data['poolHashrate'] = round(self.data['poolHashrate'] / 1e9, 2) # GigaHash/Second + self.data['networkHashrate'] = self.data['networkHashrate'] / 1e12 # Terra Hash/Second + self.data['networkDifficulty'] = self.data['networkDifficulty'] / 1e15 # Peta + self.data['insert_time_stamp'] = timenow + self.data['poolEffort'] = round(self.calculate_mining_effort(self.data['networkDifficulty'], + self.data['networkHashrate'], + self.data['poolHashrate'] * 1e3, + last_block_found), 2) + + self.data['poolTTF'] = round(self.calculate_time_to_find_block(self.data['networkDifficulty'], + self.data['networkHashrate'], + self.data['poolHashrate'] * 1e3), 2) + self.data['price'] = self.price_reader.get()[1] + + del self.data['payoutSchemeConfig'] + del self.data['extra'] + + flag = self.db.insert_data('stats', self.data) + print('UPDATED STATS TABLE SUCCESFULLY') + return flag + + def update_block_data(self, timenow): + ''' + The purpose of this method is to grab the latest blocks. + + Currently we search through the last ten blocks in general + + Will need to add Rolling Effort in the df in the page itself vs db + ''' + url = '{}/{}'.format(self.base_api, 'blocks?pageSize=5000') + block_data = self.get_api_data(url) + for data in block_data: + # data['rolling_effort'] = data['effort'].expanding().mean() + data['time_found'] = format_datetime(data.pop('created')) + data['confirmationProgress'] = data['confirmationProgress'] * 100 + data['networkDifficulty'] = round(data['networkDifficulty'], 2) + try: + data['effort'] = round(data['effort'], 2) + except KeyError: + data['effort'] = 0.000 + data['reward'] = round(data['reward'], 2) + data['miner'] = '{}...{}'.format(data['miner'][:3], data['miner'][-5:]) + try: + self.db.update_or_insert('block', data, ['hash']) + except KeyError: + pass + + print('UPDATED BLOCK TABLE SUCCESFULLY') + + def update_miner_data(self, timenow, payment=True, live_data=True, performance=True): + if live_data: + # self.db.delete_data_in_batches('live_worker') + self.db.create_table('live_worker', self.live_worker_headers) + + if performance: + # self.db.delete_data_in_batches('performance') + self.db.create_table('performance', self.live_worker_headers) + + + _, erg_price = self.price_reader.get() + miner_data = self.get_api_data('{}/{}'.format(self.base_api, 'miners?pageSize=5000')) + miner_ls = [sample['miner'] for sample in miner_data] + + # time_now = pd.Timestamp.now() + stats = self.db.fetch_data('stats') + print(stats.columns) + stats = stats[stats.insert_time_stamp == max(stats.insert_time_stamp)] + + block_data = self.db.fetch_data('block') + networkHashrate = stats['networkhashrate'].item() # use logic to get the lastest not just the first index + networkDifficulty = stats['networkdifficulty'].item() + for miner in miner_ls: + url = '{}/{}/{}'.format(self.base_api, 'miners', miner) + mining_data = self.get_api_data(url) + + if payment: + payment_data = {k: v for k, v in mining_data.items() if k not in ['performance', 'performanceSamples']} + payment_data['Schema'] = 'PPLNS' + payment_data['Price'] = erg_price + payment_data['totalPaid'] = round(payment_data['totalPaid'], 2) + payment_data['pendingShares'] = round(payment_data['pendingShares'], 2) + payment_data['pendingBalance'] = round(payment_data['pendingBalance'], 2) + + try: + payment_data['lastPayment'] = mining_data['lastPayment'][:-17] + payment_data['lastPaymentLink'] = mining_data['lastPaymentLink'] + + except KeyError: + payment_data['lastPayment'] = 'N/A' + payment_data['lastPaymentLink'] = 'Keep Mining!' + + except TypeError: + payment_data['lastPayment'] = 'N/A' + payment_data['lastPaymentLink'] = 'Keep Mining!' + + payment_data['created_at'] = timenow + payment_data['miner'] = miner + self.db.insert_data('payment', payment_data) + + performance_samples = mining_data.pop('performanceSamples') + shorten_miner = '{}...{}'.format(miner[:3], miner[-5:]) + + miner_blocks = block_data[block_data.miner == shorten_miner] + try: + performance_df = pd.concat(worker_to_df(sample) for sample in performance_samples) + performance_df['miner'] = miner + + except ValueError: + # might need to add something here + pass + + if miner_blocks.empty: + # still need to adjust to pull from performance table for this miner + latest = min(performance_df.created) + last_block_found = 'N/A' + + else: + latest = str(max(miner_blocks.time_found)) + last_block_found = latest + + if performance: + # performance_df['insert_time_stamp'] = timenow + self.insert_df_rows(performance_df, 'performance', ['created', 'worker', 'hashrate']) + + if live_data: + + try: + live_performance = mining_data.pop('performance') + live_df = worker_to_df(live_performance) + live_df['hashrate'] = round(live_df['hashrate'], 0) + live_df['miner'] = miner + if last_block_found == 'N/A': + live_df['effort'] = 0 + else: + live_df['effort'] = [round(self.calculate_mining_effort(networkDifficulty, networkHashrate, + temp_hash, latest), 2) for temp_hash in live_df.hashrate] + live_df['ttf'] = [round(self.calculate_time_to_find_block(networkDifficulty, networkHashrate, + temp_hash), 2) for temp_hash in live_df.hashrate] + live_df['last_block_found'] = last_block_found + + # live_df['created_at'] = timenow + self.insert_df_rows(live_df, 'live_worker', ['created', 'worker', 'hashrate']) + + + except KeyError: + live_df = pd.DataFrame() + print('no live data for miner {}'.format(miner)) + + + print('UPDATED LIVE WORK, PERFORMANCE, AND PAYMENT TABLES SUCCESFULLY') + + return + + def calculate_mining_effort(self, network_difficulty, network_hashrate, hashrate, last_block_timestamp): + """ + Calculate the mining effort for the pool to find a block on Ergo blockchain based on the given timestamp. + + :param network_difficulty: The current difficulty of the Ergo network. + :param network_hashrate: The total hash rate of the Ergo network (in hashes per second). + :param pool_hashrate: The hash rate of the mining pool (in hashes per second). + :param last_block_timestamp: Timestamp of the last block found in ISO 8601 format. + :return: The estimated mining effort for the pool. + """ + + network_difficulty = network_difficulty * 1e15 + network_hashratev = network_hashrate * 1e12 + hashrate = hashrate * 1e6 + + # Parse the last block timestamp + time_format = '%Y-%m-%d %H:%M:%S' + last_block_time = datetime.strptime(last_block_timestamp, time_format) + last_block_time = last_block_time.replace(tzinfo=pytz.utc) # Assume the timestamp is in UTC + + # Get the current time in UTC + now = datetime.now(pytz.utc) + + # Calculate the time difference in seconds + time_since_last_block = (now - last_block_time).total_seconds() + + # Hashes to find a block at current difficulty + hashes_to_find_block = network_difficulty# This is a simplification + + # Total hashes by the network in the time since last block + total_network_hashes = network_hashrate * time_since_last_block + + # Pool's share of the total network hashes + pool_share_of_hashes = (hashrate / network_hashrate ) * total_network_hashes + + # Effort is the pool's share of hashes divided by the number of hashes to find a block + effort = pool_share_of_hashes / hashes_to_find_block * 100 + + return round(effort, 3) + + def calculate_time_to_find_block(self, network_difficulty, network_hashrate, hashrate): + """ + Calculate the time to find a block on Ergo blockchain based on the given timestamp. + + :param network_difficulty: The current difficulty of the Ergo network. + :param network_hashrate: The total hash rate of the Ergo network (in hashes per second). + :param pool_hashrate: The hash rate of the mining pool (in hashes per second). + :param last_block_timestamp: Timestamp of the last block found in ISO 8601 format. + :return: The estimated time to find a block for the pool. + """ + + network_difficulty = network_difficulty * 1e15 + network_hashrate = network_hashrate * 1e12 + hashrate = hashrate * 1e6 + + # Hashes to find a block at current difficulty + hashes_to_find_block = network_difficulty # This is a simplification + + # Calculate the time to find a block + try: + time_to_find_block = hashes_to_find_block / hashrate + except ZeroDivisionError: + time_to_find_block = 1 + + return round(time_to_find_block / 3600 / 24, 3) + + + + + + + + + + + diff --git a/utils/api_reader.py b/utils/api_reader.py index 6773207d..9a98619a 100644 --- a/utils/api_reader.py +++ b/utils/api_reader.py @@ -115,7 +115,7 @@ def update_data(self): self.data['poolHashrate'] * 1e3, self.latest_block) self.data['poolTTF'] = self.calculate_time_to_find_block(self.data['networkDifficulty'], self.data['networkHashrate'], - self.data['poolHashrate'] * 1e3, self.latest_block) + self.data['poolHashrate'] * 1e3) ### TOTAL HASH #### all_miner_samples = [self.get_miner_samples(miner) for miner in miner_ls] @@ -190,10 +190,10 @@ def get_latest_worker_samples(self, totals=False): temp_hash = round(temp.hashrate.sum(), 0) effort = self.calculate_mining_effort(self.data['networkDifficulty'], self.data['networkHashrate'], temp_hash, temp_latest) - ttf = self.calculate_time_to_find_block(self.data['networkDifficulty'], self.data['networkHashrate'], temp_hash, temp_latest) + ttf = self.calculate_time_to_find_block(self.data['networkDifficulty'], self.data['networkHashrate'], temp_hash) temp['Last Block Found'] = temp_latest temp['Effort'] = [self.calculate_mining_effort(self.data['networkDifficulty'], self.data['networkHashrate'], hash, temp_latest) for hash in temp.hashrate] - temp['TTF'] = [self.calculate_time_to_find_block(self.data['networkDifficulty'], self.data['networkHashrate'], hash, temp_latest) for hash in temp.hashrate] + temp['TTF'] = [self.calculate_time_to_find_block(self.data['networkDifficulty'], self.data['networkHashrate'], hash) for hash in temp.hashrate] work_ls.append(temp) total_ls.append([miner, temp_hash, round(temp.sharesPerSecond.sum(), 2), effort, ttf, temp_latest]) @@ -323,7 +323,7 @@ def calculate_mining_effort(self, network_difficulty, network_hashrate, hashrate return round(effort, 3) - def calculate_time_to_find_block(self, network_difficulty, network_hashrate, hashrate, last_block_timestamp): + def calculate_time_to_find_block(self, network_difficulty, network_hashrate, hashrate): """ Calculate the time to find a block on Ergo blockchain based on the given timestamp. @@ -337,17 +337,6 @@ def calculate_time_to_find_block(self, network_difficulty, network_hashrate, has network_difficulty = network_difficulty * 1e15 network_hashrate = network_hashrate * 1e12 hashrate = hashrate * 1e6 - - # Parse the last block timestamp - time_format = '%Y-%m-%d %H:%M:%S' - last_block_time = datetime.strptime(last_block_timestamp, time_format) - last_block_time = last_block_time.replace(tzinfo=pytz.utc) # Assume the timestamp is in UTC - - # Get the current time in UTC - now = datetime.now(pytz.utc) - - # Calculate the time difference in seconds - time_since_last_block = (now - last_block_time).total_seconds() # Hashes to find a block at current difficulty hashes_to_find_block = network_difficulty # This is a simplification diff --git a/utils/crontab_updates b/utils/crontab_updates new file mode 100644 index 00000000..6ab81a79 --- /dev/null +++ b/utils/crontab_updates @@ -0,0 +1,10 @@ +# Run 'update_blocks_and_workers.py' every 2 minutes +*/2 * * * * cd /app && /usr/local/bin/python3 /app/utils/update_blocks_and_workers.py >> /var/log/cron.log 2>&1 + +# Run 'update_payment_and_performance.py' every 30 minutes +*/30 * * * * cd /app && /usr/local/bin/python3 /app/utils/update_payment_and_performance.py >> /var/log/cron.log 2>&1 + +# Run 'update_pool_stats.py' every 2 minutes +*/2 * * * * cd /app && /usr/local/bin/python3 /app/utils/update_pool_stats.py >> /var/log/cron.log 2>&1 + +# Don't forget to leave an empty line at the end of the file diff --git a/utils/db_util.py b/utils/db_util.py new file mode 100644 index 00000000..52af6743 --- /dev/null +++ b/utils/db_util.py @@ -0,0 +1,240 @@ +import psycopg2 +import pandas as pd +import time +class PostgreSQLDatabase: + def __init__(self, username, password, host, port, database_name): + self.username = username + self.password = password + self.host = host + self.port = port + self.database_name = database_name + self.conn = None + + def connect(self): + try: + self.conn = psycopg2.connect( + host=self.host, + port=self.port, + user=self.username, + password=self.password, + dbname=self.database_name + ) + except psycopg2.OperationalError as e: + print(f"Connection failed: {e}") + self.conn = None + + def get_cursor(self): + if self.conn is not None: + try: + return self.conn.cursor() + except psycopg2.OperationalError as e: + print(f"Cursor creation failed: {e}") + return None + return None + + def get_db_size(self): + query = f"SELECT pg_size_pretty(pg_database_size('{self.database_name}'));" + cursor = self.get_cursor() + cursor.execute(query) + + # Fetch the result + size = cursor.fetchone()[0] + return size + + def create_table(self, table_name, columns): + cursor = self.get_cursor() + if cursor: + try: + query = f"CREATE TABLE IF NOT EXISTS {table_name} ({', '.join(columns)})" + cursor.execute(query) + self.conn.commit() + except psycopg2.OperationalError as e: + print(f"Table creation failed: {e}") + finally: + cursor.close() + + def delete_table(self, table_name): + cursor = self.get_cursor() + if cursor: + try: + query = f"DROP TABLE IF EXISTS {table_name}" + cursor.execute(query) + self.conn.commit() + print(f"Table {table_name} deleted successfully.") + except psycopg2.OperationalError as e: + print(f"Table deletion failed: {e}") + finally: + cursor.close() + + def delete_data_in_batches(self, table_name, batch_size=10000): + cursor = self.get_cursor() + if cursor: + try: + # First, determine the total number of rows in the table + cursor.execute(f"SELECT COUNT(*) FROM {table_name}") + total_rows = cursor.fetchone()[0] + num_batches = (total_rows + batch_size - 1) // batch_size # Calculate how many batches are needed + + for batch in range(num_batches): + # Use ROW_NUMBER() to select a range of rows within the current batch + delete_query = f""" + DELETE FROM {table_name} + WHERE ctid IN ( + SELECT ctid FROM ( + SELECT ctid, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as rn + FROM {table_name} + ) sub + WHERE rn BETWEEN {batch * batch_size + 1} AND {(batch + 1) * batch_size} + ); + """ + cursor.execute(delete_query) + self.conn.commit() + print(f"Batch {batch + 1}/{num_batches}: Deleted up to {batch_size} rows from {table_name}") + + # Avoid overloading the database with a small delay + time.sleep(1) + + except psycopg2.OperationalError as e: + print(f"Batch deletion failed: {e}") + self.conn.rollback() + finally: + cursor.close() + + + def insert_data(self, table_name, data): + cursor = self.get_cursor() + if cursor: + try: + columns = list(data.keys()) + values = list(data.values()) + placeholders = ', '.join(['%s'] * len(values)) # Create placeholders for parameterized query + query = f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({placeholders})" + cursor.execute(query, values) + self.conn.commit() + except psycopg2.OperationalError as e: + print(f"Insertion failed: {e}") + + except Exception as e: + print('EXCEPTION', e) + pass + finally: + cursor.close() + + # def update_or_insert(self, table_name, data): + # """ + # Updates or inserts data based on hash and confirmation progress. + # Assumes data is a dictionary containing all necessary columns including hash and confirmationProgress. + + # :param table_name: Name of the table to update or insert into. + # :param data: Data dictionary where keys are column names and values are data values. + # """ + # hash = data['hash'] + # new_confirmation = data['confirmationProgress'] + # cursor = self.get_cursor() + # flag = False + # if cursor: + # try: + # # First, try to fetch the existing row with the same hash. + # cursor.execute("SELECT * FROM {} WHERE hash = %s".format(table_name), (hash,)) + # existing_row = cursor.fetchone() + + # if existing_row: + # existing_confirmation = existing_row[4] # Assuming confirmationProgress is the 5th column in the table + # if new_confirmation > existing_confirmation: + # # If new confirmation is greater, update the row. + # columns = ', '.join([f"{key} = %s" for key in data.keys()]) + # values = list(data.values()) + # cursor.execute(f"UPDATE {table_name} SET {columns} WHERE hash = %s", values + [hash]) + # flag = True + # else: + # # If no existing row, insert new. + # columns = ', '.join(data.keys()) + # placeholders = ', '.join(['%s'] * len(data)) + # cursor.execute(f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})", list(data.values())) + # flag = True + + # self.conn.commit() + # except psycopg2.OperationalError as e: + # print(f"Database operation failed: {e}") + # finally: + # cursor.close() + # return flag + + def update_or_insert(self, table_name, data, key_columns): + """ + Updates or inserts data based on specified key columns. + Assumes data is a dictionary containing all necessary columns. + + :param table_name: Name of the table to update or insert into. + :param data: Data dictionary where keys are column names and values are data values. + :param key_columns: A list of column names to use as keys for identifying existing records. + """ + cursor = self.get_cursor() + flag = False + if cursor: + try: + # Construct WHERE clause based on key columns + where_clause = ' AND '.join([f"{col} = %s" for col in key_columns]) + key_values = [data[col] for col in key_columns] + + # First, try to fetch the existing row with the same keys. + cursor.execute(f"SELECT * FROM {table_name} WHERE {where_clause}", key_values) + existing_row = cursor.fetchone() + + if existing_row: + # Update the row if it exists. + columns = ', '.join([f"{key} = %s" for key in data.keys() if key not in key_columns]) + values = [data[key] for key in data.keys() if key not in key_columns] + cursor.execute(f"UPDATE {table_name} SET {columns} WHERE {where_clause}", values + key_values) + flag = True + else: + # Insert a new row if it doesn't exist. + columns = ', '.join(data.keys()) + placeholders = ', '.join(['%s'] * len(data)) + cursor.execute(f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})", list(data.values())) + flag = True + + self.conn.commit() + except psycopg2.OperationalError as e: + print(f"Database operation failed: {e}") + finally: + cursor.close() + return flag + + + + + def fetch_data(self, table_name, columns='*', where=None): + """ + Fetches data from the specified table. + + :param table_name: Name of the table to fetch data from. + :param columns: Columns to fetch, defaults to '*'. + :param where: Optional WHERE clause to filter results. + :return: A list of tuples containing the data fetched, or an empty list if no data. + """ + cursor = self.get_cursor() + if cursor: + try: + query = f"SELECT {', '.join(columns) if isinstance(columns, list) else columns} FROM {table_name}" + if where: + query += f" WHERE {where}" + return pd.read_sql_query(query, self.conn) + + except psycopg2.OperationalError as e: + print(f"Data fetch failed: {e}") + finally: + cursor.close() + return pd.DataFrame() + + + def close(self): + if self.conn: + self.conn.close() + +# Example usage +if __name__ == '__main__': + database = PostgreSQLDatabase('marctheshark', 'password', 'localhost', 5432, 'sigmanaut-mining') + database.connect() + database.cursor() + database.insert_data('your_table_name', ['column1', 'column2'], ('value1', 'value2')) diff --git a/utils/init_db.py b/utils/init_db.py new file mode 100644 index 00000000..8f79e7b5 --- /dev/null +++ b/utils/init_db.py @@ -0,0 +1,23 @@ +try: + from utils.api_2_db import DataSyncer +except ModuleNotFoundError: + from api_2_db import DataSyncer +from pandas import Timestamp + + +def init_db(): + print('intializing DB') + db_sync = DataSyncer(config_path="../conf") + timenow = Timestamp.now() + db_sync.__delete_table__() + db_sync.__create_table__() + db_sync.update_pool_stats(timenow) + # db_sync.db.fetch_data('stats') + db_sync.update_block_data(timenow) + # db_sync.db.fetch_data('block') + db_sync.update_miner_data(timenow) + print('complete') + + +if __name__ == '__main__': + init_db() \ No newline at end of file diff --git a/utils/update_blocks_and_workers.py b/utils/update_blocks_and_workers.py new file mode 100755 index 00000000..0e0248df --- /dev/null +++ b/utils/update_blocks_and_workers.py @@ -0,0 +1,20 @@ +try: + from utils.api_2_db import DataSyncer +except ModuleNotFoundError: + from api_2_db import DataSyncer + +from pandas import Timestamp + + +def update_blocks_and_live_workers(): + db_sync = DataSyncer(config_path="../conf") + timenow = Timestamp.now() + + # UPDATING BLOCK DATA + flag = db_sync.update_block_data(timenow) + + # UPDATING LIVE DATA + db_sync.update_miner_data(timenow, payment=flag, performance=False) + +if __name__ == '__main__': + update_blocks_and_live_workers() \ No newline at end of file diff --git a/utils/update_payment_and_performance.py b/utils/update_payment_and_performance.py new file mode 100755 index 00000000..e921b93f --- /dev/null +++ b/utils/update_payment_and_performance.py @@ -0,0 +1,15 @@ +try: + from utils.api_2_db import DataSyncer +except ModuleNotFoundError: + from api_2_db import DataSyncer +from pandas import Timestamp + +def update_payment_and_performance(): + db_sync = DataSyncer(config_path="../conf") + timenow = Timestamp.now() + + # UPDATING PAYMENT and PERFORMANCE DATA + db_sync.update_miner_data(timenow, live_data=False) + +if __name__ == '__main__': + update_payment_and_performance() \ No newline at end of file diff --git a/utils/update_pool_stats.py b/utils/update_pool_stats.py new file mode 100755 index 00000000..189c1017 --- /dev/null +++ b/utils/update_pool_stats.py @@ -0,0 +1,15 @@ +try: + from utils.api_2_db import DataSyncer +except ModuleNotFoundError: + from api_2_db import DataSyncer +from pandas import Timestamp + +def update_pool_stats(): + db_sync = DataSyncer(config_path="../conf") + timenow = Timestamp.now() + + # UPDATING POOL STATS + db_sync.update_pool_stats(timenow) + +if __name__ == '__main__': + update_pool_stats() \ No newline at end of file