diff --git a/balance.py b/balance.py new file mode 100755 index 0000000..00af493 --- /dev/null +++ b/balance.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +import sys, argparse, os +from os.path import join, dirname +from shutil import copyfile +from dotenv import load_dotenv +from libs.balancelib import Balance + +# Get variables environment +if not os.path.isfile('.env'): + copyfile(".env.template", ".env") +dotenv_path = join(dirname(__file__), '.env') +load_dotenv(dotenv_path) + +dunikey = os.getenv('DUNIKEY') +node = os.getenv('NODE') +if not node: + sys.stderr.write("Please fill a Duniter node in .env file\n") + sys.exit(1) + +# Parse arguments +parser = argparse.ArgumentParser() +parser.add_argument('-p', '--pubkey', help="Clé publique du compte visé") +parser.add_argument('--mempool', action='store_true', help="Utilise les sources en Mempool") +args = parser.parse_args() + +# Create transaction and send it +balance = Balance(dunikey, node, args.pubkey, args.mempool) +result = balance.balance() diff --git a/libs/balancelib.py b/libs/balancelib.py new file mode 100644 index 0000000..5299b3a --- /dev/null +++ b/libs/balancelib.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 + +import sys, re, os.path, json, ast +from termcolor import colored +from natools import fmt, sign, get_privkey +from gql import gql, Client +from gql.transport.aiohttp import AIOHTTPTransport + +PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}" + +class Balance: + + def __init__(self, dunikey, node, pubkey, useMempool=False): + self.dunikey = dunikey + self.pubkey = pubkey if pubkey else get_privkey(dunikey, "pubsec").pubkey + self.useMempool = useMempool + if not re.match(PUBKEY_REGEX, self.pubkey) or len(self.pubkey) > 45: + sys.stderr.write("La clé publique n'est pas au bon format.\n") + sys.exit(1) + + # Define Duniter GVA node + transport = AIOHTTPTransport(url=node) + self.client = Client(transport=transport, fetch_schema_from_transport=True) + + def sendDoc(self): + # Build TX generation document + queryBuild = gql( + """ + query ($pubkey: String!){ + transactionsHistory(pubkey: $pubkey) { + received { + outputs + } + sent { + outputs + } + } + } + """ + ) + paramsBuild = { + "pubkey": self.pubkey + } + + # Send TX document + try: + self.historyDoc = self.client.execute(queryBuild, variable_values=paramsBuild) + except Exception as e: + message = ast.literal_eval(str(e))["message"] + sys.stderr.write("Echec de récupération de l'historique:\n" + message + "\n") + sys.exit(1) + + res = self.historyDoc['transactionsHistory']['received'] + amount=[] + for i in res: + for output in i['outputs']: + if re.search(self.pubkey, output): + amount.append(int(output.split(':')[0])) + receivedTotal = sum(amount) + + res = self.historyDoc['transactionsHistory']['sent'] + amount=[] + for i in res: + for output in i['outputs']: + if not re.search(self.pubkey, output): + amount.append(int(output.split(':')[0])) + sentTotal = sum(amount) + + + # TODO: Get all UD from pubkey + + + total = (receivedTotal-sentTotal)/100 + print(total) + + def balance(self): + self.sendDoc() +