bump.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
  4. # Copyright (C)2013-2023 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.tx.bump: Bitcoin transaction bump class
  12. """
  13. import mmgen.tx.bump as TxBase
  14. from .new import New
  15. from .completed import Completed
  16. from ....util import msg
  17. class Bump(Completed,New,TxBase.Bump):
  18. desc = 'fee-bumped transaction'
  19. @property
  20. def min_fee(self):
  21. return self.sum_inputs() - self.sum_outputs() + self.relay_fee
  22. def bump_fee(self,idx,fee):
  23. self.update_output_amt(
  24. idx,
  25. self.sum_inputs() - self.sum_outputs(exclude=idx) - fee
  26. )
  27. def convert_and_check_fee(self,fee,desc):
  28. ret = super().convert_and_check_fee(fee,desc)
  29. if ret == False:
  30. return ret
  31. if ret < self.min_fee:
  32. msg('{} {c}: {} fee too small. Minimum fee: {} {c} ({} {})'.format(
  33. ret.hl(),
  34. desc,
  35. self.min_fee,
  36. self.fee_abs2rel(self.min_fee.hl()),
  37. self.rel_fee_desc,
  38. c = self.coin ))
  39. return False
  40. output_amt = self.outputs[self.bump_output_idx].amt
  41. if ret >= output_amt:
  42. msg('{} {c}: {} fee too large. Maximum fee: <{} {c}'.format(
  43. ret.hl(),
  44. desc,
  45. output_amt.hl(),
  46. c = self.coin ))
  47. return False
  48. return ret