pyblock/pybitblock/ppi.py
GaltRanch 389f6f3497 fix: address 4 security/quality findings from KCode audit
Automated fixes applied by KCode Audit Engine:
- pybitblock/SPV/apisnd.py         | 2 ++
- pybitblock/SPV/nodeconnection.py | 4 ++++
- pybitblock/ppi.py                | 2 ++

Signed-off-by: Astrolexis.space — Kulvex Code
2026-04-06 00:17:24 -03:00

2118 lines
86 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Developer: Curly60e
#Tester: __B__T__C__
#𝕪𝔹𝕃𝕆𝕂 𝕚𝕥𝕤 𝕒 𝔹𝕚𝕥𝕔𝕠𝕚𝕟 𝔻𝕒𝕤𝕙𝕓𝕠𝕒𝕣𝕕 𝕨𝕚𝕥𝕙 𝕪𝕡𝕙𝕖𝕣𝕡𝕦𝕟𝕜 𝕒𝕖𝕤𝕥𝕙𝕖𝕥𝕚𝕔.
import base64, codecs, requests
import logging
import subprocess
import os
import os.path
import qrcode
import xmltodict
import time as t
try:
import simplejson as json
except ImportError:
import json
from cfonts import render, say
from pblogo import blogo
from logos import logoB
#from lnpay_py.wallet import LNPayWallet
from pycoingecko import CoinGeckoAPI
logger = logging.getLogger(__name__)
# Allowed fiat currency codes for rate.sx
_VALID_FIAT_CODES = {
'AUD', 'BRL', 'CAD', 'CHF', 'CLP', 'CNY', 'CZK', 'DKK', 'EUR', 'GBP',
'HKD', 'HUF', 'IDR', 'ILS', 'INR', 'JPY', 'KRW', 'MXN', 'MYR', 'NOK',
'NZD', 'PHP', 'PKR', 'PLN', 'RUB', 'SEK', 'SGD', 'THB', 'TRY', 'TWD',
'USD',
}
def clear(): # clear the screen
subprocess.run(['clear'] if os.name != 'nt' else ['cls'], shell=(os.name == 'nt')) # noqa: S603 - hardcoded safe commands only
def closed():
print("<<< Back Control + C.\n\n")
def opreturnOnchainONLY():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
try:
clear()
blogo()
output = render(
"OP_RETURN Message", colors=['yellow'], align='left', font='tiny'
)
print(output)
message = input("Message: ")
while len(message) > 70:
clear()
blogo()
print("Error! Only 80 characters allowed!")
message = input("\nMessage: ")
resp = requests.post('https://opreturnbot.com/api/create', json={'message': message + '...PyBLOCK'}, timeout=10)
b = resp.text
clear()
blogo()
print("\033[1;30;47m")
qr.add_data(b)
qr.print_ascii()
print("\033[0;37;40m")
print(f'LND Invoice: {b}')
qr.clear()
input("\nContinue...")
if lndconnectload['ln']:
invoiceN = b
invoice = invoiceN.lower()
lsd = subprocess.run([lndconnectload["ln"], "decodepayreq", invoice], capture_output=True, text=True).stdout
lsd0 = str(lsd)
d = json.loads(lsd0)
url = f"https://opreturnbot.com/api/status/{d['payment_hash']}"
else:
cert_path = lndconnectload["tls"]
with open(lndconnectload["macaroon"], 'rb') as f:
macaroon = codecs.encode(f.read(), 'hex')
headers = {'Grpc-Metadata-macaroon': macaroon}
url = f'https://{lndconnectload["ip_port"]}/v1/payreq/{b}'
r = requests.get(url, headers=headers, verify=cert_path, timeout=10)
s = r.json()
url = f"https://opreturnbot.com/api/status/{s['payment_hash']}"
response = requests.get(url, timeout=10)
responseB = str(response.text)
responseC = responseB
clear()
blogo()
print("\nTransaction ID: " + responseC)
input("\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError, subprocess.SubprocessError, OSError) as e:
logger.debug("opreturnOnchainONLY error: %s", e)
def opreturn():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
try:
lndconnectload = {"ip_port":"", "tls":"", "macaroon":"", "ln":""}
if os.path.isfile('blndconnect.conf'): # Check if the file 'bclock.conf' is in the same folder
with open("blndconnect.conf", "r") as f:
lndconnectData = json.load(f) # Load the file 'bclock.conf'
lndconnectload = lndconnectData # Copy the variable pathv to 'path'
else:
clear()
blogo()
print("\n\tIf you are going to use your local node leave IP:PORT/CERT/MACAROONS in blank.\n")
lndconnectload["ip_port"] = input("Insert IP:PORT to your node: ") # path to the bitcoin-cli
lndconnectload["tls"] = input("Insert the path to tls.cert file: ")
lndconnectload["macaroon"] = input("Insert the path to admin.macaroon: ")
print("\n\tLocal Lightning Node connection.\n")
lndconnectload["ln"] = input("Insert the path to lncli: ")
with open("blndconnect.conf", "w") as f:
json.dump(lndconnectload, f) # Save the file 'bclock.conf'
path = {"ip_port":"", "rpcuser":"", "rpcpass":"", "bitcoincli":""}
if os.path.isfile('bclock.conf') or os.path.isfile('blnclock.conf'): # Check if the file 'bclock.conf' is in the same folder
with open("bclock.conf", "r") as f:
pathv = json.load(f) # Load the file 'bclock.conf'
path = pathv # Copy the variable pathv to 'path'
else:
blogo()
print("Welcome to \033[1;31;40mPyBLOCK\033[0;37;40m\n\n")
print("\n\tIf you are going to use your local node leave IP:PORT/USER/PASSWORD in blank.\n")
path[
'ip_port'
] = f'http://{input("Insert IP:PORT to access your remote Bitcoin-Cli node: ")}'
path['rpcuser'] = input("RPC User: ")
path['rpcpass'] = input("RPC Password: ")
print("\n\tLocal Bitcoin Core Node connection.\n")
path['bitcoincli']= input("Insert the Path to Bitcoin-Cli: ")
with open("bclock.conf", "w") as f:
json.dump(path, f)
clear()
blogo()
output = render(
"OP_RETURN Message", colors=['yellow'], align='left', font='tiny'
)
print(output)
message = input("Message: ")
while len(message) > 70:
clear()
blogo()
print("Error! Only 80 characters allowed!")
message = input("\nMessage: ")
resp = requests.post('https://opreturnbot.com/api/create', json={'message': message + '...PyBLOCK'}, timeout=10)
b = resp.text
node_not = input("\nDo you want to pay this invoice with your node? Y/n: ")
if node_not in ["Y", "y"]:
lndconnectload = {"ip_port":"", "tls":"", "macaroon":"", "ln":""}
with open("blndconnect.conf", "r") as f:
lndconnectData = json.load(f) # Load the file 'bclock.conf'
lndconnectload = lndconnectData # Copy the variable pathv to 'path'
if lndconnectload['ip_port']:
print("\nInvoice: " + b + "\n")
payinvoice()
cert_path = lndconnectload["tls"]
with open(lndconnectload["macaroon"], 'rb') as f:
macaroon = codecs.encode(f.read(), 'hex')
headers = {'Grpc-Metadata-macaroon': macaroon}
url = f'https://{lndconnectload["ip_port"]}/v1/payreq/{b}'
r = requests.get(url, headers=headers, verify=cert_path, timeout=10)
s = r.json()
url = f"https://opreturnbot.com/api/status/{s['payment_hash']}"
response = requests.get(url, timeout=10)
responseB = str(response.text)
responseC = responseB
clear()
blogo()
print("\nTransaction ID: " + responseC)
input("\nContinue...")
elif lndconnectload['ln']:
print("\nInvoice: " + b + "\n")
localpayinvoice()
invoiceN = b
invoice = invoiceN.lower()
lsd = subprocess.run([lndconnectload["ln"], "decodepayreq", invoice], capture_output=True, text=True).stdout
lsd0 = str(lsd)
d = json.loads(lsd0)
url = f"https://opreturnbot.com/api/status/{d['payment_hash']}"
response = requests.get(url, timeout=10)
responseB = str(response.text)
responseC = responseB
clear()
blogo()
print("\nTransaction ID: " + responseC)
input("\nContinue...")
else:
clear()
blogo()
print("\033[1;30;47m")
qr.add_data(b)
qr.print_ascii()
print("\033[0;37;40m")
print(f'LND Invoice: {b}')
qr.clear()
input("\nContinue...")
if lndconnectload['ln']:
invoiceN = b
invoice = invoiceN.lower()
lsd = subprocess.run([lndconnectload["ln"], "decodepayreq", invoice], capture_output=True, text=True).stdout
lsd0 = str(lsd)
d = json.loads(lsd0)
url = f"https://opreturnbot.com/api/status/{d['payment_hash']}"
else:
cert_path = lndconnectload["tls"]
with open(lndconnectload["macaroon"], 'rb') as f:
macaroon = codecs.encode(f.read(), 'hex')
headers = {'Grpc-Metadata-macaroon': macaroon}
url = f'https://{lndconnectload["ip_port"]}/v1/payreq/{b}'
r = requests.get(url, headers=headers, verify=cert_path, timeout=10)
s = r.json()
url = f"https://opreturnbot.com/api/status/{s['payment_hash']}"
response = requests.get(url, timeout=10)
responseB = str(response.text)
responseC = responseB
clear()
blogo()
print("\nTransaction ID: " + responseC)
input("\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError, subprocess.SubprocessError, OSError) as e:
logger.debug("opreturn error: %s", e)
def opreturn_view():
try:
clear()
blogo()
output = render(
"OP_RETURN Message", colors=['yellow'], align='left', font='tiny'
)
print(output)
responseC = input("TX ID: ")
url2 = f'https://opreturnbot.com/api/view/{responseC}'
r = requests.get(url2, timeout=10)
r2 = str(r.text)
r3 = r2
clear()
blogo()
print("\nTransaction ID: " + responseC)
print(f'OP_RETURN Message: {r3}')
input("\nContinue...")
except (requests.RequestException, KeyError) as e:
logger.debug("opreturn_view error: %s", e)
def opretminer():
try:
resp = requests.get('https://bitcointicker.co/latestblocks/', timeout=15)
raw_html = resp.text
# Use html2text subprocess (safe: no user input)
proc = subprocess.run(
["html2text"],
input=raw_html, capture_output=True, text=True
)
lines = proc.stdout.splitlines()
filtered = []
capture = False
capture_count = 0
for line in lines:
stripped = line.replace('|', '')
if "Coinbase" in line:
capture = True
capture_count = 0
continue
if capture:
capture_count += 1
if capture_count > 70:
capture = False
elif '6.25' in stripped:
filtered.append(stripped)
a = '\n'.join(filtered)
clear()
blogo()
closed()
output = render(
"decoded coinbase", colors=['yellow'], align='left', font='tiny'
)
print(output)
print(a)
input("")
except (requests.RequestException, subprocess.SubprocessError, OSError) as e:
logger.debug("opretminer error: %s", e)
#-----------------------------GAMES--------------------------------
#------------------------------------------------------------------
def gameroom():
try:
clear()
blogo()
print("""
--------------------------------------
INITIATE ARCADE?
--------------------------------------
""".format(closed()))
input("\a\nContinue...")
subprocess.run(["ssh", "gameroom@bitreich.org"])
except (subprocess.SubprocessError, OSError) as e:
logger.debug("gameroom error: %s", e)
#----------------------------------------------------------------------
#-----------------------------Stats--------------------------------
def statsConn():
try:
resp = requests.get('https://www.bitcoinblockhalf.com/', timeout=15)
proc = subprocess.run(
["html2text"],
input=resp.text, capture_output=True, text=True
)
lines = proc.stdout.splitlines()
filtered = []
capture = False
capture_count = 0
for line in lines:
cleaned = line.replace('*', '').replace('"', '')
if "Total" in line:
capture = True
capture_count = 0
if capture:
capture_count += 1
if capture_count > 11:
capture = False
elif '--' not in cleaned:
filtered.append(cleaned)
a = '\n'.join(filtered)
clear()
blogo()
closed()
output = render("stats", colors=['yellow'], align='left', font='tiny')
print(output)
print(a)
input("\a\nContinue...")
except (requests.RequestException, subprocess.SubprocessError, OSError) as e:
logger.debug("statsConn error: %s", e)
#-----------------------------END Stats--------------------------------
#-----------------------------PGP--------------------------------
def pgpConn():
try:
resp = requests.get('https://web.archive.org/web/20110228054007/http://www.bitcoin.org/Satoshi_Nakamoto.asc', timeout=15)
a = resp.text
clear()
blogo()
closed()
output = render(
"pgp", colors=['yellow'], align='left', font='tiny'
)
print(output)
print(a)
input("\a\nContinue...")
except requests.RequestException as e:
logger.debug("pgpConn error: %s", e)
#-----------------------------END PGP--------------------------------
#-----------------------------MoscowT--------------------------------
def mtConn(): # here we convert the result of the command 'getblockcount' on a random art design
while True:
try:
resp = requests.get('https://blockchain.info/tobtc', params={'currency': 'USD', 'value': '1'}, timeout=10)
a = resp.text.strip()
sats = a.lstrip('0.')
clear()
blogo()
closed()
output = render("Moscow Time", colors=['yellow'], align='left', font='tiny')
outputT = render(f"{sats[:4]} sats", colors=['green'], align='left', font='tiny')
print(output)
print(outputT)
input("\a\nContinue...")
except (requests.RequestException, ValueError, KeyboardInterrupt):
break
def mtclock():
try:
resp = requests.get('https://blockchain.info/tobtc', params={'currency': 'USD', 'value': '1'}, timeout=10)
a = resp.text.strip()
clear()
blogo()
closed()
output = render("Moscow Time", colors=['yellow'], align='left', font='tiny')
outputT = render(f"{a} sats", colors=['green'], align='left', font='tiny')
print(output)
print(outputT)
input("\a\nContinue...")
except requests.RequestException as e:
logger.debug("mtclock error: %s", e)
#-----------------------------END MT--------------------------------
#-----------------------------Satoshi--------------------------------
def satoshiConn():
try:
resp = requests.get('https://www.metzdowd.com/pipermail/cryptography/2009-January/014994.html', timeout=15)
proc = subprocess.run(
["html2text"],
input=resp.text, capture_output=True, text=True
)
lines = proc.stdout.splitlines()
# Take last 82 lines, filter out navigation text
tail_lines = lines[-82:] if len(lines) >= 82 else lines
exclude = ["Unsubscribe", "Next message", "Previous message", "Messages sorted", "More information", "list]"]
filtered = [l for l in tail_lines if not any(ex in l for ex in exclude)]
a = '\n'.join(filtered)
clear()
blogo()
closed()
output = render(
"𝐒𝐚𝐭𝐨𝐬𝐡𝐢 𝐍𝐚𝐤𝐚𝐦𝐨𝐭𝐨. 𝟎𝐱𝟏𝟖𝐂𝟎𝟗𝐄𝟖𝟔𝟓𝐄𝐂𝟗𝟒𝟖𝐀𝟏. 𝐃𝐄𝟒𝐄 𝐅𝐂𝐀𝟑 𝐄𝟏𝐀𝐁 𝟗𝐄𝟒𝟏 𝐂𝐄𝟗𝟔 𝐂𝐄𝐂𝐁 𝟏𝟖𝐂𝟎 𝟗𝐄𝟖𝟔 𝟓𝐄𝐂𝟗 𝟒𝟖𝐀𝟏.", colors=['green'], align='left', font='console'
)
print(output)
print(a)
input("\a\nContinue...")
except (requests.RequestException, subprocess.SubprocessError, OSError) as e:
logger.debug("satoshiConn error: %s", e)
#-----------------------------END Satoshi--------------------------------
#-----------------------------Whale Alert--------------------------------
def whalalConn():
try:
api_key = os.environ.get("WHALE_ALERT_API_KEY", "")
if not api_key:
print("\n\033[1;31;40mSet WHALE_ALERT_API_KEY environment variable to use Whale Alert.\033[0;37;40m")
input("\nContinue...")
return
url = "https://api.whale-alert.io/v1/transactions"
params = {"api_key": api_key, "limit": 7, "min_value": 5000000, "currency": "btc"}
response = requests.get(url, params=params, timeout=10)
data = response.json()
clear()
blogo()
closed()
output = render("whale alert", colors=['yellow'], align='left', font='tiny')
print(output)
for tx in data.get("transactions", []):
blockchain = tx.get("blockchain", "unknown")
amount = tx.get("amount", 0)
amount_usd = tx.get("amount_usd", 0)
print(f" WHALE ALERT ₿ {amount} =${amount_usd:.0f}")
input("\a\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError) as e:
logger.debug("whalalConn error: %s", e)
#-----------------------------END Whale Alert--------------------------------
#-----------------------------bwt.dev--------------------------------
def bwtConn():
try:
resp = requests.get('https://bwt.dev/banner.txt', timeout=10)
a = resp.text
clear()
blogo()
closed()
print(a)
input("\a\nContinue...")
except requests.RequestException as e:
logger.debug("bwtConn error: %s", e)
#-----------------------------END bwt.dev--------------------------------
#-----------------------------Dates--------------------------------
def datesConn():
try:
resp = requests.get('https://bitcoinexplorer.org/fun', timeout=15)
proc = subprocess.run(
["html2text"],
input=resp.text, capture_output=True, text=True
)
lines = proc.stdout.splitlines()
filtered = []
for line in lines:
if '20' in line and 'https' not in line and ' ' in line:
cleaned = line.replace('[', '').replace(',', '')
filtered.append(cleaned)
if len(filtered) >= 46:
break
a = '\n'.join(filtered)
clear()
blogo()
closed()
output = render("dates", colors=['yellow'], align='left', font='tiny')
print(output)
print(a)
input("\a\nContinue...")
except (requests.RequestException, subprocess.SubprocessError, OSError) as e:
logger.debug("datesConn error: %s", e)
#-----------------------------END Dates--------------------------------
#-----------------------------Quotes--------------------------------
def quotesConn():
try:
resp = requests.get('https://bitcoinexplorer.org/api/quotes/all', timeout=10)
data = resp.json()
clear()
blogo()
closed()
output = render("quotes", colors=['yellow'], align='left', font='tiny')
print(output)
for quote in data:
text = quote.get('text', '')
speaker = quote.get('speaker', '')
url = quote.get('url', '')
date = quote.get('date', '')
if 'conQuote' not in text:
print(f' Quote: {text}')
print(f' By: {speaker}')
if url:
print(f' Link: {url}')
if date:
print(f' Date: {date}')
print()
input("\a\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError) as e:
logger.debug("quotesConn error: %s", e)
#-----------------------------END Quotes--------------------------------
#-----------------------------Hashrate--------------------------------
def miningConn():
try:
resp = requests.get('https://bitcoinexplorer.org/api/mining/hashrate', timeout=10)
data = resp.json()
clear()
blogo()
closed()
output = render("hashrate", colors=['yellow'], align='left', font='tiny')
print(output)
for key, value in data.items():
if isinstance(value, dict):
for k, v in value.items():
print(f' {k}: {v}')
else:
print(f' {key}: {value}')
input("\a\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError) as e:
logger.debug("miningConn error: %s", e)
#-----------------------------END Hashrate--------------------------------
#-----------------------------StatsLN--------------------------------
def stalnConn():
try:
resp = requests.get('https://1ml.com', timeout=15)
proc = subprocess.run(
["html2text"],
input=resp.text, capture_output=True, text=True
)
lines = proc.stdout.splitlines()
filtered = []
capture = False
capture_count = 0
for line in lines:
stripped = ' '.join(line.split())
if "Number" in line:
capture = True
capture_count = 0
if capture:
filtered.append(stripped)
capture_count += 1
if capture_count > 8:
capture = False
a = '\n'.join(filtered)
clear()
blogo()
closed()
output = render(
"lightning stats", colors=['yellow'], align='left', font='tiny'
)
print(output)
print(a)
input("\a\nContinue...")
except (requests.RequestException, subprocess.SubprocessError, OSError) as e:
logger.debug("stalnConn error: %s", e)
#-----------------------------END StatsLN--------------------------------
#-----------------------------StatRanking--------------------------------
def ranConn():
try:
resp = requests.get('https://1ml.com/node?order=capacity&json=true', timeout=15)
data = resp.json()
clear()
blogo()
closed()
output = render("ranking", colors=['yellow'], align='left', font='tiny')
print(output)
exclude_keys = {'last_update', 'color', 'noderank', 'addresses'}
for node in data:
if isinstance(node, dict):
for k, v in node.items():
if k not in exclude_keys:
label = 'Node' if k == 'alias' else ('RANK' if k == 'capacity' else k)
print(f' {label}: {v}')
print()
input("\a\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError, ValueError) as e:
logger.debug("ranConn error: %s", e)
#-----------------------------END Ranking--------------------------------
def trustednode():
try:
clear()
blogo()
closed()
addv = """
---------------------------------------------------------------
REMEMBER TO INITIALIZE \033[1;35;40mTOR\033[0;37;40m ON THE SHELL
$ source torsocks on
---------------------------------------------------------------
"""
print(addv)
input("\a\nContinue...")
conn = ["telnet", "cut45oarvxfvfydrjery6slyeca4zpal7tljygdt5bji7l3jsrrgwkad.onion", "6023"]
subprocess.run(conn)
except (subprocess.SubprocessError, OSError) as e:
logger.debug("trustednode error: %s", e)
#-----------------------------END GAMES--------------------------------
#-----------------------------Node Miner--------------------------------
def CoreMiner():
try:
clear()
blogo()
output = render("Core Miner", colors=['yellow'], align='left', font='tiny')
print(output)
input("\a\n...Mining...")
subprocess.run([path['bitcoincli'], "-generate", "1", "2147483647"])
input("\a\nContinue...")
except (subprocess.SubprocessError, OSError, KeyError) as e:
logger.debug("CoreMiner error: %s", e)
def OwnNodeMinerComputer():
try:
clear()
blogo()
output = render(
"Own Node Miner", colors=['yellow'], align='left', font='tiny'
)
if os.path.isdir ('OwnNodeMiner'):
print("...Follow the steps...")
else: # Check if the file 'bclock.conf' is in the same folder
os.makedirs("OwnNodeMiner", exist_ok=True)
subprocess.run(["wget", "https://github.com/pooler/cpuminer/releases/download/v2.5.1/pooler-cpuminer-2.5.1-linux-x86_64.tar.gz"], cwd="OwnNodeMiner")
# SECURITY: Validate user-controlled args before passing to subprocess
# Sanitize: strip shell metacharacters, validate expected format
subprocess.run(["tar", "-xf", "pooler-cpuminer-2.5.1-linux-x86_64.tar.gz"], cwd="OwnNodeMiner")
clear()
blogo()
print(output)
responseC = input("Your RPC User: ")
responseD = input("Your RPC Pass: ")
responseE = input("Your Bitcoin Address: ")
responseF = input("Select Your Threads, 2, 4, 6, 8, 10, ..: ")
subprocess.run(["./minerd", "-a", "sha256d", "-O", f"{responseC}:{responseD}", "-o", "http://127.0.0.1:8332", f"--coinbase-addr={responseE}", "-t", responseF], cwd="OwnNodeMiner")
input("\a\nContinue...")
except (subprocess.SubprocessError, OSError) as e:
logger.debug("OwnNodeMinerComputer error: %s", e)
def OwnNodeMinerRaspberry():
try:
clear()
blogo()
output = render(
"Own Node Miner", colors=['yellow'], align='left', font='tiny'
)
if os.path.isdir ('OwnNodeMiner'):
print("...Follow the steps...")
else: # Check if the file 'bclock.conf' is in the same folder
os.makedirs("OwnNodeMiner", exist_ok=True)
subprocess.run(["git", "clone", "https://github.com/jojapoppa/cpuminer-multi-arm.git"], cwd="OwnNodeMiner")
clear()
blogo()
print(output)
responseC = input("Your RPC User: ")
responseD = input("Your RPC Pass: ")
responseE = input("Your Bitcoin Address: ")
responseF = input("Select Your Threads, 2, 4, 6, 8, 10, ..: ")
subprocess.run(["./cpuminer", "-a", "sha256d", "-O", f"{responseC}:{responseD}", "-o", "http://127.0.0.1:8332", f"--coinbase-addr={responseE}", "-t", responseF], cwd="OwnNodeMiner/cpuminer-multi-arm")
input("\a\nContinue...")
except (subprocess.SubprocessError, OSError) as e:
logger.debug("OwnNodeMinerRaspberry error: %s", e)
#-----------------------------Node Miner--------------------------------
#-----------------------------wttr.in--------------------------------
def wttrDataV1():
try:
clear()
blogo()
weatherList = """
------------------------------------------------------------------------------------
\033[1;31;40m*\033[0;37;40m uruguay # city name
\033[1;31;40m*\033[0;37;40m ~Giza+pyramid # any location (+ for spaces)
\033[1;31;40m*\033[0;37;40m Москва # Unicode name of any location in any language
\033[1;31;40m*\033[0;37;40m muc # airport code (3 letters)
\033[1;31;40m*\033[0;37;40m @lightninghood.com # domain name
\033[1;31;40m*\033[0;37;40m 94107 # area codes
\033[1;31;40m*\033[0;37;40m -78.46,106.79 # GPS coordinates
\033[1;31;40m*\033[0;37;40m moon # Moon phase (add ,+US or ,+France for these cities)
\033[1;31;40m*\033[0;37;40m moon@2009-01-03 # Moon phase for the date (@2016-10-25)
PRESS \033[1;32;40mM\033[0;37;40m TO INSERT MORE DATA
------------------------------------------------------------------------------------
"""
print(weatherList)
selectData = input("Insert your data \033[1;31;40m*\033[0;37;40m : ")
if selectData in ['M', 'm']:
moreData = """
------------------------------------------------------------------------------------
Supported languages
ar af be ca da de el es et fr fa hi hu ia id it nb nl
oc pl pt-br ro ru tr th uk vi zh-cn zh-tw (supported)
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
Units
m # metric (SI) (used by default everywhere except US)
u # USCS (used by default in US)
M # show wind speed in m/s
------------------------------------------------------------------------------------
"""
print(moreData)
selectData2 = input("Insert your data \033[1;31;40m*\033[0;37;40m : ")
lang = input("Insert your language: ")
unit = input("Insert your metric units: ")
url = f"https://{lang}.wttr.in/{selectData2}?F&{unit}"
else:
url = f"https://wttr.in/{selectData}?F"
a = requests.get(url, headers={"User-Agent": "curl"}, timeout=15).text
clear()
blogo()
print(a)
input("Continue...")
except requests.RequestException as e:
logger.debug("wttrDataV1 error: %s", e)
def wttrDataV2():
try:
clear()
blogo()
weatherList = """
------------------------------------------------------------------------------------
\033[1;31;40m*\033[0;37;40m uruguay # city name
\033[1;31;40m*\033[0;37;40m ~Giza+pyramid # any location (+ for spaces)
\033[1;31;40m*\033[0;37;40m Москва # Unicode name of any location in any language
\033[1;31;40m*\033[0;37;40m muc # airport code (3 letters)
\033[1;31;40m*\033[0;37;40m @lightninghood.com # domain name
\033[1;31;40m*\033[0;37;40m 94107 # area codes
\033[1;31;40m*\033[0;37;40m -78.46,106.79 # GPS coordinates
PRESS \033[1;32;40mM\033[0;37;40m TO INSERT MORE DATA
------------------------------------------------------------------------------------
"""
print(weatherList)
selectData = input("Insert your data \033[1;31;40m*\033[0;37;40m : ")
if selectData in ['M', 'm']:
moreData = """
------------------------------------------------------------------------------------
Supported languages
ar af be ca da de el es et fr fa hi hu ia id it nb nl
oc pl pt-br ro ru tr th uk vi zh-cn zh-tw (supported)
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
Units
m # metric (SI) (used by default everywhere except US)
u # USCS (used by default in US)
M # show wind speed in m/s
------------------------------------------------------------------------------------
"""
print(moreData)
selectData2 = input("Insert your data \033[1;31;40m*\033[0;37;40m : ")
lang = input("Insert your language: ")
unit = input("Insert your metric units: ")
url = f"https://v2.wttr.in/{selectData2}?{unit}&F&lang={lang}"
else:
url = f"https://v2.wttr.in/{selectData}?F"
a = requests.get(url, headers={"User-Agent": "curl"}, timeout=15).text
clear()
blogo()
print(a)
input("Continue...")
except requests.RequestException as e:
logger.debug("wttrDataV2 error: %s", e)
#-----------------------------END wttr.in--------------------------------
#-----------------------------RATE.SX--------------------------------
def rateSXList():
try:
clear()
blogo()
fiat = """
-------------------------------------------
AUD Australian dollar
BRL Brazilian real
CAD Canadian dollar
CHF Swiss franc
CLP Chilean peso
CNY Chinese yuan
CZK Czech koruna
DKK Danish krone
EUR Euro
GBP Pound sterling
HKD Hong Kong dollar
HUF Hungarian forint
IDR Indonesian rupiah
ILS Israeli shekel
INR Indian rupee
JPY Japanese yen
KRW South Korean won
MXN Mexican peso
MYR Malaysian ringgit
NOK Norwegian krone
NZD New Zealand dollar
PHP Philippine peso
PKR Pakistani rupee
PLN Polish zloty
RUB Russian ruble
SEK Swedish krona
SGD Singapore dollar
THB Thai baht
TRY Turkish lira
TWD New Taiwan dollar
USD Dollars
-------------------------------------------
"""
print(fiat)
selectFiat = input("Insert a Fiat currency: ").strip().upper()
if selectFiat not in _VALID_FIAT_CODES:
print(f"Invalid currency code: {selectFiat}")
return
except (KeyboardInterrupt, EOFError):
return
while True:
try:
url = f"https://{selectFiat}.rate.sx/?F&n=1"
resp = requests.get(url, headers={"User-Agent": "curl"}, timeout=15)
a = resp.text
clear()
blogo()
closed()
print(a)
t.sleep(20)
except (requests.RequestException, KeyboardInterrupt):
break
def rateSXGraph():
try:
clear()
blogo()
fiat = """
-------------------------------------------
AUD Australian dollar
BRL Brazilian real
CAD Canadian dollar
CHF Swiss franc
CLP Chilean peso
CNY Chinese yuan
CZK Czech koruna
DKK Danish krone
EUR Euro
GBP Pound sterling
HKD Hong Kong dollar
HUF Hungarian forint
IDR Indonesian rupiah
ILS Israeli shekel
INR Indian rupee
JPY Japanese yen
KRW South Korean won
MXN Mexican peso
MYR Malaysian ringgit
NOK Norwegian krone
NZD New Zealand dollar
PHP Philippine peso
PKR Pakistani rupee
PLN Polish zloty
RUB Russian ruble
SEK Swedish krona
SGD Singapore dollar
THB Thai baht
TRY Turkish lira
TWD New Taiwan dollar
USD Dollars
-------------------------------------------
"""
print(fiat)
selectFiat = input("Insert a Fiat currency: ").strip().upper()
if selectFiat not in _VALID_FIAT_CODES:
print(f"Invalid currency code: {selectFiat}")
return
except (KeyboardInterrupt, EOFError):
return
while True:
try:
url = f"https://{selectFiat}.rate.sx/btc"
resp = requests.get(url, headers={"User-Agent": "curl"}, timeout=15)
lines = resp.text.splitlines()
filtered = [l for l in lines if 'Use' not in l]
a = '\n'.join(filtered)
clear()
blogo()
closed()
print(a)
t.sleep(20)
except (requests.RequestException, KeyboardInterrupt):
break
#-----------------------------END RATE.SX--------------------------------
#-----------------------------COINGECKO--------------------------------
def CoingeckoPP():
try:
btcInfo = CoinGeckoAPI()
n = btcInfo.get_price(ids='bitcoin', vs_currencies='usd,eur,gbp,jpy,aud')
q = n['bitcoin']
usd = q['usd']
eur = q['eur']
gbp = q['gbp']
jpy = q['jpy']
aud = q['aud']
print("""
--------------------COINGECKO BITCOIN PRICE-----------------------
1 BTC = {} USD
1 BTC = {} EUR
1 BTC = {} GBP
1 BTC = {} JPY
1 BTC = {} AUD
------------------------------------------------------------------
...BUT...
1 BTC = 1 BTC
------------------------------------------------------------------
""".format(usd,eur,gbp,jpy,aud))
input("Continue...")
except (requests.RequestException, KeyError, ValueError) as e:
logger.debug("CoingeckoPP error: %s", e)
#-----------------------------END COINGECKO--------------------------------
#-----------------------------LNBITS--------------------------------
def loadFileConnLNBits(lnbitLoad):
lnbitLoad = {"wallet_name":"", "wallet_id":"", "admin_key":"", "invoice_read_key":""}
if os.path.isfile('lnbit.conf'): # Check if the file 'bclock.conf' is in the same folder
with open("lnbit.conf", "r") as f:
lnbitData = json.load(f) # Load the file 'bclock.conf'
lnbitLoad = lnbitData # Copy the variable pathv to 'path'
else:
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO LNBITS.COM.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mlnbitSN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
lnbitLoad["wallet_name"] = input("Wallet name: ") # path to the bitcoin-cli
lnbitLoad["wallet_id"] = input("Wallet ID: ")
lnbitLoad["admin_key"] = input("Admin key: ")
lnbitLoad["invoice_read_key"] = input("Invoice/read key: ")
with open("lnbit.conf", "w") as f:
json.dump(lnbitLoad, f)
return lnbitLoad
def createFileConnLNBits():
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO LNBITS.COM.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mlnbitSN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
lnbitLoad = {
'wallet_id': '',
'admin_key': '',
'invoice_read_key': '',
'wallet_name': input("Wallet name: "),
}
lnbitLoad["wallet_id"] = input("Wallet ID: ")
lnbitLoad["admin_key"] = input("Admin key: ")
lnbitLoad["invoice_read_key"] = input("Invoice/read key: ")
with open("lnbit.conf", "w") as f:
json.dump(lnbitLoad, f)
def lnbitCreateNewInvoice():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
try:
print("\n\tLNBITS CREATE INVOICE\n")
amt = input("Amount: ")
memo = input("Memo: ")
a = loadFileConnLNBits(['invoice_read_key'])
b = str(a['invoice_read_key'])
headers = {"X-Api-Key": b, "Content-type": "application/json"}
payload = {"out": False, "amount": int(amt), "memo": f"{memo} -PyBLOCK"}
sh = requests.post("https://legend.lnbits.com/api/v1/payments", json=payload, headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
q = d['payment_request']
c = q.lower()
node_not = input("Do you want to pay this invoice with your node? Y/n: ")
while True:
if node_not in ["Y", "y"]:
lndconnectload = {"ip_port":"", "tls":"", "macaroon":"", "ln":""}
with open("blndconnect.conf", "r") as f:
lndconnectData = json.load(f) # Load the file 'bclock.conf'
lndconnectload = lndconnectData # Copy the variable pathv to 'path'
if lndconnectload['ip_port']:
print("\nInvoice: " + c + "\n")
payinvoice()
elif lndconnectload['ln']:
print("\nInvoice: " + c + "\n")
localpayinvoice()
elif node_not in ["N", "n"]:
print("\033[1;30;47m")
qr.add_data(c)
qr.print_ascii()
print("\033[0;37;40m")
qr.clear()
print(f'Lightning Invoice: {c}')
t.sleep(10)
dn = str(d['checking_id'])
headers = {"X-Api-Key": b, "Content-type": "application/json"}
rsh = requests.get(f"https://legend.lnbits.com/api/v1/payments/{dn}", headers=headers, timeout=10).text
clear()
blogo()
nn = str(rsh)
dd = json.loads(nn)
db = dd['paid']
if db != True:
continue
clear()
blogo()
tick()
t.sleep(2)
break
except (requests.RequestException, json.JSONDecodeError, KeyError, OSError) as e:
logger.debug("lnbitCreateNewInvoice error: %s", e)
def lnbitPayInvoice():
bolt = input("Invoice: ")
a = loadFileConnLNBits(['admin_key'])
b = str(a['admin_key'])
headers = {"X-Api-Key": b, "Content-type": "application/json"}
payload = {"out": True, "bolt11": bolt}
try:
sh = requests.post("https://legend.lnbits.com/api/v1/payments", json=payload, headers=headers, timeout=10).text
n = str(sh)
d = json.loads(n)
dn = str(d['checking_id'])
a = loadFileConnLNBits(['invoice_read_key'])
b = str(a['invoice_read_key'])
while True:
headers = {"X-Api-Key": b, "Content-type": "application/json"}
rsh = requests.get(f"https://legend.lnbits.com/api/v1/payments/{dn}", headers=headers, timeout=10).text
clear()
blogo()
nn = str(rsh)
dd = json.loads(nn)
db = dd['paid']
if db != True:
continue
tick()
t.sleep(2)
break
except (requests.RequestException, json.JSONDecodeError, KeyError) as e:
logger.debug("lnbitPayInvoice error: %s", e)
def lnbitCreatePayWall():
while True:
try:
url = input("Url: ")
memo = input("Memo: ")
desc = input("Description: ")
amt = input("Amount in sats: ")
remb = input("Remembers Y/n: ")
a = loadFileConnLNBits(['admin_key'])
if remb in ["Y", "y"]:
remember = "true"
elif remb in ["N", "n"]:
remember = "false"
b = str(a['admin_key'])
headers = {"X-Api-Key": b, "Content-type": "application/json"}
payload = {"url": url, "memo": memo, "description": desc, "amount": int(amt), "remembers": remember == "true"}
sh = requests.post("https://legend.lnbits.com/paywall/api/v1/paywalls", json=payload, headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
print("\n\tPAYWALL CREATED SUCCESSFULLY\n")
t.sleep(2)
clear()
aa = loadFileConnLNBits(['invoice_read_key'])
bb = str(a['invoice_read_key'])
headers = {"X-Api-Key": bb}
sh = requests.get("https://legend.lnbits.com/paywall/api/v1/paywalls", headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
while True:
print("\n\tLNBITS PAYWALL LIST\n")
for item_ in d:
s = item_
print(f'ID: {s["id"]}')
nd = input("\nSelect ID: ")
for item in d:
s = item
nn = s['id']
if nd == nn:
print("\n----------------------------------------------------------------------------------------------------------------")
print(
"""
\tLNBITS PAYWALL DECODED
ID: {}
Amount: {} sats
Description: {}
Memo: {}
Extras: {}
Remembers: {}
URL: {}
Wallet: {}
""".format(
nn,
s['amount'],
s['description'],
s['memo'],
s['extras'],
s['remembers'],
s['url'],
s['wallet'],
)
)
print("----------------------------------------------------------------------------------------------------------------\n")
input("Continue...")
clear()
blogo()
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
def lnbitListPawWall():
a = loadFileConnLNBits(['invoice_read_key'])
b = str(a['invoice_read_key'])
headers = {"X-Api-Key": b}
sh = requests.get("https://legend.lnbits.com/paywall/api/v1/paywalls", headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
while True:
print("\n\tLNBITS PAYWALL LIST\n")
try:
for item_ in d:
s = item_
print(f'ID: {s["id"]}')
nd = input("\nSelect ID: ")
for item in d:
s = item
nn = s['id']
if nd == nn:
print("\n----------------------------------------------------------------------------------------------------------------")
print("""
\tLNBITS PAYWALL DECODED
ID: {}
Amount: {} sats
Description: {}
Memo: {}
Extras: {}
Remembers: {}
URL: {}
Wallet: {}
""".format(s['id'], s['amount'], s['description'], s['memo'], s['extras'], s['remembers'], s['url'], s['wallet']))
print("----------------------------------------------------------------------------------------------------------------\n")
except (json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
input("Continue...")
clear()
blogo()
def lnbitDeletePayWall():
while True:
try:
a = loadFileConnLNBits(['invoice_read_key'])
b = str(a['invoice_read_key'])
headers = {"X-Api-Key": b}
sh = requests.get("https://legend.lnbits.com/paywall/api/v1/paywalls", headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
while True:
print("\n\tLNBITS PAYWALL LIST\n")
try:
for item_ in d:
s = item_
print(f'ID: {s["id"]}')
nd = input("\nSelect ID: ")
for item in d:
s = item
nn = s['id']
if nd == nn:
print("\n----------------------------------------------------------------------------------------------------------------")
print("""
\tLNBITS PAYWALL DECODED
ID: {}
Amount: {} sats
Description: {}
Memo: {}
Extras: {}
Remembers: {}
URL: {}
Wallet: {}
""".format(s['id'], s['amount'], s['description'], s['memo'], s['extras'], s['remembers'], s['url'], s['wallet']))
print("----------------------------------------------------------------------------------------------------------------\n")
except (json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
input("Continue...")
break
print("\n\tDELETE PAYWALL\n")
a = loadFileConnLNBits(['admin_key'])
b = str(a['admin_key'])
id = input("Insert PayWall ID: ")
headers = {"X-Api-Key": b}
sh = requests.delete(f"https://legend.lnbits.com/paywall/api/v1/paywalls/{id}", headers=headers, timeout=10).text
clear()
blogo()
print("\n\tPAYWALL DELETED SUCCESSFULLY\n")
t.sleep(2)
clear()
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
def lnbitsLNURLw():
while True:
try:
clear()
blogo()
print("""
----------------------
CREATE LNURL
----------------------\n""")
title = input("Title: ")
minwith = input("Minimum Withdraw: ")
maxwith = input("Maximum Withdraw: ")
usesw = input("Uses: ")
waittime = input("Wait Time: ")
isunique = input("Is unique? true/false: ")
a = loadFileConnLNBits(['admin_key'])
b = str(a['admin_key'])
headers = {"X-Api-Key": b, "Content-type": "application/json"}
payload = {"title": title, "min_withdrawable": int(minwith), "max_withdrawable": int(maxwith), "uses": int(usesw), "wait_time": int(waittime), "is_unique": isunique == "true"}
sh = requests.post("https://legend.lnbits.com/withdraw/api/v1/links", json=payload, headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
print("\n\tLNURLW CREATED SUCCESSFULLY\n")
t.sleep(2)
clear()
while True:
headers = {"X-Api-Key": b}
sh = requests.get("https://legend.lnbits.com/withdraw/api/v1/links", headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
print("\n\tLNBITS LNURLW LIST\n")
for item_ in d:
s = item_
print(f'ID: {s["id"]} Uses: ' + str(s['uses']) + " Used: " + str(s['used']))
nd = input("\nSelect ID: ")
for item in d:
s = item
nn = s['id']
if nd == nn:
print("\n----------------------------------------------------------------------------------------------------------------")
print("""
\tLNBITS LNURLW DECODED
ID: {}
LNURL: {}
Wait Time: {}
Uses: {}
Used: {}
Minimum Withdraw: {}
Maximum Withdraw: {}
""".format(s['id'], s['lnurl'], s['wait_time'], s['uses'], s['used'], s['min_withdrawable'], s['max_withdrawable']))
print("----------------------------------------------------------------------------------------------------------------\n")
input("Continue...")
clear()
blogo()
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
def lnbitsLNURLwList():
try:
while True:
a = loadFileConnLNBits(['admin_key'])
b = str(a['admin_key'])
headers = {"X-Api-Key": b}
sh = requests.get("https://legend.lnbits.com/withdraw/api/v1/links", headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
print("\n\tLNBITS LNURLW LIST\n")
for item_ in d:
s = item_
print(f'ID: {s["id"]} Uses: ' + str(s['uses']) + " Used: " + str(s['used']))
nd = input("\nSelect ID: ")
for item in d:
s = item
nn = s['id']
if nd == nn:
print("\n----------------------------------------------------------------------------------------------------------------")
print("""
\tLNBITS LNURLW DECODED
ID: {}
LNURL: {}
Wait Time: {}
Uses: {}
Used: {}
Minimum Withdraw: {}
Maximum Withdraw: {}
""".format(s['id'], s['lnurl'], s['wait_time'], s['uses'], s['used'], s['min_withdrawable'], s['max_withdrawable']))
print("----------------------------------------------------------------------------------------------------------------\n")
input("Continue...")
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt):
print("\n")
#-------------------------1d646820055e4e2da218e801eaacfc94----END LNBITS--------------------------------
#-----------------------------LNPAY--------------------------------
def loadFileConnLNPay(lnpayLoad):
lnpayLoad = {"key":""}
if os.path.isfile('lnpay.conf'): # Check if the file 'bclock.conf' is in the same folder
with open("lnpay.conf", "r") as f:
lnpayData = json.load(f) # Load the file 'bclock.conf'
lnpayLoad = lnpayData # Copy the variable pathv to 'path'
else:
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO LNPAY.CO.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mlnpaySN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
lnpayLoad["key"] = input("API Key: ")
print("\n\tWALLET ACCESS KEYS\n")
lnpayLoad["wallet_key_id"] = input("Wallet Admin: ")
with open("lnpay.conf", "w") as f:
json.dump(lnpayLoad, f)
clear()
blogo()
return lnpayLoad
def createFileConnLNPay():
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO LNPAY.CO.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mlnpaySN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
lnpayLoad["key"] = input("API Key: ")
print("\n\tWALLET ACCESS KEYS\n")
lnpayLoad["wallet_key_id"] = input("Wallet Admin: ")
with open("lnpay.conf", "w") as f:
json.dump(lnpayLoad, f)
#-----------------------------END LNPAY--------------------------------
#-----------------------------OPENNODE--------------------------------
def loadFileConnOpenNode(opennodeLoad):
opennodeLoad = {"key":"","wdr":"","inv":""}
if os.path.isfile('opennode.conf'): # Check if the file 'bclock.conf' is in the same folder
with open("opennode.conf", "r") as f:
opennodeData = json.load(f) # Load the file 'bclock.conf'
opennodeLoad = opennodeData # Copy the variable pathv to 'path'
else:
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO OPENNODE.COM.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mopennodeSN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
opennodeLoad["key"] = input("API Read Only Key: ")
opennodeLoad["wdr"] = input("API Withdrawall Key: ")
opennodeLoad["inv"] = input("API Invoices Key: ")
with open("opennode.conf", "w") as f:
json.dump(opennodeLoad, f)
clear()
blogo()
return opennodeLoad
def createFileConnOpenNode():
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO OPENNODE.COM.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mopennodeSN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
opennodeLoad = {'wdr': '', 'inv': '', 'key': input("API Read Only Key: ")}
opennodeLoad["wdr"] = input("API Withdrawall Key: ")
opennodeLoad["inv"] = input("API Invoices Key: ")
with open("opennode.conf", "w") as f:
json.dump(opennodeLoad, f)
def OpenNodelistfunds():
a = loadFileConnOpenNode(['wdr'])
b = str(a['wdr'])
headers = {"Content-Type": "application/json", "Authorization": b}
sh = requests.get("https://api.opennode.co/v1/account/balance", headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
r = d['data']
print("\n----------------------------------------------------------------------------------------------------")
p = r['balance']
print("""
OPENNODE BALANCE
Amount: {} sats
""".format(p['BTC']))
print("----------------------------------------------------------------------------------------------------\n")
input("Continue...")
def OpenNodeCheckStatus():
sh = requests.get("https://status.opennode.com/history.rss", timeout=10).text
clear()
blogo()
my_dict=xmltodict.parse(sh)
n=json.dumps(my_dict)
nn = str(n)
qq = json.loads(n)
a = qq['rss']
b = a['channel']
c = b['title']
d = b['item']
dd = d[0]
e = dd['title']
print("""
\n----------------------------------------------------------------------------------------------------
\n\t{}
{}\n
{}
\n----------------------------------------------------------------------------------------------------
""".format(c.upper(),e,b['pubDate']))
input("Enter to Continue...")
def OpenNodecreatecharge():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
a = loadFileConnOpenNode(['key'])
b = str(a['key'])
fiat = input("Are you going to pay in FIAT? Y/n:")
if fiat in ["Y", "y"]:
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tFIAT supported on OpenNode:
AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,
BYN,BZD,CAD,CDF,CHF,CLF,CLP,CNH,CNY,COP,CRC,CUC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,
FJD,FKP,GBP,GEL,GGP,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HRK,HTG,HUF,IDR,ILS,IMP,INR,IQD,IRR,ISK,
JEP,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,
MMK,MNT,MOP,MRO,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,
PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLL,SOS,SRD,SSP,STD,SVC,SYP,SZL,THB,TJS,
TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XAG,XAU,XCD,XDR,XOF,XPD,
XPF,XPT,YER,ZAR,ZMW,ZWL,USDC.
""")
print("\n----------------------------------------------------------------------------------------------------")
selection = input("Select a FIAT currency: ")
amt = input(f"Amount in {selection}: ")
headers = {"Authorization": b, "Content-Type": "application/json"}
payload = {"amount": amt, "currency": selection.upper()}
sh = requests.post("https://api.opennode.co/v1/charges", json=payload, headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
dd = d['data']
qq = dd['lightning_invoice']
pp = dd['address']
nn = qq['payreq']
mm = nn.lower()
while True:
try:
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tOPENNODE PAYMENT REQUEST
Amount: {} {}
ID: {}
Status: {}
Invoice: {}
Onchain Address: {}
Amount: {} sats
""".format(amt, selection.upper(), dd['id'], dd['status'], mm, pp, dd['amount']))
print("----------------------------------------------------------------------------------------------------\n")
pay = input("Invoice or Onchain Address? I/O: ")
if pay in ["I", "i"]:
node_not = input("Do you want to pay this invoice with your node? Y/n: ")
if node_not in ["Y", "y"]:
lndconnectload = {"ip_port":"", "tls":"", "macaroon":"", "ln":""}
with open("blndconnect.conf", "r") as f:
lndconnectData = json.load(f) # Load the file 'bclock.conf'
lndconnectload = lndconnectData # Copy the variable pathv to 'path'
if lndconnectload['ip_port']:
print("\nInvoice: " + mm + "\n")
payinvoice()
elif lndconnectload['ln']:
print("\nInvoice: " + mm + "\n")
localpayinvoice()
elif node_not in ["N", "n"]:
print("\033[1;30;47m")
qr.add_data(mm)
qr.print_ascii()
print("\033[0;37;40m")
qr.clear()
print("\nLightning Invoice: " + mm)
elif pay in ["O", "o"]:
print("\033[1;30;47m")
qr.add_data(pp)
qr.print_ascii()
print("\033[0;37;40m")
qr.clear()
print("\nAmount in sats: {} sats".format(dd['amount']))
print("\nOnchain Address: " + pp)
input("\nContinue...")
clear()
blogo()
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
elif fiat in ["N", "n"]:
amt = input("Amount in sats: ")
headers = {"Authorization": b, "Content-Type": "application/json"}
payload = {"amount": amt, "currency": "BTC"}
sh = requests.post("https://api.opennode.co/v1/charges", json=payload, headers=headers, timeout=10).text
clear()
blogo()
n = str(sh)
d = json.loads(n)
dd = d['data']
qq = dd['lightning_invoice']
nn = qq['payreq']
pp = dd['address']
mm = nn.lower()
while True:
try:
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tOPENNODE PAYMENT REQUEST
Amount: {} sats
ID: {}
Status: {}
Invoice: {}
Onchain Address: {}
Amount: {} sats
""".format(amt, dd['id'], dd['status'], mm, pp, dd['amount']))
print("----------------------------------------------------------------------------------------------------\n")
pay = input("Invoice or Onchain Address? I/O: ")
if pay in ["I", "i"]:
node_not = input("Do you want to pay this invoice with your node? Y/n: ")
if node_not in ["Y", "y"]:
with open("blndconnect.conf", "r") as f:
lndconnectData = json.load(f) # Load the file 'bclock.conf'
lndconnectload = {"ip_port":"", "tls":"", "macaroon":"", "ln":""}
lndconnectload = lndconnectData # Copy the variable pathv to 'path'
if lndconnectload['ip_port']:
print("\nInvoice: " + mm + "\n")
payinvoice()
elif lndconnectload['ln']:
print("\nInvoice: " + mm + "\n")
localpayinvoice()
elif node_not in ["N", "n"]:
print("\033[1;30;47m")
qr.add_data(mm)
qr.print_ascii()
print("\033[0;37;40m")
qr.clear()
print("\nLightning Invoice: " + mm)
elif pay in ["O", "o"]:
print("\033[1;30;47m")
qr.add_data(pp)
qr.print_ascii()
print("\033[0;37;40m")
qr.clear()
print("\nAmount in sats: {} sats".format(dd['amount']))
print("\nOnchain Address: " + pp)
input("\nContinue...")
clear()
blogo()
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
def OpenNodeiniciatewithdrawal():
a = loadFileConnOpenNode(['wdr'])
b = str(a['wdr'])
c = loadFileConnOpenNode(['key'])
d = str(a['key'])
lnchain = input("Are you going to pay with Lightning or Onchain? L/O: ")
clear()
blogo()
if lnchain in ["L", "l"]:
try:
while True:
invoice = input("\nInvoice: ")
headers = {"Authorization": b, "Content-Type": "application/json"}
payload = {"pay_req": invoice}
ssh = requests.post("https://api.opennode.co/v1/charge/decode", json=payload, headers=headers, timeout=10).text
nn = str(ssh)
dd = json.loads(nn)
print(dd)
if invoice != "":
break
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tOPENNODE TRANSFER REQUEST
Message: {}
""".format(dd['message']))
print("----------------------------------------------------------------------------------------------------\n")
rr = dd['data']
ss = rr['pay_req']
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tOPENNODE TRANSFER REQUEST
Network: {}
Amount: {} sats
Destination: {}
Hash: {}
""".format(ss['network'],ss['amount'],ss['pub_key'],ss['hash']))
print("----------------------------------------------------------------------------------------------------\n")
print("<<< Cancel Control + C")
input("\nEnter to Continue... ")
headers = {"Authorization": b, "Content-Type": "application/json"}
payload = {"type": "ln", "address": invoice, "callback_url": ""}
sh = requests.post("https://api.opennode.co/v2/withdrawals", json=payload, headers=headers, timeout=10).text
n = str(sh)
d = json.loads(n)
clear()
blogo()
tick()
t.sleep(2)
except (requests.RequestException, json.JSONDecodeError, KeyError) as e:
logger.debug("OpenNodeiniciatewithdrawal LN error: %s", e)
elif lnchain in ["O", "o"]:
try:
while True:
print("\n\tOPENNODE TRANSFER REQUEST\n")
print("\n\tMinimum amount 200000 sats\n")
address = input("\nBitcoin Address: ")
amt = int(input("Amount in sats: "))
headers = {"Authorization": b, "Content-Type": "application/json"}
payload = {"type": "chain", "amount": amt, "address": address, "callback_url": ""}
if amt < 199999:
sh = requests.post("https://api.opennode.co/v2/withdrawals", json=payload, headers=headers, timeout=10).text
n = str(sh)
d = json.loads(n)
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tOPENNODE TRANSFER REQUEST
Message: {}
""".format(d['message']))
print("----------------------------------------------------------------------------------------------------\n")
elif amt > 200000:
sh = requests.post("https://api.opennode.co/v2/withdrawals", json=payload, headers=headers, timeout=10).text
n = str(sh)
d = json.loads(n)
dd = d['data']
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tOPENNODE TRANSFER REQUEST
Amount: {} sats
Address Destination: {}
Fee: {}
Status: {}
""".format(dd['amount'],dd['address'],dd['fee'], dd['status']))
print("----------------------------------------------------------------------------------------------------\n")
input("\nContinue... ")
clear()
blogo()
logoB()
t.sleep(2)
break
except (requests.RequestException, json.JSONDecodeError, KeyError, ValueError) as e:
logger.debug("OpenNodeiniciatewithdrawal onchain error: %s", e)
def OpenNodeListPayments():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
a = loadFileConnOpenNode(['wdr'])
b = str(a['wdr'])
headers = {"Content-Type": "application/json", "Authorization": b}
sh = requests.get("https://api.opennode.co/v1/withdrawals", headers=headers, timeout=10).text
clear()
blogo()
print("\n\tOPENNODE TRANSACTIONS LIST\n")
n = str(sh)
d = json.loads(n)
da = d['data']
while True:
try:
for item_ in da:
s = item_
n = s['status']
q = str(n)
print(f'ID: {s["id"]} {q}')
nd = input("\nSelect ID: ")
for item in da:
s = item
nn = s['id']
if nd == nn:
print("\n----------------------------------------------------------------------------------------------------")
print("""
\tOPENNODE TRANSACTION DECODED
ID: {}
Amount: {} sats
Type: {}
Invoice or Tx ID: {}
Status: {}
""".format(s['id'], s['amount'], s['type'], s['reference'], s['status']))
print("----------------------------------------------------------------------------------------------------\n")
print("\033[1;30;47m")
qr.add_data(s['reference'])
qr.print_ascii()
print("\033[0;37;40m")
qr.clear()
input("Continue...")
clear()
blogo()
print("\n\tOPENNODE TRANSACTIONS LIST\n")
except (json.JSONDecodeError, KeyError, KeyboardInterrupt):
break
#-----------------------------END OPENNODE--------------------------------
#-----------------------------TIPPINME--------------------------------
def loadFileTippinMe(tippinmeLoad):
tippinmeLoad = {"key":""}
if os.path.isfile('tippinme.conf'): # Check if the file 'bclock.conf' is in the same folder
with open("tippinme.conf", "r") as f:
tippinmeData = json.load(f) # Load the file 'bclock.conf'
tippinmeLoad = tippinmeData # Copy the variable pathv to 'path'
else:
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOUR CONFIGURATION INFORMATION WILL BE SAVE IN '\033[1;33;40mtippinme.conf\033[0;37;40m'
IF YOU NEED TO START AGAIN, DELETE IT.\n
""")
tippinmeLoad["key"] = input("Twitter @user: ")
with open("tippinme.conf", "w") as f:
json.dump(tippinmeLoad, f)
clear()
blogo()
return tippinmeLoad
def createFileTippinMe():
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOUR CONFIGURATION INFORMATION WILL BE SAVE IN '\033[1;33;40mtippinme.conf\033[0;37;40m'
IF YOU NEED TO START AGAIN, DELETE IT.\n
""")
tippinmeLoad = {'key': input("Twitter @user: ")}
with open("tippinme.conf", "w") as f:
json.dump(tippinmeLoad, f)
def tippinmeGetInvoice():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
a = loadFileTippinMe(['key'])
b = str(a['key'])
try:
print("\n\tTIPPINME GENERATE INVOICE\n")
q = input("Amount in Sats: ")
clear()
blogo()
url = f'https://api.tippin.me/v1/public/addinvoice/{b}/{q}'
response = requests.get(url, timeout=10)
responseB = str(response.text)
responseC = responseB
lnreq = responseC.split(',')
lnurl = lnreq[1]
lnurlS = str(lnurl)
lnurlR = lnurlS.split(':')
lnurlW = lnurlR[1]
ln = str(lnurlW)
ln1 = ln.strip('"')
node_not = input("Do you want to pay this invoice with your node? Y/n: ")
if node_not in ["Y", "y"]:
lndconnectload = {"ip_port":"", "tls":"", "macaroon":"", "ln":""}
with open("blndconnect.conf", "r") as f:
lndconnectData = json.load(f) # Load the file 'bclock.conf'
lndconnectload = lndconnectData # Copy the variable pathv to 'path'
if lndconnectload['ip_port']:
print("\nInvoice: " + ln1 + "\n")
payinvoice()
elif lndconnectload['ln']:
print("\nInvoice: " + ln1 + "\n")
localpayinvoice()
elif node_not in ["N", "n"]:
print("\033[1;30;47m")
qr.add_data(ln1)
qr.print_ascii()
print("\033[0;37;40m")
print(f'LND Invoice: {ln1}')
response.close()
input("Continue...")
except (requests.RequestException, json.JSONDecodeError, KeyError, IndexError, OSError) as e:
logger.debug("tippinmeGetInvoice error: %s", e)
#-----------------------------END TIPPINME--------------------------------
#-----------------------------TALLYCOIN------------------------------
def loadFileConnTallyCo(tallycoLoad):
tallycoLoad = {"tallyco.conf":"","id":""}
if os.path.isfile('tallyco.conf'): # Check if the file 'bclock.conf' is in the same folder
with open("tallyco.conf", "r") as f:
tallyData = json.load(f) # Load the file 'bclock.conf'
tallycoLoad = tallyData # Copy the variable pathv to 'path'
else:
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO TALLYCO.IN.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mtallycoSN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
print("\nEXAMPLE: https://tallyco.in/s/{fundraiser_id}/\n")
tallycoLoad["id"] = input("User ID or Twitter @USER: ")
with open("tallyco.conf", "w") as f:
json.dump(tallycoLoad, f)
clear()
blogo()
return tallycoLoad
def createFileConnTallyCo():
clear()
blogo()
print("""\n\t \033[1;33;40mATENTION\033[0;37;40m: YOU ARE GOING TO CREATE A FILE WITH YOUR INFORMATION OF CONNECTION TO TALLYCO.IN.
WE WILL NEED SOME INFORMATION FROM YOUR ACCOUNT THAT THE ONLY ONE THAT WILL HAVE ACCESS IS YOU.
IF YOU DELETE THIS FILE YOU WILL NEED TO PAY AGAIN TO GET ACCESS FROM PyBLOCK.
SAVE THE FILE '\033[1;33;40mtallycoSN.conf\033[0;37;40m' IN A SAFE PLACE.\n
""")
print("\nEXAMPLE: https://tallyco.in/s/{fundraiser_id}/\n")
tallycoLoad = {'fundraiser_id': '', 'id': input("User ID or Twitter @USER: ")}
with open("tallyco.conf", "w") as f:
json.dump(tallycoLoad, f)
def tallycoGetPayment():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
c = loadFileConnTallyCo(['id'])
d = str(c['id'])
try:
amount = input("Amount in Sats: ")
print("""\nPayment Method Example: 'ln' or 'btc'
'ln' = Lightnin Netowrk
'btc'= Bitcoin Onchain Payment
\n""")
lnd_onchain = input("Payment Method: ")
payload = {"type": "profile", "id": d, "satoshi_amount": amount, "payment_method": lnd_onchain}
tallycomethod = requests.post("https://api.tallyco.in/v1/payment/request/", data=payload, timeout=10).text
n = str(tallycomethod)
d = json.loads(n)
clear()
blogo()
if lnd_onchain == "ln":
e = d['lightning_pay_request']
f = e.lower()
print("\033[1;30;47m")
qr.add_data(f)
qr.print_ascii()
print("\033[0;37;40m")
print(f'LND Invoice: {f}')
qr.clear()
input("\nContinue...")
elif lnd_onchain == "btc":
e = d['btc_address']
print("\033[1;30;47m")
qr.add_data(e)
qr.print_ascii()
print("\033[0;37;40m")
print(f'Amount: {d["cost"]}')
print(f'Bitcoin Address: {e}')
qr.clear()
input("\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError) as e:
logger.debug("tallycoGetPayment error: %s", e)
def tallycoDonateid():
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
clear()
blogo()
try:
donate = input("Donate to ID: ")
amount = input("Amount in Sats: ")
print("""\nPayment Method Example: 'ln' or 'btc'
'ln' = Lightnin Netowrk
'btc'= Bitcoin Onchain Payment
\n""")
lnd_onchain = input("Payment Method: ")
payload = {"type": "profile", "id": donate, "satoshi_amount": amount, "payment_method": lnd_onchain}
tallycomethod = requests.post("https://api.tallyco.in/v1/payment/request/", data=payload, timeout=10).text
n = str(tallycomethod)
d = json.loads(n)
clear()
blogo()
if lnd_onchain in ["ln", "lN", "Ln", "LN"]:
node_not = input("Do you want to pay this tip with your node? Y/n: ")
if node_not in ["Y", "y"]:
lndconnectload = {"ip_port":"", "tls":"", "macaroon":"", "ln":""}
with open("blndconnect.conf", "r") as f:
lndconnectData = json.load(f) # Load the file 'bclock.conf'
lndconnectload = lndconnectData # Copy the variable pathv to 'path'
if lndconnectload['ip_port']:
e = d['lightning_pay_request']
f = e.lower()
print("\nInvoice: " + f + "\n")
payinvoice()
elif lndconnectload['ln']:
e = d['lightning_pay_request']
f = e.lower()
print("\nInvoice: " + f + "\n")
localpayinvoice()
elif node_not in ["N", "n"]:
e = d['lightning_pay_request']
f = e.lower()
print("\033[1;30;47m")
qr.add_data(f)
qr.print_ascii()
print("\033[0;37;40m")
print(f'LND Invoice: {f}')
qr.clear()
input("\nContinue...")
elif lnd_onchain in ["btc", "bTC", "BtC", "BTC", "BTc", "btC"]:
e = d['btc_address']
print("\033[1;30;47m")
qr.add_data(e)
qr.print_ascii()
print("\033[0;37;40m")
print(f'Amount: {d["cost"]}')
print(f'Bitcoin Address: {e}')
qr.clear()
input("\nContinue...")
except (requests.RequestException, json.JSONDecodeError, KeyError, OSError) as e:
logger.debug("tallycoDonateid error: %s", e)
#-----------------------------END TALLYCOIN------------------------------
#-----------------------------MEMPOOL.SPACE------------------------------
def fee():
try:
while True:
r = requests.get('https://mempool.space/api/v1/fees/recommended', timeout=10)
r.headers['Content-Type']
n = r.text
di = json.loads(n)
clear()
blogo()
print("""
------------------------
Fastest Fee: {}
Half Hour Fee: {}
Hour Fee: {}
------------------------
<<< Back Control + C
""".format(di['fastestFee'], di['halfHourFee'], di['hourFee']))
t.sleep(5)
print("\n\t Getting New Information")
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt) as e:
logger.debug("fee error: %s", e)
def blocks():
try:
while True:
clear()
blogo()
print("\n\t Getting New Information")
r = requests.get('https://mempool.space/api/v1/fees/mempool-blocks', timeout=10)
r.headers['Content-Type']
n = r.text
di = json.loads(n)
for n in range(len(di)):
q = di[n]
clear()
blogo()
print("""
-----------------------------------------
BLOCK
-----------------------------------------
Block Size: {} bytes
Block VSize: {} bytes
Transactions: {}
Total Fees: {}
Median Fee: {}
-----------------------------------------
<<< Back Control + C
""".format(q['blockSize'], q['blockVSize'], q['nTx'], q['totalFees'], q['medianFee']))
t.sleep(3)
except (requests.RequestException, json.JSONDecodeError, KeyError, KeyboardInterrupt) as e:
logger.debug("blocks error: %s", e)
#-----------------------------END MEMPOOL.SPACE------------------------------