json.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
  4. # Copyright (C)2013-2022 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
  9. # https://gitlab.com/mmgen/mmgen
  10. """
  11. proto.btc.tw.json: export and import tracking wallet to JSON format
  12. """
  13. from collections import namedtuple
  14. from ....tw.json import TwJSON
  15. from ....tw.shared import TwMMGenID
  16. class BitcoinTwJSON(TwJSON):
  17. class Base(TwJSON.Base):
  18. @property
  19. def mappings_json(self):
  20. return self.json_dump([(e.mmgen_id,e.address) for e in self.entries])
  21. @property
  22. def num_entries(self):
  23. return len(self.entries)
  24. class Import(TwJSON.Import,Base):
  25. info_msg = """
  26. This utility will create a new tracking wallet, import the addresses from
  27. the JSON dump into it and update their balances. The operation may take a
  28. few minutes.
  29. """
  30. @property
  31. async def tracking_wallet_exists(self):
  32. return await self.twctl.rpc.check_or_create_daemon_wallet(wallet_create=False)
  33. async def create_tracking_wallet(self):
  34. return await self.twctl.rpc.check_or_create_daemon_wallet(wallet_create=True)
  35. async def get_entries(self):
  36. entries_in = [self.entry_tuple_in(*e) for e in self.data['data']['entries']]
  37. return sorted(
  38. [self.entry_tuple(
  39. TwMMGenID(self.proto,d.mmgen_id),
  40. d.address,
  41. getattr(d,'amount',None),
  42. d.comment)
  43. for d in entries_in],
  44. key = lambda x: x.mmgen_id.sort_key )
  45. async def do_import(self,batch):
  46. import_tuple = namedtuple('import_data',['addr','twmmid','comment'])
  47. await self.twctl.import_address_common(
  48. [import_tuple(e.address, e.mmgen_id, e.comment) for e in self.entries],
  49. batch = batch )
  50. return [e.address for e in self.entries]
  51. class Export(TwJSON.Export,Base):
  52. @property
  53. async def addrlist(self):
  54. if not hasattr(self,'_addrlist'):
  55. from .addresses import TwAddresses
  56. self._addrlist = await TwAddresses(self.proto,get_data=True)
  57. return self._addrlist
  58. async def get_entries(self): # TODO: include 'received' field
  59. return sorted(
  60. [self.entry_tuple(d.twmmid, d.addr, d.amt, d.comment)
  61. for d in (await self.addrlist).data],
  62. key = lambda x: x.mmgen_id.sort_key )
  63. @property
  64. async def entries_out(self):
  65. return [[getattr(d,k) for k in self.keys] for d in self.entries]
  66. @property
  67. async def total(self):
  68. return (await self.addrlist).total