#!/usr/bin/env python # # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution # Copyright (C) 2013 by philemon # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """ mmgen-addrimport: Import addresses into a bitcoind watching wallet. """ import sys from mmgen.Opts import * from mmgen.license import * from mmgen.util import check_infile,confirm_or_exit,msg,msg_r,secs_to_hms,get_lines_from_file from mmgen.tx import connect_to_bitcoind,parse_addrs_file from mmgen.bitcoin import verify_addr help_data = { 'prog_name': sys.argv[0].split("/")[-1], 'desc': """Import addresses (both mmgen and non-mmgen) into a bitcoind watching wallet""", 'usage':"[opts] [mmgen address file]", 'options': """ -h, --help Print this help message -l, --addrlist f Import the non-mmgen Bitcoin addresses listed in file 'f' -q, --quiet Suppress warnings """ } short_opts = "hl:q" long_opts = "help", "addrlist=", "quiet" opts,cmd_args = process_opts(sys.argv,help_data,"".join(short_opts),long_opts) if len(cmd_args) != 1 and not 'addrlist' in opts: msg("You must specify an mmgen address list (and/or non-mmgen addresses with the '--addrlist' option)") sys.exit(1) check_opts(opts,long_opts) if cmd_args: check_infile(cmd_args[0]) seed_id,addr_data = parse_addrs_file(cmd_args[0]) else: seed_id,addr_data = "",[] if 'addrlist' in opts: l = get_lines_from_file( opts['addrlist'],"non-mmgen addresses",remove_comments=True) addr_data += [(None,i) for i in l] msg_r("Validating addresses...") for i in addr_data: if not verify_addr(i[1]): msg("%s: invalid address" % i) sys.exit(2) msg("OK") import mmgen.config as g g.http_timeout = 3600 c = connect_to_bitcoind() if not 'quiet' in opts: message = """ Importing addresses can take a long time (>30 min.) on a low-powered computer. """ confirm_or_exit(message, "continue", expect="YES") import threading import time err_flag = False def import_address(addr,label): try: c.importaddress(addr,label) except: global err_flag err_flag = True w1 = len(str(len(addr_data))) * 2 + 2 w2 = len(str(max([i[0] for i in addr_data if i[0]]))) + 12 msg_fmt = "\r%s %-" + str(w1) + "s %-34s %-" + str(w2) + "s" msg("Importing addresses") for n,i in enumerate(addr_data): if i[0]: comment = " " + i[2] if len(i) == 3 else "" label = "%s:%s%s" % (seed_id,i[0],comment) else: label = "non-mmgen" t = threading.Thread(target=import_address, args = (i[1],label)) t.daemon = True t.start() start = int(time.time()) while True: if t.is_alive(): elapsed = int(time.time() - start) msg_r(msg_fmt % ( secs_to_hms(elapsed), ("%s/%s:" % (n+1,len(addr_data))), i[1], "(" + label + ")" ) ) time.sleep(1) else: if err_flag: msg("\nImport failed") sys.exit(2) msg("\nOK") break