You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.3 KiB
81 lines
2.3 KiB
#!/usr/bin/python
|
|
import argparse
|
|
import logging
|
|
import operator
|
|
import re
|
|
import sys
|
|
import six
|
|
|
|
from monero.backends.jsonrpc import JSONRPCDaemon
|
|
from monero.daemon import Daemon
|
|
from monero.transaction import Transaction
|
|
from monero import exceptions
|
|
|
|
|
|
def url_data(url):
|
|
gs = re.compile(r"^(?P<host>[^:\s]+)(?::(?P<port>[0-9]+))?$").match(url).groupdict()
|
|
return dict(filter(operator.itemgetter(1), gs.items()))
|
|
|
|
|
|
argsparser = argparse.ArgumentParser(description="Push transaction to network")
|
|
argsparser.add_argument(
|
|
"daemon_rpc_url",
|
|
nargs="?",
|
|
type=url_data,
|
|
default="127.0.0.1:18081",
|
|
help="Daemon RPC URL [host[:port]]",
|
|
)
|
|
argsparser.add_argument(
|
|
"-v",
|
|
dest="verbosity",
|
|
action="count",
|
|
default=0,
|
|
help="Verbosity (repeat to increase; -v for INFO, -vv for DEBUG",
|
|
)
|
|
argsparser.add_argument(
|
|
"-p", dest="proxy_url", nargs="?", type=str, default=None, help="Proxy URL"
|
|
)
|
|
argsparser.add_argument(
|
|
"-t", dest="timeout", type=int, default=30, help="Request timeout"
|
|
)
|
|
argsparser.add_argument(
|
|
"-i",
|
|
dest="tx_filenames",
|
|
nargs="+",
|
|
default=None,
|
|
help="Files with transaction data. Will read from stdin if not given.",
|
|
)
|
|
argsparser.add_argument(
|
|
"--no-relay",
|
|
dest="relay",
|
|
action="store_false",
|
|
help="Do not relay the transaction (it will stay at the node unless mined or expired)",
|
|
)
|
|
args = argsparser.parse_args()
|
|
level = logging.WARNING
|
|
if args.verbosity == 1:
|
|
level = logging.INFO
|
|
elif args.verbosity > 1:
|
|
level = logging.DEBUG
|
|
logging.basicConfig(level=level, format="%(asctime)-15s %(message)s")
|
|
if args.tx_filenames:
|
|
blobs = [(f, open(f, "rb").read()) for f in args.tx_filenames]
|
|
else:
|
|
blobs = [("transaction", sys.stdin.buffer.read() if six.PY3 else sys.stdin.read())]
|
|
d = Daemon(
|
|
JSONRPCDaemon(timeout=args.timeout, proxy_url=args.proxy_url, **args.daemon_rpc_url)
|
|
)
|
|
for name, blob in blobs:
|
|
logging.debug("Sending {}".format(name))
|
|
tx = Transaction(blob=blob)
|
|
try:
|
|
res = d.send_transaction(tx, relay=args.relay)
|
|
except exceptions.TransactionBroadcastError as e:
|
|
print("{} not sent, reason: {}".format(name, e.details["reason"]))
|
|
logging.debug(e.details)
|
|
continue
|
|
if res["not_relayed"]:
|
|
print("{} not relayed".format(name))
|
|
else:
|
|
print("{} successfully sent".format(name))
|