addresses.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
  4. # Copyright (C)2013-2024 The MMGen Project <mmgen@tuta.io>
  5. # Licensed under the GNU General Public License, Version 3:
  6. # https://www.gnu.org/licenses
  7. # Public project repositories:
  8. # https://github.com/mmgen/mmgen-wallet
  9. # https://gitlab.com/mmgen/mmgen-wallet
  10. """
  11. proto.btc.tw.addresses: Bitcoin base protocol tracking wallet address list class
  12. """
  13. from ....tw.addresses import TwAddresses
  14. from ....tw.shared import TwLabel
  15. from ....util import msg,msg_r
  16. from ....obj import get_obj
  17. from .rpc import BitcoinTwRPC
  18. class BitcoinTwAddresses(TwAddresses,BitcoinTwRPC):
  19. has_age = True
  20. prompt_fs = """
  21. Sort options: [a]mt, [A]ge, [M]mgen addr, [r]everse
  22. Column options: toggle [D]ays/date/confs/block
  23. Filters: show [E]mpty addrs, [u]sed addrs, all [L]abels
  24. View/Print: pager [v]iew, [w]ide pager view, [p]rint{s}
  25. Actions: [q]uit menu, r[e]draw, add [l]abel:
  26. """
  27. key_mappings = {
  28. 'a':'s_amt',
  29. 'A':'s_age',
  30. 'M':'s_twmmid',
  31. 'r':'s_reverse',
  32. 'D':'d_days',
  33. 'e':'d_redraw',
  34. 'E':'d_showempty',
  35. 'u':'d_showused',
  36. 'L':'d_all_labels',
  37. 'v':'a_view',
  38. 'w':'a_view_detail',
  39. 'p':'a_print_detail',
  40. 'l':'i_comment_add' }
  41. async def get_rpc_data(self):
  42. msg_r('Getting unspent outputs...')
  43. addrs = await self.get_unspent_by_mmid(self.minconf)
  44. msg('done')
  45. amt0 = self.proto.coin_amt('0')
  46. self.total = sum((v['amt'] for v in addrs.values()), start=amt0)
  47. msg_r('Getting labels and associated addresses...')
  48. pairs = await self.get_addr_label_pairs()
  49. if pairs:
  50. for label,addr in pairs:
  51. if label and label.mmid not in addrs:
  52. addrs[label.mmid] = {
  53. 'addr': addr,
  54. 'amt': amt0,
  55. 'recvd': amt0,
  56. 'confs': 0,
  57. 'lbl': label }
  58. msg('done')
  59. else:
  60. msg('[none]')
  61. msg_r('Getting received funds data...')
  62. # args: 1:minconf, 2:include_empty, 3:include_watchonly, 4:include_immature_coinbase (>=v23.0.0)
  63. for d in await self.rpc.call( 'listreceivedbylabel', 1, True, True ):
  64. label = get_obj( TwLabel, proto=self.proto, text=d['label'] )
  65. if label:
  66. assert label.mmid in addrs, f'{label.mmid!r} not found in addrlist!'
  67. addrs[label.mmid]['recvd'] = d['amount']
  68. addrs[label.mmid]['confs'] = d['confirmations']
  69. msg('done')
  70. return addrs