|
@ -43,7 +43,7 @@ from aiohttp import ClientResponse |
|
|
|
|
|
|
|
|
from . import util |
|
|
from . import util |
|
|
from .util import (PrintError, print_error, log_exceptions, ignore_exceptions, |
|
|
from .util import (PrintError, print_error, log_exceptions, ignore_exceptions, |
|
|
bfh, SilentTaskGroup, make_aiohttp_session) |
|
|
bfh, SilentTaskGroup, make_aiohttp_session, send_exception_to_crash_reporter) |
|
|
|
|
|
|
|
|
from .bitcoin import COIN |
|
|
from .bitcoin import COIN |
|
|
from . import constants |
|
|
from . import constants |
|
@ -188,6 +188,13 @@ class TxBroadcastServerReturnedError(TxBroadcastError): |
|
|
str(self)) |
|
|
str(self)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TxBroadcastUnknownError(TxBroadcastError): |
|
|
|
|
|
def get_message_for_gui(self): |
|
|
|
|
|
return "{}\n{}" \ |
|
|
|
|
|
.format(_("Unknown error when broadcasting the transaction."), |
|
|
|
|
|
_("Consider trying to connect to a different server, or updating Electrum.")) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INSTANCE = None |
|
|
INSTANCE = None |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -764,9 +771,15 @@ class Network(PrintError): |
|
|
try: |
|
|
try: |
|
|
out = await self.interface.session.send_request('blockchain.transaction.broadcast', [str(tx)], timeout=timeout) |
|
|
out = await self.interface.session.send_request('blockchain.transaction.broadcast', [str(tx)], timeout=timeout) |
|
|
# note: both 'out' and exception messages are untrusted input from the server |
|
|
# note: both 'out' and exception messages are untrusted input from the server |
|
|
except aiorpcx.jsonrpc.RPCError as e: |
|
|
except (RequestTimedOut, asyncio.CancelledError, asyncio.TimeoutError): |
|
|
|
|
|
raise # pass-through |
|
|
|
|
|
except aiorpcx.jsonrpc.CodeMessageError as e: |
|
|
self.print_error(f"broadcast_transaction error: {repr(e)}") |
|
|
self.print_error(f"broadcast_transaction error: {repr(e)}") |
|
|
raise TxBroadcastServerReturnedError(self.sanitize_tx_broadcast_response(e.message)) from e |
|
|
raise TxBroadcastServerReturnedError(self.sanitize_tx_broadcast_response(e.message)) from e |
|
|
|
|
|
except BaseException as e: # intentional BaseException for sanity! |
|
|
|
|
|
self.print_error(f"broadcast_transaction error2: {repr(e)}") |
|
|
|
|
|
send_exception_to_crash_reporter(e) |
|
|
|
|
|
raise TxBroadcastUnknownError() from e |
|
|
if out != tx.txid(): |
|
|
if out != tx.txid(): |
|
|
self.print_error(f"unexpected txid for broadcast_transaction: {out} != {tx.txid()}") |
|
|
self.print_error(f"unexpected txid for broadcast_transaction: {out} != {tx.txid()}") |
|
|
raise TxBroadcastHashMismatch(_("Server returned unexpected transaction ID.")) |
|
|
raise TxBroadcastHashMismatch(_("Server returned unexpected transaction ID.")) |
|
|