online.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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.eth.tx.online: Ethereum online signed transaction class
  12. """
  13. import mmgen.tx.online as TxBase
  14. from .signed import Signed,TokenSigned
  15. from .. import erigon_sleep
  16. from ....util import msg,rmsg,die
  17. class OnlineSigned(Signed,TxBase.OnlineSigned):
  18. async def send(self,prompt_user=True,exit_on_fail=False):
  19. self.check_correct_chain()
  20. if not self.disable_fee_check and (self.fee > self.proto.max_tx_fee):
  21. die(2,'Transaction fee ({}) greater than {} max_tx_fee ({} {})!'.format(
  22. self.fee,
  23. self.proto.name,
  24. self.proto.max_tx_fee,
  25. self.proto.coin ))
  26. await self.status.display()
  27. if prompt_user:
  28. self.confirm_send()
  29. if self.cfg.bogus_send:
  30. ret = None
  31. else:
  32. try:
  33. ret = await self.rpc.call('eth_sendRawTransaction','0x'+self.serialized)
  34. except:
  35. raise
  36. ret = False
  37. if ret == False:
  38. rmsg(f'Send of MMGen transaction {self.txid} failed')
  39. if exit_on_fail:
  40. sys.exit(1)
  41. return False
  42. else:
  43. if self.cfg.bogus_send:
  44. m = 'BOGUS transaction NOT sent: {}'
  45. else:
  46. m = 'Transaction sent: {}'
  47. assert ret == '0x'+self.coin_txid,'txid mismatch (after sending)'
  48. await erigon_sleep(self)
  49. self.desc = 'sent transaction'
  50. msg(m.format(self.coin_txid.hl()))
  51. self.add_timestamp()
  52. self.add_blockcount()
  53. return True
  54. def print_contract_addr(self):
  55. if 'token_addr' in self.txobj:
  56. msg('Contract address: {}'.format( self.txobj['token_addr'].hl() ))
  57. class TokenOnlineSigned(TokenSigned,OnlineSigned):
  58. def parse_txfile_serialized_data(self):
  59. from ....addr import TokenAddr
  60. from ..contract import Token
  61. d = OnlineSigned.parse_txfile_serialized_data(self)
  62. o = self.txobj
  63. assert self.twctl.token == o['to']
  64. o['token_addr'] = TokenAddr(self.proto,o['to'])
  65. o['decimals'] = self.twctl.decimals
  66. t = Token(self.cfg,self.proto,o['token_addr'],o['decimals'])
  67. o['amt'] = t.transferdata2amt(o['data'])
  68. o['token_to'] = t.transferdata2sendaddr(o['data'])