Skip to content
Snippets Groups Projects
Commit 7f3812b6 authored by Moul's avatar Moul
Browse files

[feat] #175: balance: migrate to GVA

One request
Generate one table
parent 9ec6f3fd
No related branches found
No related tags found
No related merge requests found
Pipeline #12732 passed
......@@ -13,12 +13,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with Silkaj. If not, see <https://www.gnu.org/licenses/>.
import sys
from click import argument, command, echo, pass_context
from duniterpy.api.bma import blockchain, tx
from duniterpy.documents.transaction import InputSource
from tabulate import tabulate
from silkaj import wot_tools as wt
from silkaj import constants
from silkaj.auth import auth_method, has_auth_method
from silkaj.blockchain_tools import HeadBlock
from silkaj.crypto_tools import (
......@@ -26,8 +28,8 @@ from silkaj.crypto_tools import (
is_pubkey_and_check,
validate_checksum,
)
from silkaj.network_tools import ClientInstance
from silkaj.tools import CurrencySymbol, coroutine, message_exit
from silkaj.network_tools import ClientInstance, gva_query
from silkaj.tools import coroutine, message_exit
from silkaj.tui import display_amount, display_pubkey_and_checksum
......@@ -36,9 +38,19 @@ from silkaj.tui import display_amount, display_pubkey_and_checksum
@pass_context
@coroutine
async def cmd_amount(ctx, pubkeys):
client = ClientInstance().client
if not has_auth_method():
def gen_query(pubkeys_list):
pubkeys_str = " ".join(f'"{pubkey}"' for pubkey in pubkeys_list)
return f'query {{\
balances(scripts: [{pubkeys_str}]){{amount}}\
currentBlock{{monetaryMass membersCount}}\
currentUd{{amount}}\
idty(pubkey: "{pubkeys_list[0]}"){{username}}\
node {{peer {{currency}} }}\
}}'
if has_auth_method():
pubkeys_list = auth_method().pubkey
else:
# check input pubkeys
if not pubkeys:
message_exit("You should specify one or many pubkeys")
......@@ -57,69 +69,65 @@ async def cmd_amount(ctx, pubkeys):
if wrong_pubkeys:
message_exit("Please check the pubkeys format.")
total = [0, 0]
for pubkey in pubkeys_list:
inputs_balance = await get_amount_from_pubkey(pubkey)
await show_amount_from_pubkey(pubkey, inputs_balance)
total[0] += inputs_balance[0]
total[1] += inputs_balance[1]
if len(pubkeys_list) > 1:
await show_amount_from_pubkey("Total", total)
else:
key = auth_method()
pubkey = key.pubkey
await show_amount_from_pubkey(pubkey, await get_amount_from_pubkey(pubkey))
await client.close()
async def show_amount_from_pubkey(label, inputs_balance):
response = await gva_query(gen_query(pubkeys_list))
if not response:
pubkey_checksum = display_pubkey_and_checksum(pubkeys_list)
sys.exit(f"{pubkey_checksum} public key without money activity.")
currency = response["node"]["peer"]["currency"]
if currency == "g1":
currency_symbol = constants.G1_SYMBOL
elif currency == "g1-test":
currency_symbol = constants.GTEST_SYMBOL
current_block = response["currentBlock"]
average = current_block["monetaryMass"] / current_block["membersCount"]
current_ud = response["currentUd"]["amount"]
uid = response["idty"]["username"] if response["idty"] else None
table = []
balances_sum = {"amount": 0}
for pubkey, balance in zip(pubkeys_list, response["balances"]):
gen_table(table, pubkey, balance, current_ud, average, currency_symbol, uid)
if balance:
balances_sum["amount"] += balance["amount"]
if len(pubkeys_list) > 1:
gen_table(table, "Total", balances_sum, current_ud, average, currency_symbol)
echo(tabulate(table, tablefmt="fancy_grid"))
def gen_table(table, label, balance, current_ud, average, currency_symbol, uid=None):
"""
Shows the balance of a pubkey.
`label` can be either a pubkey or "Total".
if `pubkey` is a pubkey, get pubkey:checksum
"""
totalAmountInput = inputs_balance[0]
balance = inputs_balance[1]
currency_symbol = await CurrencySymbol().symbol
ud_value = await UDValue().ud_value
average, monetary_mass = await get_average()
member = False
# if `pubkey` is a pubkey, get pubkey:checksum and uid
if label != "Total":
member = await wt.is_member(label)
label = display_pubkey_and_checksum(label)
# display balance table
display = list()
display.append(["Balance of pubkey", label])
if member:
display.append(["User identifier", member["uid"]])
if totalAmountInput - balance != 0:
display_amount(display, "Blockchain", balance, ud_value, currency_symbol)
table.append(["Balance of pubkey", label])
if uid:
table.append(["User identifier", uid])
if balance:
"""
TODO: handle pendings?
if totalAmountInput - balance != 0:
display_amount(table, "Blockchain balance", balance, current_ud, currency_symbol)
display_amount(
table,
"Pendings balance",
totalAmountInput - balance,
current_ud,
currency_symbol,
)
"""
display_amount(
display,
"Pending transaction",
(totalAmountInput - balance),
ud_value,
currency_symbol,
table, "Total balance", balance["amount"], current_ud, currency_symbol
)
display_amount(display, "Total amount", totalAmountInput, ud_value, currency_symbol)
display.append(
[
"Total relative to M/N",
"{0} x M/N".format(round(totalAmountInput / average, 2)),
]
)
echo(tabulate(display, tablefmt="fancy_grid"))
async def get_average():
head = await HeadBlock().head_block
monetary_mass = head["monetaryMass"]
members_count = head["membersCount"]
average = monetary_mass / members_count
return average, monetary_mass
relative = round(balance["amount"] / average, 2)
line = ["Total relative to M/N", f"{relative} × M/N"]
table.append(line)
else:
table.append(["Public key", "Without money activity"])
async def get_amount_from_pubkey(pubkey):
......
......@@ -50,9 +50,9 @@ def test_balance():
silkaj + ["--gtest", "balance", "3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj"]
).decode()
assert (
"│ Balance of pubkey │ 3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj:EyF │"
"│ Balance of pubkey │ 3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj:EyF │"
in output
)
assert "│ Total amount (unit|relative) │" in output
assert "│ Total balance (unit|relative) │" in output
assert "UD ĞTest" in output
assert "Total relative to M/N" in output
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment