def getWallet(path=None): if not path: config = SimpleConfig() path = config.get_wallet_path() storage = WalletStorage(path) if not storage.file_exists: print "Failed to run: No wallet to migrate" sys.exit(1) return Wallet(storage)
def get_interfaces(servers, timeout=10): '''Returns a map of servers to connected interfaces. If any connections fail or timeout, they will be missing from the map. ''' socket_queue = Queue.Queue() config = SimpleConfig() connecting = {} for server in servers: if server not in connecting: connecting[server] = Connection(server, socket_queue, config.path) interfaces = {} timeout = time.time() + timeout count = 0 while time.time() < timeout and count < len(servers): try: server, socket = socket_queue.get(True, 0.3) except Queue.Empty: continue if socket: interfaces[server] = Interface(server, socket) count += 1 return interfaces
def make_config(config=None): if config is None: config = {} return SimpleConfig(config) if isinstance(config, dict) else config
def setup_network(): self.config = SimpleConfig() self.network = Network(self.config) alert.info("Loading the wallet...") return defer.succeed(self.network.start())
class LBRYumWallet(LBRYWallet): def __init__(self, db_dir): LBRYWallet.__init__(self, db_dir) self.config = None self.network = None self.wallet = None self.cmd_runner = None self.first_run = False self.printed_retrieving_headers = False self._start_check = None self._catch_up_check = None self._caught_up_counter = 0 self._lag_counter = 0 self.blocks_behind_alert = 0 self.catchup_progress = 0 self.max_behind = 0 def _start(self): network_start_d = defer.Deferred() def setup_network(): self.config = SimpleConfig() self.network = Network(self.config) alert.info("Loading the wallet...") return defer.succeed(self.network.start()) d = setup_network() def check_started(): if self.network.is_connecting(): if not self.printed_retrieving_headers and self.network.blockchain.retrieving_headers: alert.info("Running the wallet for the first time...this may take a moment.") self.printed_retrieving_headers = True return False self._start_check.stop() self._start_check = None if self.network.is_connected(): network_start_d.callback(True) else: network_start_d.errback(ValueError("Failed to connect to network.")) self._start_check = task.LoopingCall(check_started) d.addCallback(lambda _: self._start_check.start(.1)) d.addCallback(lambda _: network_start_d) d.addCallback(lambda _: self._load_wallet()) d.addCallback(lambda _: self._get_cmd_runner()) return d def _stop(self): if self._start_check is not None: self._start_check.stop() self._start_check = None if self._catch_up_check is not None: self._catch_up_check.stop() self._catch_up_check = None d = defer.Deferred() def check_stopped(): if self.network: if self.network.is_connected(): return False stop_check.stop() self.network = None d.callback(True) if self.network: self.network.stop() stop_check = task.LoopingCall(check_stopped) stop_check.start(.1) return d def _load_wallet(self): def get_wallet(): path = self.config.get_wallet_path() storage = WalletStorage(path) wallet = Wallet(storage) if not storage.file_exists: self.first_run = True seed = wallet.make_seed() wallet.add_seed(seed, None) wallet.create_master_keys(None) wallet.create_main_account() wallet.synchronize() self.wallet = wallet blockchain_caught_d = defer.Deferred() def check_caught_up(): local_height = self.network.get_local_height() remote_height = self.network.get_server_height() if remote_height != 0 and remote_height - local_height <= 5: msg = "" if self._caught_up_counter != 0: msg += "All caught up. " msg += "Wallet loaded." alert.info(msg) self._catch_up_check.stop() self._catch_up_check = None blockchain_caught_d.callback(True) elif remote_height != 0: past_blocks_behind = self.blocks_behind_alert self.blocks_behind_alert = remote_height - local_height if self.blocks_behind_alert < past_blocks_behind: self._lag_counter = 0 self.is_lagging = False else: self._lag_counter += 1 if self._lag_counter >= 900: self.is_lagging = True if self.blocks_behind_alert > self.max_behind: self.max_behind = self.blocks_behind_alert self.catchup_progress = int(100 * (self.blocks_behind_alert / (5 + self.max_behind))) if self._caught_up_counter == 0: alert.info('Catching up with the blockchain...showing blocks left...') if self._caught_up_counter % 30 == 0: alert.info('%d...', (remote_height - local_height)) self._caught_up_counter += 1 self._catch_up_check = task.LoopingCall(check_caught_up) d = threads.deferToThread(get_wallet) d.addCallback(self._save_wallet) d.addCallback(lambda _: self.wallet.start_threads(self.network)) d.addCallback(lambda _: self._catch_up_check.start(.1)) d.addCallback(lambda _: blockchain_caught_d) return d def _get_cmd_runner(self): self.cmd_runner = Commands(self.config, self.wallet, self.network) def get_balance(self): cmd = known_commands['getbalance'] func = getattr(self.cmd_runner, cmd.name) d = threads.deferToThread(func) d.addCallback(lambda result: result['unmatured'] if 'unmatured' in result else result['confirmed']) d.addCallback(Decimal) return d def get_new_address(self): d = threads.deferToThread(self.wallet.create_new_address) d.addCallback(self._save_wallet) return d def get_block(self, blockhash): cmd = known_commands['getblock'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func, blockhash) def get_most_recent_blocktime(self): header = self.network.get_header(self.network.get_local_height()) return defer.succeed(header['timestamp']) def get_best_blockhash(self): height = self.network.get_local_height() d = threads.deferToThread(self.network.blockchain.read_header, height) d.addCallback(lambda header: self.network.blockchain.hash_header(header)) return d def get_name_claims(self): cmd = known_commands['getnameclaims'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func) def _check_first_run(self): return defer.succeed(self.first_run) def _get_raw_tx(self, txid): cmd = known_commands['gettransaction'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func, txid) def _send_name_claim(self, name, val, amount): def send_claim(address): cmd = known_commands['claimname'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func, address, amount, name, val) d = self.get_new_address() d.addCallback(send_claim) d.addCallback(self._broadcast_transaction) return d def _get_decoded_tx(self, raw_tx): tx = Transaction(raw_tx) decoded_tx = {} decoded_tx['vout'] = [] for output in tx.outputs(): out = {} out['value'] = Decimal(output[2]) / Decimal(COIN) decoded_tx['vout'].append(out) return decoded_tx def _send_abandon(self, txid, address, amount): log.info("Abandon " + str(txid) + " " + str(address) + " " + str(amount)) cmd = known_commands['abandonclaim'] func = getattr(self.cmd_runner, cmd.name) d = threads.deferToThread(func, txid, address, amount) d.addCallback(self._broadcast_transaction) return d def _broadcast_transaction(self, raw_tx): log.info("Broadcast: " + str(raw_tx)) cmd = known_commands['broadcast'] func = getattr(self.cmd_runner, cmd.name) d = threads.deferToThread(func, raw_tx) d.addCallback(self._save_wallet) return d def _do_send_many(self, payments_to_send): log.warning("Doing send many. payments to send: %s", str(payments_to_send)) outputs = [(TYPE_ADDRESS, address, int(amount*COIN)) for address, amount in payments_to_send.iteritems()] d = threads.deferToThread(self.wallet.mktx, outputs, None, self.config) d.addCallback(lambda tx: threads.deferToThread(self.wallet.sendtx, tx)) d.addCallback(self._save_wallet) return d def _get_value_for_name(self, name): cmd = known_commands['getvalueforname'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func, name) def get_claims_from_tx(self, txid): cmd = known_commands['getclaimsfromtx'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func, txid) def _get_balance_for_address(self, address): return defer.succeed(Decimal(self.wallet.get_addr_received(address))/COIN) def get_nametrie(self): cmd = known_commands['getclaimtrie'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func) def get_history(self): cmd = known_commands['history'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func) def get_tx_json(self, txid): def _decode(raw_tx): tx = Transaction(raw_tx).deserialize() decoded_tx = {} for txkey in tx.keys(): if isinstance(tx[txkey], list): decoded_tx[txkey] = [] for i in tx[txkey]: tmp = {} for k in i.keys(): if isinstance(i[k], Decimal): tmp[k] = float(i[k] / 1e8) else: tmp[k] = i[k] decoded_tx[txkey].append(tmp) else: decoded_tx[txkey] = tx[txkey] return decoded_tx d = self._get_raw_tx(txid) d.addCallback(_decode) return d def get_pub_keys(self, wallet): cmd = known_commands['getpubkeys'] func = getattr(self.cmd_runner, cmd.name) return threads.deferToThread(func, wallet) def _save_wallet(self, val): d = threads.deferToThread(self.wallet.storage.write) d.addCallback(lambda _: val) return d