__init__.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env python3
  2. #
  3. # MMGen Wallet, a terminal-based cryptocurrency wallet
  4. # Copyright (C)2013-2026 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.util 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. return make_chksum_N(res, rounds=1, nchars=self.chksum_nchars, upper=False)
  24. @property
  25. def base_chksum(self):
  26. return self.make_chksum(keys=self.base_chksum_fields)
  27. @property
  28. def full_chksum(self):
  29. return self.make_chksum(keys=self.full_chksum_fields) if self.full_chksum_fields else None
  30. def check_checksums(self, d_wrap):
  31. for k in ('base_chksum', 'full_chksum'):
  32. a = getattr(self, k)
  33. if a is not None:
  34. b = d_wrap[k]
  35. assert a == b, f'{k} mismatch: {a} != {b}'
  36. def make_wrapped_data(self, in_data):
  37. out = {
  38. 'base_chksum': self.base_chksum,
  39. 'full_chksum': self.full_chksum,
  40. 'data': in_data,
  41. } if self.full_chksum else {
  42. 'base_chksum': self.base_chksum,
  43. 'data': in_data}
  44. return json.dumps(
  45. {self.data_label: out},
  46. cls = json_encoder,
  47. indent = 2)
  48. def extract_data_from_file(self, cfg, fn):
  49. return json.loads(
  50. get_data_from_file(cfg, str(fn), desc=self.desc, silent=self.silent_load)
  51. )[self.data_label]