spec.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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.ops.spec: Monero wallet ops for the MMGen Suite
  12. """
  13. import re
  14. from ...util import die
  15. from ...addr import CoinAddr
  16. from .. import uarg_info
  17. class OpMixinSpec:
  18. def create_addr_data(self):
  19. m = re.fullmatch(uarg_info[self.spec_id].pat, self.uargs.spec, re.ASCII)
  20. if not m:
  21. fs = "{!r}: invalid {!r} arg: for {} operation, it must have format {!r}"
  22. die(1, fs.format(self.uargs.spec, self.spec_id, self.name, uarg_info[self.spec_id].annot))
  23. def gen():
  24. for i, k in self.spec_key:
  25. if m[i] is None:
  26. setattr(self, k, None)
  27. else:
  28. idx = int(m[i])
  29. try:
  30. res = self.kal.entry(idx)
  31. except:
  32. die(1,
  33. 'Supplied key-address file does not contain address '
  34. f'{self.kal.al_id.sid}:{idx}')
  35. else:
  36. setattr(self, k, res)
  37. yield res
  38. self.addr_data = list(gen())
  39. self.account = None if m[2] is None else int(m[2])
  40. def strip_quotes(s):
  41. if s and s[0] in ("'", '"'):
  42. if s[-1] != s[0] or len(s) < 2:
  43. die(1, f'{s!r}: unbalanced quotes in label string!')
  44. return s[1:-1]
  45. else:
  46. return s # None or empty string
  47. match self.name:
  48. case 'sweep' | 'sweep_all':
  49. self.dest_acct = None if m[4] is None else int(m[4])
  50. case 'transfer':
  51. self.dest_addr = CoinAddr(self.proto, m[3])
  52. self.amount = self.proto.coin_amt(m[4])
  53. case 'new':
  54. self.label = strip_quotes(m[3])
  55. case 'label':
  56. self.address_idx = int(m[3])
  57. self.label = strip_quotes(m[4])