__init__.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env python3
  2. #
  3. # MMGen Wallet, a terminal-based cryptocurrency wallet
  4. # Copyright (C)2013-2025 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. xmrwallet.file: Monero file base class for the MMGen Suite
  12. """
  13. import json
  14. from ...util import make_chksum_N
  15. from ...fileutil import get_data_from_file
  16. from ...rpc import json_encoder
  17. class MoneroMMGenFile:
  18. silent_load = False
  19. def make_chksum(self, keys=None):
  20. res = json.dumps(
  21. dict((k, v) for k, v in self.data._asdict().items() if (not keys or k in keys)),
  22. cls = json_encoder
  23. )
  24. return make_chksum_N(res, rounds=1, nchars=self.chksum_nchars, upper=False)
  25. @property
  26. def base_chksum(self):
  27. return self.make_chksum(self.base_chksum_fields)
  28. @property
  29. def full_chksum(self):
  30. return self.make_chksum(self.full_chksum_fields) if self.full_chksum_fields else None
  31. def check_checksums(self, d_wrap):
  32. for k in ('base_chksum', 'full_chksum'):
  33. a = getattr(self, k)
  34. if a is not None:
  35. b = d_wrap[k]
  36. assert a == b, f'{k} mismatch: {a} != {b}'
  37. def make_wrapped_data(self, in_data):
  38. out = {
  39. 'base_chksum': self.base_chksum,
  40. 'full_chksum': self.full_chksum,
  41. 'data': in_data,
  42. } if self.full_chksum else {
  43. 'base_chksum': self.base_chksum,
  44. 'data': in_data,
  45. }
  46. return json.dumps(
  47. { self.data_label: out },
  48. cls = json_encoder,
  49. indent = 2,
  50. )
  51. def extract_data_from_file(self, cfg, fn):
  52. return json.loads(
  53. get_data_from_file(cfg, str(fn), self.desc, silent=self.silent_load)
  54. )[self.data_label]