78 lines
2.3 KiB
Python
Executable file
78 lines
2.3 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#
|
|
# MMGen Wallet, a terminal-based cryptocurrency wallet
|
|
# Copyright (C)2013-2025 The MMGen Project <mmgen@tuta.io>
|
|
# Licensed under the GNU General Public License, Version 3:
|
|
# https://www.gnu.org/licenses
|
|
# Public project repositories:
|
|
# https://github.com/mmgen/mmgen-wallet
|
|
# https://gitlab.com/mmgen/mmgen-wallet
|
|
|
|
"""
|
|
proto.btc.tw.bal: Bitcoin base protocol tracking wallet balance class
|
|
"""
|
|
|
|
from ....tw.bal import TwGetBalance
|
|
from ....tw.shared import get_tw_label
|
|
from ....rpc import rpc_init
|
|
|
|
class BitcoinTwGetBalance(TwGetBalance):
|
|
|
|
async def __init__(self, cfg, proto, minconf, quiet):
|
|
self.rpc = await rpc_init(cfg, proto)
|
|
self.walletinfo = await self.rpc.walletinfo
|
|
await super().__init__(cfg, proto, minconf, quiet)
|
|
|
|
start_labels = ('TOTAL', 'Non-MMGen', 'Non-wallet')
|
|
conf_cols = {
|
|
'unconfirmed': 'Unconfirmed',
|
|
'lt_minconf': '<{minconf} confs',
|
|
'ge_minconf': '>={minconf} confs',
|
|
}
|
|
|
|
async def create_data(self):
|
|
lbl_id = ('account', 'label')['label_api' in self.rpc.caps]
|
|
for d in await self.rpc.call('listunspent', 0):
|
|
tw_lbl = get_tw_label(self.proto, d[lbl_id])
|
|
if tw_lbl:
|
|
if tw_lbl.mmid.type == 'mmgen':
|
|
label = tw_lbl.mmid.obj.sid
|
|
if label not in self.data:
|
|
self.data[label] = self.balance_info()
|
|
else:
|
|
label = 'Non-MMGen'
|
|
else:
|
|
label = 'Non-wallet'
|
|
|
|
amt = self.proto.coin_amt(d['amount'])
|
|
|
|
if not d['confirmations']:
|
|
self.data['TOTAL']['unconfirmed'] += amt
|
|
self.data[label]['unconfirmed'] += amt
|
|
|
|
col_key = ('lt_minconf', 'ge_minconf')[d['confirmations'] >= self.minconf]
|
|
self.data['TOTAL'][col_key] += amt
|
|
self.data[label][col_key] += amt
|
|
|
|
if d['spendable']: # TODO: use 'solvable' for descriptor wallets?
|
|
self.data[label]['spendable'] += amt
|
|
|
|
def format(self, color):
|
|
|
|
def gen_spendable_warning():
|
|
if check_spendable:
|
|
for k, v in self.data.items():
|
|
if v['spendable']:
|
|
yield red(f'Warning: this wallet contains PRIVATE KEYS for {k} outputs!')
|
|
|
|
if color:
|
|
from ....color import red
|
|
else:
|
|
from ....color import nocolor as red
|
|
|
|
desc_wallet = self.walletinfo.get('descriptors')
|
|
check_spendable = not desc_wallet or (desc_wallet and self.walletinfo['private_keys_enabled'])
|
|
|
|
warning = '\n'.join(gen_spendable_warning())
|
|
|
|
return super().format(color) + ('\n' if warning else '') + warning
|