Example #1
0
def check_solvency_job(context):
    message = check_solvency(context)
    if message:
        try_message_to_all_users(context, text=message)
Example #2
0
def check_network_security_job(context):
    text = check_network_security(context)
    if text is not None:
        try_message_to_all_users(context, text=text)
Example #3
0
def check_churning(context):
    try:
        validators = get_node_accounts()
    except Exception as e:
        logger.exception(e)
        logger.error(
            "I couldn't get the node accounts while checking if churning occurred."
        )
        return

    if 'node_statuses' not in context.bot_data:
        context.bot_data['node_statuses'] = {}
        for validator in validators:
            context.bot_data['node_statuses'][
                validator['node_address']] = validator['status']
        return

    local_node_statuses = context.bot_data['node_statuses']

    churned_in = []
    churned_out = []
    highest_churn_status_since = 0
    for validator in validators:
        if did_churn_happen(validator, local_node_statuses,
                            highest_churn_status_since):
            highest_churn_status_since = int(validator['status_since'])

    for validator in validators:
        remote_status = validator['status']
        local_status = local_node_statuses[
            validator['node_address']] if validator[
                'node_address'] in local_node_statuses else "unknown"
        if remote_status != local_status:
            if 'active' == remote_status:
                churned_in.append({
                    "address": validator['node_address'],
                    "bond": validator['bond']
                })
            elif 'active' == local_status:
                churned_out.append({
                    "address": validator['node_address'],
                    "bond": validator['bond']
                })

    if len(churned_in) or len(churned_out):
        text = "šŸ”„ CHURN SUMMARY\n" \
               "THORChain has successfully churned:\n\n"
        text += "Nodes Added:\n" if len(churned_in) else ""
        for node in churned_in:
            text += f"*{node['address']}*\nBond: *{tor_to_rune(node['bond'])}*\n"
        text += "\nNodes Removed:\n" if len(churned_out) else ""
        for node in churned_out:
            text += f"*{node['address']}*\nBond: *{tor_to_rune(node['bond'])}*\n"
        text += "\nSystem:\n"

        try:
            network = get_network_data()
            text += f"šŸ“” Network Security: *{network_security_ratio_to_string(get_network_security_ratio(network))}*\n\n" \
                    f"šŸ’š Total Active Bond: *{tor_to_rune(network['bondMetrics']['totalActiveBond'])}* (total)\n\n" \
                    "āš–ļø Bonded/Staked Ratio: *" + '{:.2f}'.format(
                int(get_network_security_ratio(network) * 100)) + " %*\n\n" \
                                                                  "ā†©ļø Bonding ROI: *" + '{:.2f}'.format(
                float(network['bondingAPY']) * 100) + " %* APY\n\n" \
                                                      "ā†©ļø Liquidity ROI: *" + '{:.2f}'.format(
                float(network['liquidityAPY']) * 100) + " %* APY"

            context.bot_data.setdefault("vault_addresses", {})
            current_chains = get_pool_addresses_from_any_node()

            for chain in current_chains:
                if chain['chain'] in context.bot_data['vault_addresses']:
                    if chain['address'] != context.bot_data['vault_addresses'][
                            chain['chain']]:
                        text += f"\n\nšŸ” Vault Addresses:" if "Vault Addresses" not in text else ""
                        text += f"\n*{chain['chain']}*: \n" \
                                f"Old Vault address: {context.bot_data['vault_addresses'][chain['chain']]}\n"\
                                f"ā¬‡ļø\n" \
                                f"New Vault address: {chain['address']}\n"
                    else:
                        text += "\n\nāš ļø šŸšØ CHURNING BUT THE VAULT ADDRESSES DID NOT CHANGE šŸšØ\n"
                context.bot_data['vault_addresses'][
                    chain['chain']] = chain['address']

        except Exception as e:
            logger.exception(e)

        try_message_to_all_users(context, text=text)

    for validator in validators:
        context.bot_data['node_statuses'][
            validator['node_address']] = validator['status']
Example #4
0
def check_thorchain_constants_job(context):
    changed_values = check_thorchain_constants(context)

    if changed_values is not None:
        try_message_to_all_users(context, changed_values)