From 121d8732f1e1d97f70a0f72221b4acca1e818319 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Wed, 1 Jun 2022 23:03:35 +0200 Subject: [PATCH] Persist LNWatcher transactions in wallet file: - separate AddressSynchronizer from Wallet and LNWatcher - the AddressSynchronizer class is referred to as 'adb' (address database) - Use callbacks to replace overloaded methods --- electrum/address_synchronizer.py | 37 +-- electrum/commands.py | 12 +- electrum/gui/kivy/main_window.py | 4 +- electrum/gui/kivy/uix/dialogs/addresses.py | 2 +- .../gui/kivy/uix/dialogs/request_dialog.py | 2 +- electrum/gui/kivy/uix/screens.py | 2 +- electrum/gui/qt/address_list.py | 4 +- electrum/gui/qt/channels_list.py | 2 +- electrum/gui/qt/history_list.py | 6 +- electrum/gui/qt/main_window.py | 8 +- electrum/gui/qt/transaction_dialog.py | 6 +- electrum/lnchannel.py | 7 +- electrum/lnpeer.py | 2 +- electrum/lnwatcher.py | 105 ++++--- electrum/lnworker.py | 19 +- electrum/network.py | 2 +- electrum/submarine_swaps.py | 9 +- electrum/synchronizer.py | 39 +-- electrum/tests/test_commands.py | 8 +- electrum/tests/test_lnpeer.py | 8 +- electrum/tests/test_wallet.py | 15 +- electrum/tests/test_wallet_vertical.py | 292 +++++++++--------- electrum/wallet.py | 214 ++++++++----- 23 files changed, 439 insertions(+), 366 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index f40f5ed20..4342d20ec 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -66,9 +66,7 @@ class TxWalletDelta(NamedTuple): class AddressSynchronizer(Logger): - """ - inherited by wallet - """ + """ address database """ network: Optional['Network'] asyncio_loop: Optional['asyncio.AbstractEventLoop'] = None @@ -207,7 +205,7 @@ class AddressSynchronizer(Logger): self.db.put('stored_height', self.get_local_height()) def add_address(self, address): - if not self.db.get_addr_history(address): + if address not in self.db.history: self.db.history[address] = [] self.set_up_to_date(False) if self.synchronizer: @@ -341,6 +339,7 @@ class AddressSynchronizer(Logger): # save self.db.add_transaction(tx_hash, tx) self.db.add_num_inputs_to_tx(tx_hash, len(tx.inputs())) + util.trigger_callback('adb_added_tx', self, tx_hash) return True def remove_transaction(self, tx_hash: str) -> None: @@ -504,10 +503,7 @@ class AddressSynchronizer(Logger): @with_lock @with_transaction_lock @with_local_height_cached - def get_history(self, *, domain=None) -> Sequence[HistoryItem]: - # get domain - if domain is None: - domain = self.get_addresses() + def get_history(self, domain) -> Sequence[HistoryItem]: domain = set(domain) # 1. Get the history of each address in the domain, maintain the # delta of a tx as the sum of its deltas on domain addresses @@ -536,7 +532,7 @@ class AddressSynchronizer(Logger): fee=fee, balance=balance)) # sanity check - c, u, x = self.get_balance(domain=domain) + c, u, x = self.get_balance(domain) if balance != c + u + x: raise Exception("wallet.get_history() failed balance sanity-check") return h2 @@ -607,8 +603,7 @@ class AddressSynchronizer(Logger): with self.lock: self.unverified_tx.pop(tx_hash, None) self.db.add_verified_tx(tx_hash, info) - tx_mined_status = self.get_tx_height(tx_hash) - util.trigger_callback('verified', self, tx_hash, tx_mined_status) + util.trigger_callback('adb_added_verified_tx', self, tx_hash) def get_unverified_txs(self) -> Dict[str, int]: '''Returns a map from tx hash to transaction height''' @@ -637,6 +632,9 @@ class AddressSynchronizer(Logger): # a status update, that will overwrite it. self.unverified_tx[tx_hash] = tx_height txs.add(tx_hash) + + for tx_hash in txs: + util.trigger_callback('adb_removed_verified_tx', self, tx_hash) return txs def get_local_height(self) -> int: @@ -688,7 +686,7 @@ class AddressSynchronizer(Logger): if self.verifier: self.verifier.reset_request_counters() # fire triggers - util.trigger_callback('status') + util.trigger_callback('adb_set_up_to_date', self) if status_changed: self.logger.info(f'set_up_to_date: {up_to_date}') @@ -837,17 +835,12 @@ class AddressSynchronizer(Logger): received, sent = self.get_addr_io(address) return sum([v for height, v, is_cb in received.values()]) - def get_addr_balance(self, address): - return self.get_balance([address]) - @with_local_height_cached - def get_balance(self, domain=None, *, excluded_addresses: Set[str] = None, + def get_balance(self, domain, *, excluded_addresses: Set[str] = None, excluded_coins: Set[str] = None) -> Tuple[int, int, int]: """Return the balance of a set of addresses: confirmed and matured, unconfirmed, unmatured """ - if domain is None: - domain = self.get_addresses() if excluded_addresses is None: excluded_addresses = set() assert isinstance(excluded_addresses, set), f"excluded_addresses should be set, not {type(excluded_addresses)}" @@ -909,7 +902,7 @@ class AddressSynchronizer(Logger): @with_local_height_cached def get_utxos( self, - domain=None, + domain, *, excluded_addresses=None, mature_only: bool = False, @@ -926,8 +919,6 @@ class AddressSynchronizer(Logger): else: block_height = self.get_local_height() coins = [] - if domain is None: - domain = self.get_addresses() domain = set(domain) if excluded_addresses: domain = set(domain) - set(excluded_addresses) @@ -957,7 +948,3 @@ class AddressSynchronizer(Logger): def is_empty(self, address: str) -> bool: coins = self.get_addr_utxo(address) return not bool(coins) - - def synchronize(self) -> int: - """Returns the number of new addresses we generated.""" - return 0 diff --git a/electrum/commands.py b/electrum/commands.py index 77442a171..139efd55f 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -826,9 +826,9 @@ class Commands: continue if change and not wallet.is_change(addr): continue - if unused and wallet.is_used(addr): + if unused and wallet.adb.is_used(addr): continue - if funded and wallet.is_empty(addr): + if funded and wallet.adb.is_empty(addr): continue item = addr if labels or balance: @@ -965,7 +965,7 @@ class Commands: async def addtransaction(self, tx, wallet: Abstract_Wallet = None): """ Add a transaction to the wallet history """ tx = Transaction(tx) - if not wallet.add_transaction(tx): + if not wallet.adb.add_transaction(tx): return False wallet.save_db() return tx.txid() @@ -1040,11 +1040,11 @@ class Commands: """ if not is_hash256_str(txid): raise Exception(f"{repr(txid)} is not a txid") - height = wallet.get_tx_height(txid).height + height = wallet.adb.get_tx_height(txid).height if height != TX_HEIGHT_LOCAL: raise Exception(f'Only local transactions can be removed. ' f'This tx has height: {height} != {TX_HEIGHT_LOCAL}') - wallet.remove_transaction(txid) + wallet.adb.remove_transaction(txid) wallet.save_db() @command('wn') @@ -1057,7 +1057,7 @@ class Commands: if not wallet.db.get_transaction(txid): raise Exception("Transaction not in wallet.") return { - "confirmations": wallet.get_tx_height(txid).conf, + "confirmations": wallet.adb.get_tx_height(txid).conf, } @command('') diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index dd30e7175..5ff605170 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -957,7 +957,7 @@ class ElectrumWindow(App, Logger): server_height = self.network.get_server_height() server_lag = self.num_blocks - server_height if not self.wallet.is_up_to_date() or server_height == 0: - num_sent, num_answered = self.wallet.get_history_sync_state_details() + num_sent, num_answered = self.wallet.adb.get_history_sync_state_details() status = ("{} [size=18dp]({}/{})[/size]" .format(_("Synchronizing..."), num_answered, num_sent)) elif server_lag > 1: @@ -1164,7 +1164,7 @@ class ElectrumWindow(App, Logger): def show_transaction(self, txid): tx = self.wallet.db.get_transaction(txid) if not tx and self.wallet.lnworker: - tx = self.wallet.lnworker.lnwatcher.db.get_transaction(txid) + tx = self.wallet.adb.get_transaction(txid) if tx: self.tx_dialog(tx) else: diff --git a/electrum/gui/kivy/uix/dialogs/addresses.py b/electrum/gui/kivy/uix/dialogs/addresses.py index e6648c8a5..5930677af 100644 --- a/electrum/gui/kivy/uix/dialogs/addresses.py +++ b/electrum/gui/kivy/uix/dialogs/addresses.py @@ -264,7 +264,7 @@ class AddressesDialog(Factory.Popup): for address in _list: label = wallet.get_label(address) balance = sum(wallet.get_addr_balance(address)) - is_used_and_empty = wallet.is_used(address) and balance == 0 + is_used_and_empty = wallet.adb.is_used(address) and balance == 0 if self.show_used == 1 and (balance or is_used_and_empty): continue if self.show_used == 2 and balance == 0: diff --git a/electrum/gui/kivy/uix/dialogs/request_dialog.py b/electrum/gui/kivy/uix/dialogs/request_dialog.py index af5722551..38f11d8bb 100644 --- a/electrum/gui/kivy/uix/dialogs/request_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/request_dialog.py @@ -168,7 +168,7 @@ class RequestDialog(Factory.Popup): address = req.get_address() if not address: warning = _('Warning') + ': ' + _('This request cannot be paid on-chain') - elif self.app.wallet.is_used(address): + elif self.app.wallet.adb.is_used(address): warning = _('Warning') + ': ' + _('This address is being reused') self.warning = warning diff --git a/electrum/gui/kivy/uix/screens.py b/electrum/gui/kivy/uix/screens.py index e0de07436..419d5a632 100644 --- a/electrum/gui/kivy/uix/screens.py +++ b/electrum/gui/kivy/uix/screens.py @@ -102,7 +102,7 @@ class HistoryScreen(CScreen): self.app.lightning_tx_dialog(tx_item) return if tx_item.get('lightning'): - tx = self.app.wallet.lnworker.lnwatcher.db.get_transaction(key) + tx = self.app.wallet.adb.get_transaction(key) else: tx = self.app.wallet.db.get_transaction(key) if not tx: diff --git a/electrum/gui/qt/address_list.py b/electrum/gui/qt/address_list.py index d4994aa50..decf72157 100644 --- a/electrum/gui/qt/address_list.py +++ b/electrum/gui/qt/address_list.py @@ -167,7 +167,7 @@ class AddressList(MyTreeView): for address in addr_list: c, u, x = self.wallet.get_addr_balance(address) balance = c + u + x - is_used_and_empty = self.wallet.is_used(address) and balance == 0 + is_used_and_empty = self.wallet.adb.is_used(address) and balance == 0 if self.show_used == AddressUsageStateFilter.UNUSED and (balance or is_used_and_empty): continue if self.show_used == AddressUsageStateFilter.FUNDED and balance == 0: @@ -219,7 +219,7 @@ class AddressList(MyTreeView): def refresh_row(self, key, row): address = key label = self.wallet.get_label(address) - num = self.wallet.get_address_history_len(address) + num = self.wallet.adb.get_address_history_len(address) c, u, x = self.wallet.get_addr_balance(address) balance = c + u + x balance_text = self.parent.format_amount(balance, whitespaces=True) diff --git a/electrum/gui/qt/channels_list.py b/electrum/gui/qt/channels_list.py index 5f84cc76c..248ff487d 100644 --- a/electrum/gui/qt/channels_list.py +++ b/electrum/gui/qt/channels_list.py @@ -258,7 +258,7 @@ class ChannelsList(MyTreeView): item = chan.get_closing_height() if item: txid, height, timestamp = item - closing_tx = self.lnworker.lnwatcher.db.get_transaction(txid) + closing_tx = self.parent.wallet.db.get_transaction(txid) if closing_tx: menu.addAction(_("View closing transaction"), lambda: self.parent.show_transaction(closing_tx)) menu.addSeparator() diff --git a/electrum/gui/qt/history_list.py b/electrum/gui/qt/history_list.py index 807c67c9d..106a00093 100644 --- a/electrum/gui/qt/history_list.py +++ b/electrum/gui/qt/history_list.py @@ -717,7 +717,7 @@ class HistoryList(MyTreeView, AcceptFileDragDrop): return tx_hash = tx_item['txid'] if tx_item.get('lightning'): - tx = self.wallet.lnworker.lnwatcher.db.get_transaction(tx_hash) + tx = self.wallet.adb.get_transaction(tx_hash) else: tx = self.wallet.db.get_transaction(tx_hash) if not tx: @@ -760,7 +760,7 @@ class HistoryList(MyTreeView, AcceptFileDragDrop): menu.exec_(self.viewport().mapToGlobal(position)) def remove_local_tx(self, tx_hash: str): - num_child_txs = len(self.wallet.get_depending_transactions(tx_hash)) + num_child_txs = len(self.wallet.adb.get_depending_transactions(tx_hash)) question = _("Are you sure you want to remove this transaction?") if num_child_txs > 0: question = (_("Are you sure you want to remove this transaction and {} child transactions?") @@ -768,7 +768,7 @@ class HistoryList(MyTreeView, AcceptFileDragDrop): if not self.parent.question(msg=question, title=_("Please confirm")): return - self.wallet.remove_transaction(tx_hash) + self.wallet.adb.remove_transaction(tx_hash) self.wallet.save_db() # need to update at least: history_list, utxo_list, address_list self.parent.need_update.set() diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index 081beda65..801a9c6ce 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -1015,7 +1015,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): # until we get a headers subscription request response. # Display the synchronizing message in that case. if not self.wallet.is_up_to_date() or server_height == 0: - num_sent, num_answered = self.wallet.get_history_sync_state_details() + num_sent, num_answered = self.wallet.adb.get_history_sync_state_details() network_text = ("{} ({}/{})" .format(_("Synchronizing..."), num_answered, num_sent)) icon = read_QIcon("status_waiting.png") @@ -1510,7 +1510,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): def update_receive_address_styling(self): addr = str(self.receive_address_e.text()) - if is_address(addr) and self.wallet.is_used(addr): + if is_address(addr) and self.wallet.adb.is_used(addr): self.receive_address_e.setStyleSheet(ColorScheme.RED.as_stylesheet(True)) self.receive_address_e.setToolTip(_("This address has already been used. " "For better privacy, do not reuse it for new payments.")) @@ -3577,7 +3577,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): total_size = parent_tx.estimated_size() + new_tx.estimated_size() parent_txid = parent_tx.txid() assert parent_txid - parent_fee = self.wallet.get_tx_fee(parent_txid) + parent_fee = self.wallet.adb.get_tx_fee(parent_txid) if parent_fee is None: self.show_error(_("Can't CPFP: unknown fee for parent transaction.")) return @@ -3699,7 +3699,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): def save_transaction_into_wallet(self, tx: Transaction): win = self.top_level_window() try: - if not self.wallet.add_transaction(tx): + if not self.wallet.adb.add_transaction(tx): win.show_error(_("Transaction could not be saved.") + "\n" + _("It conflicts with current history.")) return False diff --git a/electrum/gui/qt/transaction_dialog.py b/electrum/gui/qt/transaction_dialog.py index ae83e66ed..5824db372 100644 --- a/electrum/gui/qt/transaction_dialog.py +++ b/electrum/gui/qt/transaction_dialog.py @@ -449,7 +449,7 @@ class BaseTxDialog(QDialog, MessageBoxMixin): item = lnworker_history[txid] ln_amount = item['amount_msat'] / 1000 if amount is None: - tx_mined_status = self.wallet.lnworker.lnwatcher.get_tx_height(txid) + tx_mined_status = self.wallet.lnworker.lnwatcher.adb.get_tx_height(txid) else: ln_amount = None self.broadcast_button.setEnabled(tx_details.can_broadcast) @@ -618,11 +618,11 @@ class BaseTxDialog(QDialog, MessageBoxMixin): prevout_hash = txin.prevout.txid.hex() prevout_n = txin.prevout.out_idx cursor.insertText(prevout_hash + ":%-4d " % prevout_n, ext) - addr = self.wallet.get_txin_address(txin) + addr = self.wallet.adb.get_txin_address(txin) if addr is None: addr = '' cursor.insertText(addr, text_format(addr)) - txin_value = self.wallet.get_txin_value(txin) + txin_value = self.wallet.adb.get_txin_value(txin) if txin_value is not None: cursor.insertText(format_amount(txin_value), ext) cursor.insertBlock() diff --git a/electrum/lnchannel.py b/electrum/lnchannel.py index fa29789dd..1fd5a690b 100644 --- a/electrum/lnchannel.py +++ b/electrum/lnchannel.py @@ -281,7 +281,7 @@ class AbstractChannel(Logger, ABC): if spender_txid is None: continue if spender_txid != self.funding_outpoint.txid: - tx_mined_height = self.lnworker.wallet.get_tx_height(spender_txid) + tx_mined_height = self.lnworker.wallet.adb.get_tx_height(spender_txid) if tx_mined_height.conf > lnutil.REDEEM_AFTER_DOUBLE_SPENT_DELAY: self.logger.info(f'channel is double spent {inputs}') self.set_state(ChannelState.REDEEMED) @@ -486,7 +486,8 @@ class ChannelBackup(AbstractChannel): def get_capacity(self): lnwatcher = self.lnworker.lnwatcher if lnwatcher: - return lnwatcher.get_tx_delta(self.funding_outpoint.txid, self.cb.funding_address) + # fixme: we should probably not call that method here + return lnwatcher.adb.get_tx_delta(self.funding_outpoint.txid, self.cb.funding_address) return None def is_backup(self): @@ -1549,7 +1550,7 @@ class Channel(AbstractChannel): return False assert conf > 0 # check funding_tx amount and script - funding_tx = self.lnworker.lnwatcher.db.get_transaction(funding_txid) + funding_tx = self.lnworker.lnwatcher.adb.get_transaction(funding_txid) if not funding_tx: self.logger.info(f"no funding_tx {funding_txid}") return False diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py index 56ca3f994..0a584bd75 100644 --- a/electrum/lnpeer.py +++ b/electrum/lnpeer.py @@ -2175,7 +2175,7 @@ class Peer(Logger): sig=bh2u(der_sig_from_sig_string(their_sig) + b'\x01')) # save local transaction and set state try: - self.lnworker.wallet.add_transaction(closing_tx) + self.lnworker.wallet.adb.add_transaction(closing_tx) except UnrelatedTransactionException: pass # this can happen if (~all the balance goes to REMOTE) chan.set_state(ChannelState.CLOSING) diff --git a/electrum/lnwatcher.py b/electrum/lnwatcher.py index 8486f62bf..7dd9888e0 100644 --- a/electrum/lnwatcher.py +++ b/electrum/lnwatcher.py @@ -16,6 +16,7 @@ from .address_synchronizer import AddressSynchronizer, TX_HEIGHT_LOCAL, TX_HEIGH from .transaction import Transaction, TxOutpoint from .transaction import match_script_against_template from .lnutil import WITNESS_TEMPLATE_RECEIVED_HTLC, WITNESS_TEMPLATE_OFFERED_HTLC +from .logging import Logger if TYPE_CHECKING: @@ -135,24 +136,34 @@ class SweepStore(SqlDB): -class LNWatcher(AddressSynchronizer): +class LNWatcher(Logger): + LOGGING_SHORTCUT = 'W' - def __init__(self, network: 'Network'): - AddressSynchronizer.__init__(self, WalletDB({}, manual_upgrades=False)) + def __init__(self, adb, network: 'Network'): + + Logger.__init__(self) + self.adb = adb self.config = network.config self.callbacks = {} # address -> lambda: coroutine self.network = network - util.register_callback( - self.on_network_update, - ['network_updated', 'blockchain_updated', 'verified', 'wallet_updated', 'fee']) + + util.register_callback(self.on_fee, ['fee']) + util.register_callback(self.on_blockchain_updated, ['blockchain_updated']) + util.register_callback(self.on_network_updated, ['network_updated']) + util.register_callback(self.on_adb_added_verified_tx, ['adb_added_verified_tx']) + util.register_callback(self.on_adb_set_up_to_date, ['adb_set_up_to_date']) # status gets populated when we run self.channel_status = {} + async def stop(self): - await super().stop() - util.unregister_callback(self.on_network_update) + util.unregister_callback(self.on_fee) + util.unregister_callback(self.on_blockchain_updated) + util.unregister_callback(self.on_network_updated) + util.unregister_callback(self.on_adb_added_verified_tx) + util.unregister_callback(self.on_adb_set_up_to_date) def get_channel_status(self, outpoint): return self.channel_status.get(outpoint, 'unknown') @@ -171,15 +182,31 @@ class LNWatcher(AddressSynchronizer): self.callbacks.pop(address, None) def add_callback(self, address, callback): - self.add_address(address) + self.adb.add_address(address) self.callbacks[address] = callback + async def on_fee(self, event, *args): + await self.trigger_callbacks() + + async def on_network_updated(self, event, *args): + await self.trigger_callbacks() + + async def on_blockchain_updated(self, event, *args): + await self.trigger_callbacks() + + async def on_adb_added_verified_tx(self, event, adb, tx_hash): + if adb != self.adb: + return + await self.trigger_callbacks() + + async def on_adb_set_up_to_date(self, event, adb): + if adb != self.adb: + return + await self.trigger_callbacks() + @log_exceptions - async def on_network_update(self, event, *args): - if event in ('verified', 'wallet_updated'): - if args[0] != self: - return - if not self.synchronizer: + async def trigger_callbacks(self): + if not self.adb.synchronizer: self.logger.info("synchronizer not set yet") return for address, callback in list(self.callbacks.items()): @@ -187,18 +214,18 @@ class LNWatcher(AddressSynchronizer): async def check_onchain_situation(self, address, funding_outpoint): # early return if address has not been added yet - if not self.is_mine(address): + if not self.adb.is_mine(address): return spenders = self.inspect_tx_candidate(funding_outpoint, 0) # inspect_tx_candidate might have added new addresses, in which case we return ealy - if not self.is_up_to_date(): + if not self.adb.is_up_to_date(): return funding_txid = funding_outpoint.split(':')[0] - funding_height = self.get_tx_height(funding_txid) + funding_height = self.adb.get_tx_height(funding_txid) closing_txid = spenders.get(funding_outpoint) - closing_height = self.get_tx_height(closing_txid) + closing_height = self.adb.get_tx_height(closing_txid) if closing_txid: - closing_tx = self.db.get_transaction(closing_txid) + closing_tx = self.adb.get_transaction(closing_txid) if closing_tx: keep_watching = await self.do_breach_remedy(funding_outpoint, closing_tx, spenders) else: @@ -233,18 +260,18 @@ class LNWatcher(AddressSynchronizer): n==2 => outpoint is a second-stage htlc """ prev_txid, index = outpoint.split(':') - spender_txid = self.db.get_spent_outpoint(prev_txid, int(index)) + spender_txid = self.adb.db.get_spent_outpoint(prev_txid, int(index)) result = {outpoint:spender_txid} if n == 0: if spender_txid is None: self.channel_status[outpoint] = 'open' elif not self.is_deeply_mined(spender_txid): - self.channel_status[outpoint] = 'closed (%d)' % self.get_tx_height(spender_txid).conf + self.channel_status[outpoint] = 'closed (%d)' % self.adb.get_tx_height(spender_txid).conf else: self.channel_status[outpoint] = 'closed (deep)' if spender_txid is None: return result - spender_tx = self.db.get_transaction(spender_txid) + spender_tx = self.adb.get_transaction(spender_txid) if n == 1: # if tx input is not a first-stage HTLC, we can stop recursion if len(spender_tx.inputs()) != 1: @@ -263,8 +290,8 @@ class LNWatcher(AddressSynchronizer): for i, o in enumerate(spender_tx.outputs()): if o.address is None: continue - if not self.is_mine(o.address): - self.add_address(o.address) + if not self.adb.is_mine(o.address): + self.adb.add_address(o.address) elif n < 2: r = self.inspect_tx_candidate(spender_txid+':%d'%i, n+1) result.update(r) @@ -273,7 +300,7 @@ class LNWatcher(AddressSynchronizer): def get_tx_mined_depth(self, txid: str): if not txid: return TxMinedDepth.FREE - tx_mined_depth = self.get_tx_height(txid) + tx_mined_depth = self.adb.get_tx_height(txid) height, conf = tx_mined_depth.height, tx_mined_depth.conf if conf > 100: return TxMinedDepth.DEEP @@ -298,13 +325,19 @@ class WatchTower(LNWatcher): LOGGING_SHORTCUT = 'W' def __init__(self, network): - LNWatcher.__init__(self, network) + adb = AddressSynchronizer(WalletDB({}, manual_upgrades=False)) + adb.start_network(network) + LNWatcher.__init__(self, adb, network) self.network = network self.sweepstore = SweepStore(os.path.join(self.network.config.path, "watchtower_db"), network) # this maps funding_outpoints to ListenerItems, which have an event for when the watcher is done, # and a queue for seeing which txs are being published self.tx_progress = {} # type: Dict[str, ListenerItem] + async def stop(self): + await super().stop() + await self.adb.stop() + def diagnostic_name(self): return "local_tower" @@ -327,7 +360,7 @@ class WatchTower(LNWatcher): return keep_watching async def broadcast_or_log(self, funding_outpoint: str, tx: Transaction): - height = self.get_tx_height(tx.txid()).height + height = self.adb.get_tx_height(tx.txid()).height if height != TX_HEIGHT_LOCAL: return try: @@ -379,7 +412,7 @@ class LNWalletWatcher(LNWatcher): def __init__(self, lnworker: 'LNWallet', network: 'Network'): self.network = network self.lnworker = lnworker - LNWatcher.__init__(self, network) + LNWatcher.__init__(self, lnworker.wallet.adb, network) def diagnostic_name(self): return f"{self.lnworker.wallet.diagnostic_name()}-LNW" @@ -412,7 +445,7 @@ class LNWalletWatcher(LNWatcher): name = sweep_info.name + ' ' + chan.get_id_for_log() spender_txid = spenders.get(prevout) if spender_txid is not None: - spender_tx = self.db.get_transaction(spender_txid) + spender_tx = self.adb.get_transaction(spender_txid) if not spender_tx: keep_watching = True continue @@ -446,7 +479,7 @@ class LNWalletWatcher(LNWatcher): broadcast = False reason = 'waiting for {}: CLTV ({} > {}), prevout {}'.format(name, local_height, sweep_info.cltv_expiry, prevout) if sweep_info.csv_delay: - prev_height = self.get_tx_height(prev_txid) + prev_height = self.adb.get_tx_height(prev_txid) wanted_height = sweep_info.csv_delay + prev_height.height - 1 if prev_height.height <= 0 or wanted_height - local_height > 0: broadcast = False @@ -460,24 +493,16 @@ class LNWalletWatcher(LNWatcher): if broadcast: await self.network.try_broadcasting(tx, name) else: - if txid in self.lnworker.wallet.future_tx: + if txid in self.adb.future_tx: return self.logger.debug(f'(chan {chan_id_for_log}) trying to redeem {name}: {prevout}') self.logger.info(reason) # it's OK to add local transaction, the fee will be recomputed try: - tx_was_added = self.lnworker.wallet.add_future_tx(tx, wanted_height) + tx_was_added = self.adb.add_future_tx(tx, wanted_height) except Exception as e: self.logger.info(f'could not add future tx: {name}. prevout: {prevout} {str(e)}') tx_was_added = False if tx_was_added: self.logger.info(f'added future tx: {name}. prevout: {prevout}') util.trigger_callback('wallet_updated', self.lnworker.wallet) - - def add_verified_tx(self, tx_hash: str, info: TxMinedInfo): - # this method is overloaded so that we have the GUI refreshed - # TODO: LNWatcher should not be an AddressSynchronizer, - # we should use the existing wallet instead, and results would be persisted - super().add_verified_tx(tx_hash, info) - tx_mined_status = self.get_tx_height(tx_hash) - util.trigger_callback('verified', self.lnworker.wallet, tx_hash, tx_mined_status) diff --git a/electrum/lnworker.py b/electrum/lnworker.py index 2df9b56d2..5458e7643 100644 --- a/electrum/lnworker.py +++ b/electrum/lnworker.py @@ -734,7 +734,6 @@ class LNWallet(LNWorker): def start_network(self, network: 'Network'): super().start_network(network) self.lnwatcher = LNWalletWatcher(self, network) - self.lnwatcher.start_network(network) self.swap_manager.start_network(network=network, lnwatcher=self.lnwatcher) self.lnrater = LNRater(self, network) @@ -745,7 +744,7 @@ class LNWallet(LNWorker): for coro in [ self.maybe_listen(), - self.lnwatcher.on_network_update('network_updated'), # shortcut (don't block) if funding tx locked and verified + self.lnwatcher.trigger_callbacks(), # shortcut (don't block) if funding tx locked and verified self.reestablish_peers_and_channels(), self.sync_with_local_watchtower(), self.sync_with_remote_watchtower(), @@ -850,7 +849,7 @@ class LNWallet(LNWorker): return out def get_onchain_history(self): - current_height = self.wallet.get_local_height() + current_height = self.wallet.adb.get_local_height() out = {} # add funding events for chan in self.channels.values(): @@ -860,7 +859,7 @@ class LNWallet(LNWorker): if not self.lnwatcher: continue # lnwatcher not available with --offline (its data is not persisted) funding_txid, funding_height, funding_timestamp = item - tx_height = self.lnwatcher.get_tx_height(funding_txid) + tx_height = self.lnwatcher.adb.get_tx_height(funding_txid) item = { 'channel_id': bh2u(chan.channel_id), 'type': 'channel_opening', @@ -880,7 +879,7 @@ class LNWallet(LNWorker): if item is None: continue closing_txid, closing_height, closing_timestamp = item - tx_height = self.lnwatcher.get_tx_height(closing_txid) + tx_height = self.lnwatcher.adb.get_tx_height(closing_txid) item = { 'channel_id': bh2u(chan.channel_id), 'txid': closing_txid, @@ -912,7 +911,7 @@ class LNWallet(LNWorker): label = 'Reverse swap' if swap.is_reverse else 'Forward swap' delta = current_height - swap.locktime if self.lnwatcher: - tx_height = self.lnwatcher.get_tx_height(swap.funding_txid) + tx_height = self.lnwatcher.adb.get_tx_height(swap.funding_txid) if swap.is_reverse and tx_height.height <= 0: label += ' (%s)' % _('waiting for funding tx confirmation') if not swap.is_reverse and not swap.is_redeemed and swap.spending_txid is None and delta < 0: @@ -985,13 +984,13 @@ class LNWallet(LNWorker): peer = self._peers.get(chan.node_id) if peer: await peer.maybe_update_fee(chan) - conf = self.lnwatcher.get_tx_height(chan.funding_outpoint.txid).conf + conf = self.lnwatcher.adb.get_tx_height(chan.funding_outpoint.txid).conf peer.on_network_update(chan, conf) elif chan.get_state() == ChannelState.FORCE_CLOSING: force_close_tx = chan.force_close_tx() txid = force_close_tx.txid() - height = self.lnwatcher.get_tx_height(txid).height + height = self.lnwatcher.adb.get_tx_height(txid).height if height == TX_HEIGHT_LOCAL: self.logger.info('REBROADCASTING CLOSING TX') await self.network.try_broadcasting(force_close_tx, 'force-close') @@ -1013,7 +1012,7 @@ class LNWallet(LNWorker): temp_channel_id=os.urandom(32)) chan, funding_tx = await asyncio.wait_for(coro, LN_P2P_NETWORK_TIMEOUT) util.trigger_callback('channels_updated', self.wallet) - self.wallet.add_transaction(funding_tx) # save tx as local into the wallet + self.wallet.adb.add_transaction(funding_tx) # save tx as local into the wallet self.wallet.sign_transaction(funding_tx, password) self.wallet.set_label(funding_tx.txid(), _('Open channel')) if funding_tx.is_complete(): @@ -2311,7 +2310,7 @@ class LNWallet(LNWorker): chan.set_state(ChannelState.FORCE_CLOSING) # Add local tx to wallet to also allow manual rebroadcasts. try: - self.wallet.add_transaction(tx) + self.wallet.adb.add_transaction(tx) except UnrelatedTransactionException: pass # this can happen if (~all the balance goes to REMOTE) return tx diff --git a/electrum/network.py b/electrum/network.py index cb0c5e1c1..6a6330f4a 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -348,7 +348,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): if self.config.get('run_watchtower', False): from . import lnwatcher self.local_watchtower = lnwatcher.WatchTower(self) - self.local_watchtower.start_network(self) + self.local_watchtower.adb.start_network(self) asyncio.ensure_future(self.local_watchtower.start_watching()) def has_internet_connection(self) -> bool: diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py index 74b40072c..78ffda660 100644 --- a/electrum/submarine_swaps.py +++ b/electrum/submarine_swaps.py @@ -178,11 +178,11 @@ class SwapManager(Logger): async def _claim_swap(self, swap: SwapData) -> None: assert self.network assert self.lnwatcher - if not self.lnwatcher.is_up_to_date(): + if not self.lnwatcher.adb.is_up_to_date(): return current_height = self.network.get_local_height() delta = current_height - swap.locktime - txos = self.lnwatcher.get_addr_outputs(swap.lockup_address) + txos = self.lnwatcher.adb.get_addr_outputs(swap.lockup_address) for txin in txos.values(): if swap.is_reverse and txin.value_sats() < swap.onchain_amount: self.logger.info('amount too low, we should not reveal the preimage') @@ -200,7 +200,7 @@ class SwapManager(Logger): swap.is_redeemed = True elif spent_height == TX_HEIGHT_LOCAL: if txin.block_height > 0 or self.wallet.config.get('allow_instant_swaps', False): - tx = self.lnwatcher.get_transaction(txin.spent_txid) + tx = self.lnwatcher.adb.get_transaction(txin.spent_txid) self.logger.info(f'broadcasting tx {txin.spent_txid}') await self.network.broadcast_transaction(tx) # already in mempool @@ -230,8 +230,7 @@ class SwapManager(Logger): ) self.sign_tx(tx, swap) self.logger.info(f'adding claim tx {tx.txid()}') - self.wallet.add_transaction(tx) - self.lnwatcher.add_transaction(tx) + self.wallet.adb.add_transaction(tx) def get_claim_fee(self): return self.wallet.config.estimate_fee(136, allow_fallback_to_static_rates=True) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index f2ad4485b..1e8ee4f69 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -135,9 +135,9 @@ class Synchronizer(SynchronizerBase): we don't have the full history of, and requests binary transaction data of any transactions the wallet doesn't have. ''' - def __init__(self, wallet: 'AddressSynchronizer'): - self.wallet = wallet - SynchronizerBase.__init__(self, wallet.network) + def __init__(self, adb: 'AddressSynchronizer'): + self.adb = adb + SynchronizerBase.__init__(self, adb.network) def _reset(self): super()._reset() @@ -146,7 +146,7 @@ class Synchronizer(SynchronizerBase): self._stale_histories = dict() # type: Dict[str, asyncio.Task] def diagnostic_name(self): - return self.wallet.diagnostic_name() + return self.adb.diagnostic_name() def is_up_to_date(self): return (not self.requested_addrs @@ -155,7 +155,7 @@ class Synchronizer(SynchronizerBase): and not self._stale_histories) async def _on_address_status(self, addr, status): - history = self.wallet.db.get_addr_history(addr) + history = self.adb.db.get_addr_history(addr) if history_status(history) == status: return # No point in requesting history twice for the same announced status. @@ -189,7 +189,7 @@ class Synchronizer(SynchronizerBase): else: self._stale_histories.pop(addr, asyncio.Future()).cancel() # Store received history - self.wallet.receive_history_callback(addr, hist, tx_fees) + self.adb.receive_history_callback(addr, hist, tx_fees) # Request transactions we don't have await self._request_missing_txs(hist) @@ -202,7 +202,7 @@ class Synchronizer(SynchronizerBase): for tx_hash, tx_height in hist: if tx_hash in self.requested_tx: continue - tx = self.wallet.db.get_transaction(tx_hash) + tx = self.adb.db.get_transaction(tx_hash) if tx and not isinstance(tx, PartialTransaction): continue # already have complete tx transaction_hashes.append(tx_hash) @@ -231,39 +231,32 @@ class Synchronizer(SynchronizerBase): if tx_hash != tx.txid(): raise SynchronizerFailure(f"received tx does not match expected txid ({tx_hash} != {tx.txid()})") tx_height = self.requested_tx.pop(tx_hash) - self.wallet.receive_tx_callback(tx_hash, tx, tx_height) + self.adb.receive_tx_callback(tx_hash, tx, tx_height) self.logger.info(f"received tx {tx_hash} height: {tx_height} bytes: {len(raw_tx)}") - # callbacks - util.trigger_callback('new_transaction', self.wallet, tx) async def main(self): - self.wallet.set_up_to_date(False) + self.adb.set_up_to_date(False) # request missing txns, if any - for addr in random_shuffled_copy(self.wallet.db.get_history()): - history = self.wallet.db.get_addr_history(addr) + for addr in random_shuffled_copy(self.adb.db.get_history()): + history = self.adb.db.get_addr_history(addr) # Old electrum servers returned ['*'] when all history for the address # was pruned. This no longer happens but may remain in old wallets. if history == ['*']: continue await self._request_missing_txs(history, allow_server_not_finding_tx=True) # add addresses to bootstrap - for addr in random_shuffled_copy(self.wallet.get_addresses()): + for addr in random_shuffled_copy(self.adb.get_addresses()): await self._add_address(addr) # main loop while True: await asyncio.sleep(0.1) - # note: we only generate new HD addresses if the existing ones - # have history that are mined and SPV-verified. This inherently couples - # the Sychronizer and the Verifier. hist_done = self.is_up_to_date() - spv_done = self.wallet.verifier.is_up_to_date() if self.wallet.verifier else True - num_new_addrs = await run_in_thread(self.wallet.synchronize) - up_to_date = hist_done and spv_done and num_new_addrs == 0 + spv_done = self.adb.verifier.is_up_to_date() if self.adb.verifier else True + up_to_date = hist_done and spv_done # see if status changed - if (up_to_date != self.wallet.is_up_to_date() + if (up_to_date != self.adb.is_up_to_date() or up_to_date and self._processed_some_notifications): self._processed_some_notifications = False - self.wallet.set_up_to_date(up_to_date) - util.trigger_callback('wallet_updated', self.wallet) + self.adb.set_up_to_date(up_to_date) class Notifier(SynchronizerBase): diff --git a/electrum/tests/test_commands.py b/electrum/tests/test_commands.py index c16d2ccd6..18295a3af 100644 --- a/electrum/tests/test_commands.py +++ b/electrum/tests/test_commands.py @@ -217,7 +217,7 @@ class TestCommandsTestnet(TestCaseForTestnet): funding_tx = Transaction('0200000000010165806607dd458280cb57bf64a16cf4be85d053145227b98c28932e953076b8e20000000000fdffffff02ac150700000000001600147e3ddfe6232e448a8390f3073c7a3b2044fd17eb102908000000000016001427fbe3707bc57e5bb63d6f15733ec88626d8188a02473044022049ce9efbab88808720aa563e2d9bc40226389ab459c4390ea3e89465665d593502206c1c7c30a2f640af1e463e5107ee4cfc0ee22664cfae3f2606a95303b54cdef80121026269e54d06f7070c1f967eb2874ba60de550dfc327a945c98eb773672d9411fd77181e00') funding_txid = funding_tx.txid() self.assertEqual('ede61d39e501d65ccf34e6300da439419c43393f793bb9a8a4b06b2d0d80a8a0', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) cmds = Commands(config=self.config) tx_str = cmds._run( @@ -245,7 +245,7 @@ class TestCommandsTestnet(TestCaseForTestnet): funding_tx = Transaction('02000000000101f59876b1c65bbe3e182ccc7ea7224fe397bb9b70aadcbbf4f4074c75c8a074840000000000fdffffff021f351f00000000001600144eec851dd980cc36af1f629a32325f511604d6af56732d000000000016001439267bc7f3e3fabeae3bc3f73880de22d8b01ba50247304402207eac5f639806a00878488d58ca651d690292145bca5511531845ae21fab309d102207162708bd344840cc1bacff1092e426eb8484f83f5c068ba4ca579813de324540121020e0798c267ff06ee8b838cd465f3cfa6c843a122a04917364ce000c29ca205cae5f31f00') funding_txid = funding_tx.txid() self.assertEqual('e8e977bd9c857d84ec1b8f154ae2ee5dfa49fffb7688942a586196c1ad15de15', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) cmds = Commands(config=self.config) tx_str = cmds._run( @@ -283,7 +283,7 @@ class TestCommandsTestnet(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 1000000 self.assertEqual('add2535aedcbb5ba79cc2260868bb9e57f328738ca192937f2c92e0e94c19203', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) cmds = Commands(config=self.config) @@ -301,7 +301,7 @@ class TestCommandsTestnet(TestCaseForTestnet): funding_tx = Transaction("02000000000102789e8aa8caa79d87241ff9df0e3fd757a07c85a30195d76e8efced1d57c56b670000000000fdffffff7ee2b6abd52b332f797718ae582f8d3b979b83b1799e0a3bfb2c90c6e070c29e0100000000fdffffff020820000000000000160014c0eb720c93a61615d2d66542d381be8943ca553950c3000000000000160014d7dbd0196a2cbd76420f14a19377096cf6cddb75024730440220485b491ad8d3ce3b4da034a851882da84a06ec9800edff0d3fd6aa42eeba3b440220359ea85d32a05932ac417125e133fa54e54e7e9cd20ebc54b883576b8603fd65012103860f1fbf8a482b9d35d7d4d04be8fb33d856a514117cd8b73e372d36895feec60247304402206c2ca56cc030853fa59b4b3cb293f69a3378ead0f10cb76f640f8c2888773461022079b7055d0f6af6952a48e5b97218015b0723462d667765c142b41bd35e3d9c0a01210359e303f57647094a668d69e8ff0bd46c356d00aa7da6dc533c438e71c057f0793e721f00") funding_txid = funding_tx.txid() - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) cmds = Commands(config=self.config) tx = "02000000000101b9723dfc69af058ef6613539a000d2cd098a2c8a74e802b6d8739db708ba8c9a0100000000fdffffff02a00f00000000000016001429e1fd187f0cac845946ae1b11dc136c536bfc0fe8b2000000000000160014100611bcb3aee7aad176936cf4ed56ade03027aa02473044022063c05e2347f16251922830ccc757231247b3c2970c225f988e9204844a1ab7b802204652d2c4816707e3d3bea2609b83b079001a435bad2a99cc2e730f276d07070c012102ee3f00141178006c78b0b458aab21588388335078c655459afe544211f15aee050721f00" diff --git a/electrum/tests/test_lnpeer.py b/electrum/tests/test_lnpeer.py index 23f367bf2..398ad6f96 100644 --- a/electrum/tests/test_lnpeer.py +++ b/electrum/tests/test_lnpeer.py @@ -97,8 +97,13 @@ class MockBlockchain: return False +class MockADB: + def add_transaction(self, tx): + pass + class MockWallet: receive_requests = {} + adb = MockADB() def set_label(self, x, y): pass @@ -106,9 +111,6 @@ class MockWallet: def save_db(self): pass - def add_transaction(self, tx): - pass - def is_lightning_backup(self): return False diff --git a/electrum/tests/test_wallet.py b/electrum/tests/test_wallet.py index fa49c7c4c..3051d39d6 100644 --- a/electrum/tests/test_wallet.py +++ b/electrum/tests/test_wallet.py @@ -24,7 +24,8 @@ from . import ElectrumTestCase class FakeSynchronizer(object): - def __init__(self): + def __init__(self, db): + self.db = db self.store = [] def add(self, address): @@ -100,18 +101,20 @@ class FakeFxThread: ccy_amount_str = FxThread.ccy_amount_str history_rate = FxThread.history_rate +class FakeADB: + def get_tx_height(self, txid): + # because we use a current timestamp, and history is empty, + # FxThread.history_rate will use spot prices + return TxMinedInfo(height=10, conf=10, timestamp=int(time.time()), header_hash='def') + class FakeWallet: def __init__(self, fiat_value): super().__init__() self.fiat_value = fiat_value self.db = WalletDB("{}", manual_upgrades=True) + self.adb = FakeADB() self.db.transactions = self.db.verified_tx = {'abc':'Tx'} - def get_tx_height(self, txid): - # because we use a current timestamp, and history is empty, - # FxThread.history_rate will use spot prices - return TxMinedInfo(height=10, conf=10, timestamp=int(time.time()), header_hash='def') - default_fiat_value = Abstract_Wallet.default_fiat_value price_at_timestamp = Abstract_Wallet.price_at_timestamp class storage: diff --git a/electrum/tests/test_wallet_vertical.py b/electrum/tests/test_wallet_vertical.py index 130b72e9a..9f3c93806 100644 --- a/electrum/tests/test_wallet_vertical.py +++ b/electrum/tests/test_wallet_vertical.py @@ -719,7 +719,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 1000000 self.assertEqual('add2535aedcbb5ba79cc2260868bb9e57f328738ca192937f2c92e0e94c19203', funding_txid) - wallet1.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet1.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 250000)] @@ -730,7 +730,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet1.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet1.is_mine(wallet1.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet1.is_mine(wallet1.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('010000000001010392c1940e2ec9f2372919ca3887327fe5b98b866022cc79bab5cbed5a53d2ad0000000000feffffff0290d00300000000001976a914ea7804a2c266063572cc009a63dc25dcc0e9d9b588ac285e0b0000000000160014690b59a8140602fb23cc2904ece9cc4daf361052024730440220608a5339ca894592da82119e1e4a1d09335d70a552c683687223b8ed724465e902201b3f0feccf391b1b6257e4b18970ae57d7ca060af2dae519b3690baad2b2a34e0121030faee9b4a25b7db82023ca989192712cdd4cb53d3d9338591c7909e581ae1c0c00000000', str(tx_copy)) @@ -738,8 +738,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('d8d930ae91dce73118c3fffabbdfcfb87f5d91673fb4c7dfd0fbe7cf03bf426b', tx_copy.wtxid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) - wallet1.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # TX_HEIGHT_UNCONF_PARENT but nvm - wallet2.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # TX_HEIGHT_UNCONF_PARENT but nvm + wallet2.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1.get_receiving_address(), 100000)] @@ -750,7 +750,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet2.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet2.is_mine(wallet2.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet2.is_mine(wallet2.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('0100000001e228327e4c0bb80661d258d625f516307e7c127c7f3e2b476a22e89b4dae063c000000006a47304402200c7b06ff882db5ffe9d6e2a3cc2cabf5cd1b4224f1453d1e3dadd13b3d391e2c02201d23fde8482b05837f27d43021d17a1be2ee619dfc889ee80d4c2761e7c7ffb20121030b482838721a38d94847699fed8818b5c5f56500ef72f13489e365b65e5749cffeffffff02a086010000000000160014284520c815980d426264766d8d930013dd20aa6068360200000000001976a914ca4c60999c46c2108326590b125aefd476dcb11888ac00000000', str(tx_copy)) @@ -758,8 +758,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('4ff22c31dd884dedbb905fae275508d1f7bb4948c1c979d2567132848fdff24a', tx_copy.wtxid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) - wallet1.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet level checks self.assertEqual((0, funding_output_value - 250000 - 5000 + 100000, 0), wallet1.get_balance()) @@ -793,7 +793,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 12000000 self.assertEqual('b25cd55687c9e528c2cfd546054f35fb6741f7cf32d600f07dfecdf2e1d42071', funding_txid) - wallet1a.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 370000)] @@ -810,7 +810,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet1a.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet1a.is_mine(wallet1a.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet1a.is_mine(wallet1a.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('01000000017120d4e1f2cdfe7df000d632cff74167fb354f0546d5cfc228e5c98756d55cb201000000fc004730440220751ee3599e59debb8b2aeef61bb5f574f26379cd961caf382d711a507bc632390220598d53e62557c4a5ab8cfb2f8948f37cca06a861714b55c781baf2c3d7a580b501473044022023b55c679397bdf3a04d545adc6193eabc11b3a28850d3d46049a51a30c6732402205dbfdade5620e9072ae4aa7577c5f0fd294f59a6b0064cc7105093c0fe7a6d24014c69522102afb4af9a91264e1c6dce3ebe5312801723270ac0ba8134b7b49129328fcb0f2821030b482838721a38d94847699fed8818b5c5f56500ef72f13489e365b65e5749cf2103e5db7969ae2f2576e6a061bf3bb2db16571e77ffb41e0b27170734359235cbce53aefeffffff0250a50500000000001976a9149cd3dfb0d87a861770ae4e268e74b45335cf00ab88ac2862b1000000000017a9142e517854aa54668128c0e9a3fdd4dec13ad571368700000000', str(tx_copy)) @@ -818,8 +818,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('b508ee1908181e55d2a18a5b2a3904dffbc7cb6b6320bbfba4433578d0f7831e', tx_copy.wtxid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) - wallet1a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 100000)] @@ -830,7 +830,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet2.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet2.is_mine(wallet2.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet2.is_mine(wallet2.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('01000000011e83f7d0783543a4fbbb20636bcbc7fbdf04392a5b8aa1d2551e180819ee08b5000000008a473044022007569f938b5d7a7f529ceccc413363d84325c11d589c1897660bebfd5fd1cc4302203ef71fa42f9b31bb1e816af13b0bf725c493a0405433390c783cd9374713c5880141045f7ba332df2a7b4f5d13f246e307c9174cfa9b8b05f3b83410a3c23ef8958d610be285963d67c7bc1feb082f168fa9877c25999963ff8b56b242a852b23e25edfeffffff02a08601000000000017a914efe136b8275f49bc0f9871eebb9a48d0516229fd87280b0400000000001976a914ca14915184a2662b5d1505ce7142c8ca066c70e288ac00000000', str(tx_copy)) @@ -838,8 +838,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('30f6eec4db5e6b1dfe572dfbc7077661df9a15a2a1b7701612b906d3e1bee3d8', tx_copy.wtxid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) - wallet1a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet level checks self.assertEqual((0, funding_output_value - 370000 - 5000 + 100000, 0), wallet1a.get_balance()) @@ -890,7 +890,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 200000 self.assertEqual('d2bd6c9d332db8e2c50aa521cd50f963fba214645aab2f7556e061a412103e21', funding_txid) - wallet1a.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2a.get_receiving_address(), 165000)] @@ -909,7 +909,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet1a.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet1a.is_mine(wallet1a.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet1a.is_mine(wallet1a.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('01000000000101213e1012a461e056752fab5a6414a2fb63f950cd21a50ac5e2b82d339d6cbdd20000000000feffffff023075000000000000220020cc5e4cc05a76d0648cd0742768556317e9f8cc729aed077134287909035dba88888402000000000017a914187842cea9c15989a51ce7ca889a08b824bf8743870400473044022055cb04fa71c4b5955724d7ac5da90436d75212e7847fc121cb588f54bcdffdc4022064eca1ad639b7c748101059dc69f2893abb3b396bcf9c13f670415076f93ddbf01473044022009230e456724f2a4c10d886c836eeec599b21db0bf078aa8fc8c95868b8920ec02200dfda835a66acb5af50f0d95fcc4b76c6e8f4789a7184c182275b087d1efe556016952210223f815ab09f6bfc8519165c5232947ae89d9d43d678fb3486f3b28382a2371fa210273c529c2c9a99592f2066cebc2172a48991af2b471cb726b9df78c6497ce984e2102aa8fc578b445a1e4257be6b978fcece92980def98dce0e1eb89e7364635ae94153ae00000000', str(tx_copy)) @@ -918,8 +918,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(tx.wtxid(), tx_copy.wtxid()) self.assertEqual(txid, tx_copy.txid()) - wallet1a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 100000)] @@ -938,7 +938,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet2a.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet2a.is_mine(wallet2a.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet2a.is_mine(wallet2a.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('0100000000010149d077be0ee9d52776211e9b4fec1cc02bd53661a04e120a97db8b78d83c9c6e01000000232200204311edae835c7a5aa712c8ca644180f13a3b2f3b420fa879b181474724d6163cfeffffff0260ea00000000000017a9143025051b6b5ccd4baf30dfe2de8aa84f0dd567ed87a086010000000000220020f7b6b30c3073ae2680a7e90c589bbfec5303331be68bbab843eed5d51ba0123904004730440220091ea67af7c1131f51f62fe9596dff0a60c8b45bfc5be675389e193912e8a71802201bf813bbf83933a35ecc46e2d5b0442bd8758fa82e0f8ed16392c10d51f7f7660147304402203ecf75b0316a449dd31bc549251b687dc904194aa551941bd5e8c67603661bdb02204ed58b3a6b070ec138d2127093bebcc6581495818fa611583e1c81cd9b2cf5ee0147522102119f899075a131d4d519d4cdcf5de5907dc2df3b93d54b53ded852211d2b6cb12102fdb0f6775d4b6619257c43343ba5e7807b0164f1eb3f00f2b594ab9e53ab812652ae00000000', str(tx_copy)) @@ -947,8 +947,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(tx.wtxid(), tx_copy.wtxid()) self.assertEqual(txid, tx_copy.txid()) - wallet1a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet level checks self.assertEqual((0, funding_output_value - 165000 - 5000 + 100000, 0), wallet1a.get_balance()) @@ -977,7 +977,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 4000000 self.assertEqual('1137c12de4ce0f5b08de8846ba14c0814351a7f0f31457c8ea51a5d4b3c891a3', funding_txid) - wallet1a.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 1000000)] @@ -988,7 +988,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet1a.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet1a.is_mine(wallet1a.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet1a.is_mine(wallet1a.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('0100000001a391c8b3d4a551eac85714f3f0a7514381c014ba4688de085b0fcee42dc1371101000000910047304402204f1e1821b93b80a2033d3045325fe5c123d7ef54c2050aa356712eb32111ee670220039825c63cfe5879e808bf95aa365967d06a5f4072154955448becb65b8c5926014751210245c90e040d4f9d1fc136b3d4d6b7535bbb5df2bd27666c21977042cc1e05b5b02103c9a6bebfce6294488315e58137a279b2efe09f1f528ecf93b40675ded3cf0e5f52aefeffffff0240420f000000000017a9149573eb50f3136dff141ac304190f41c8becc92ce8738b32d000000000017a914b815d1b430ae9b632e3834ed537f7956325ee2a98700000000', str(tx_copy)) @@ -996,8 +996,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('4649d6b6f8f967a84309de15c6d7403e628aa92ecb4f4d6d21299156fddff9e6', tx_copy.wtxid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) - wallet1a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 300000)] @@ -1008,7 +1008,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual(1, len(tx.inputs())) self.assertEqual(wallet2.txin_type, tx.inputs()[0].script_type) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet2.is_mine(wallet2.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet2.is_mine(wallet2.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('01000000000101e6f9dffd569129216d4d4fcb2ea98a623e40d7c615de0943a867f9f8b6d6494600000000171600149fad840ed174584ee054bd26f3e411817338c5edfeffffff02e09304000000000017a9145ae3933a6e13100f301f23227b98b0bdb5d16b8487d89a0a000000000017a9148ccd0efb2be5b412c4033715f560ed8f446c8ceb8702473044022020a3c46886b72f4ec561c5983a789098202307eae9679ff74fcb0879f65fff1d0220242ec3bfa747c513ef31874670d9c68ad235892588be55564696dd6690952e5a0121038362bbf0b4918b37e9d7c75930ed3a78e3d445724cb5c37ade4a59b6e411fe4e00000000', str(tx_copy)) @@ -1016,8 +1016,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('f70bce6418fc44dcab41cbd466086aea54283821487189e4d15c4d1e2d1e267d', tx_copy.wtxid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) - wallet1a.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1a.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet level checks self.assertEqual((0, funding_output_value - 1000000 - 5000 + 300000, 0), wallet1a.get_balance()) @@ -1083,7 +1083,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 10000000 self.assertEqual('03052739fcfa2ead5f8e57e26021b0c2c546bcd3d74c6e708d5046dc58d90762', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('2N1VTMMFb91SH9SNRAkT7z8otP5eZEct4KL', 2500000)] @@ -1103,7 +1103,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertFalse(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1112,7 +1112,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('212cd9aca604cfb4f2c43161b94e32c1a6bc9773fced360e5d4dda98e84b168d', tx_copy.txid()) self.assertEqual('212cd9aca604cfb4f2c43161b94e32c1a6bc9773fced360e5d4dda98e84b168d', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, funding_output_value - 2500000 - 5000, 0), wallet.get_balance()) # bump tx @@ -1135,7 +1135,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('fa1eba447d88bd84c6ceca16f2767232c488c73a25b51989b2fc6aacaa05d16f', tx_copy.txid()) self.assertEqual('fa1eba447d88bd84c6ceca16f2767232c488c73a25b51989b2fc6aacaa05d16f', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 7484320, 0), wallet.get_balance()) def _bump_fee_p2pkh_when_there_are_two_ismine_outs_one_change_one_recv(self, *, simulate_moving_txs, config): @@ -1149,12 +1149,12 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('02000000000101a3a9d94039c1051102e36b835764b89985602608a3e121c91cb63d67277355080100000000fdffffff0220a10700000000001976a9143decc30f4f7eec45c5775347050b85a43ac7ee0b88ac203c3500000000001600149d91f0053172fab394d277ae27e9fa5c5a4921090247304402207a2b4abe2c4128fe80db297d636b81487feda2ee3c51a95bc670b7b377b09ca402205147bc550dfdff72e9159554c19045111daf6d95f556a4f4dc370c90aa37a3e0012102cccad56b36e7bd1ae44c37d69019d006d8911b43071725d6dcbbdfcade05650313f71c00') funding_txid = funding_tx.txid() self.assertEqual('0d98d8615f7b711beff2efcd4cf6b9f7ecd3b16a53fb9374e6a81d852492674e', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) orig_rbf_tx = Transaction('02000000014e679224851da8e67493fb536ab1d3ecf7b9f64ccdeff2ef1b717b5f61d8980d000000006a4730440220361b332f0488501e0605b9a5385edda762e761c00f95195f308e2baea5e12f9d0220051be1c834f0de69ecf084b0311abf541687436cb34311a002efa4f104a722a3012103d4ce4ba5be0b861d2ee7c715b84ab0e791ccd36530bd8652babae37eda693c39fdffffff02bc020000000000001976a914093107975170d4416bd2dad961414ac0a5c9b3de88ac389d0700000000001976a914ac55156f62fa9085c114fc6496aee5ab153cb22888ac13f71c00') orig_rbf_txid = orig_rbf_tx.txid() self.assertEqual('2bce74c17a2b4c1f57b454604c87006173716e92028de60463182c344f3e2180', orig_rbf_txid) - wallet.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) # bump tx tx = wallet.bump_fee(tx=tx_from_any(orig_rbf_tx.serialize()), new_fee_rate=200) @@ -1177,7 +1177,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('9599a45a566251a5949b4f4b4a5f8d9a34c9e38e1ead9337c8338e34ea5bcd6e', tx_copy.txid()) self.assertEqual('9599a45a566251a5949b4f4b4a5f8d9a34c9e38e1ead9337c8338e34ea5bcd6e', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 461600, 0), wallet.get_balance()) def _bump_fee_p2wpkh_decrease_payment(self, *, simulate_moving_txs, config): @@ -1188,12 +1188,12 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('020000000001022ea8f7940c2e4bca2f34f21ba15a5c8d5e3c93d9c6deb17983412feefa0f1f6d0100000000fdffffff9d4ba5ab41951d506a7fa8272ef999ce3df166fe28f6f885aa791f012a0924cf0000000000fdffffff027485010000000000160014f80e86af4246960a24cd21c275a8e8842973fbcaa0860100000000001600149c6b743752604b98d30f1a5d27a5d5ce8919f4400247304402203bf6dd875a775f356d4bb8c4e295a2cd506338c100767518f2b31fb85db71c1302204dc4ebca5584fc1cc08bd7f7171135d1b67ca6c8812c3723cd332eccaa7b848101210360bdbd16d9ef390fd3e804c421e6f30e6b065ac314f4d2b9a80d2f0682ad1431024730440220126b442d7988c5883ca17c2429f51ce770e3a57895524c8dfe07b539e483019e02200b50feed4f42f0035c9a9ddd044820607281e45e29e41a29233c2b8be6080bac01210245d47d08915816a5ecc934cff1b17e00071ca06172f51d632ba95392e8aad4fdd38a1d00') funding_txid = funding_tx.txid() self.assertEqual('dd0bf0d1563cd588b4c93cc1a9623c051ddb1c4f4581cf8ef43cfd27f031f246', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) orig_rbf_tx = Transaction('0200000000010146f231f027fd3cf48ecf81454f1cdb1d053c62a9c13cc9b488d53c56d1f00bdd0100000000fdffffff02c8af000000000000160014999a95482213a896c72a251b6cc9f3d137b0a45850c3000000000000160014ea76d391236726af7d7a9c10abe600129154eb5a02473044022076d298537b524a926a8fadad0e9ded5868c8f4cf29246048f76f00eb4afa56310220739ad9e0417e97ce03fad98a454b4977972c2805cef37bfa822c6d6c56737c870121024196fb7b766ac987a08b69a5e108feae8513b7e72bc9e47899e27b36100f2af4d48a1d00') orig_rbf_txid = orig_rbf_tx.txid() self.assertEqual('db2f77709a4a04417b3a45838c21470877fe7c182a4f81005a21ce1315c6a5e6', orig_rbf_txid) - wallet.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) # bump tx tx = wallet.bump_fee( @@ -1219,7 +1219,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('6b03c00f47cb145ffb632c3ce54dece29b9a980949ef5c574321f7fc83fa2238', tx_copy.txid()) self.assertEqual('cb1f123231a3de5b02babddb43208f0273cb0df8addd4275583234eb50c7a87d', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 45000, 0), wallet.get_balance()) def _bump_fee_p2wpkh_decrease_payment_batch(self, *, simulate_moving_txs, config): @@ -1230,12 +1230,12 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('020000000001022ea8f7940c2e4bca2f34f21ba15a5c8d5e3c93d9c6deb17983412feefa0f1f6d0100000000fdffffff9d4ba5ab41951d506a7fa8272ef999ce3df166fe28f6f885aa791f012a0924cf0000000000fdffffff027485010000000000160014f80e86af4246960a24cd21c275a8e8842973fbcaa0860100000000001600149c6b743752604b98d30f1a5d27a5d5ce8919f4400247304402203bf6dd875a775f356d4bb8c4e295a2cd506338c100767518f2b31fb85db71c1302204dc4ebca5584fc1cc08bd7f7171135d1b67ca6c8812c3723cd332eccaa7b848101210360bdbd16d9ef390fd3e804c421e6f30e6b065ac314f4d2b9a80d2f0682ad1431024730440220126b442d7988c5883ca17c2429f51ce770e3a57895524c8dfe07b539e483019e02200b50feed4f42f0035c9a9ddd044820607281e45e29e41a29233c2b8be6080bac01210245d47d08915816a5ecc934cff1b17e00071ca06172f51d632ba95392e8aad4fdd38a1d00') funding_txid = funding_tx.txid() self.assertEqual('dd0bf0d1563cd588b4c93cc1a9623c051ddb1c4f4581cf8ef43cfd27f031f246', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) orig_rbf_tx = Transaction('0200000000010146f231f027fd3cf48ecf81454f1cdb1d053c62a9c13cc9b488d53c56d1f00bdd0100000000fdffffff05e803000000000000160014a01f6b2a4bdaf3fb61f2a45e5eac92fcc58daee3881300000000000016001470fcde1ed0159ba5af97baec085ceb857098cedb0c49000000000000160014999a95482213a896c72a251b6cc9f3d137b0a458a86100000000000016001440c234c451fbd9ddf7824d6b8f0dc968a220946450c3000000000000160014ea76d391236726af7d7a9c10abe600129154eb5a024730440220782fb75f2398997ac77cd1b5c0d78f30a66b83df1d2d21c7a06cb03eb592d91702200540cf329c4b21e26aaba79a0c0ebdf465c4befb76a61e4eec924bc482cbf2930121024196fb7b766ac987a08b69a5e108feae8513b7e72bc9e47899e27b36100f2af4a58a1d00') orig_rbf_txid = orig_rbf_tx.txid() self.assertEqual('9e0c7d890053c47c7cd653be984bc4b9a5dab8acf9a6ae075a00113d3077ad74', orig_rbf_txid) - wallet.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) # bump tx tx = wallet.bump_fee( @@ -1261,7 +1261,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('bc86f4f14fea5305b197c02ae7b0d6b04c5f49144d9ad37c9f64ec0ec6d34594', tx_copy.txid()) self.assertEqual('368e4c0429b38e66ac64ac9dbb66145c9f28dfaf2fad60f6424db32c379a12da', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 18700, 0), wallet.get_balance()) @mock.patch.object(wallet.Abstract_Wallet, 'save_db') @@ -1273,7 +1273,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 5000000 self.assertEqual('9973bf8918afa349b63934432386f585613b51034db6c8628b61ba2feb8a3668', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # cpfp tx tx = wallet.cpfp(funding_tx, fee=50000) @@ -1294,7 +1294,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('c064c0dd89077de615f0ff8a626d4a62092c02649ed8266ed4c54302918e87d5', tx_copy.txid()) self.assertEqual('c064c0dd89077de615f0ff8a626d4a62092c02649ed8266ed4c54302918e87d5', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, funding_output_value - 50000, 0), wallet.get_balance()) def _bump_fee_p2wpkh_when_there_is_a_change_address(self, *, simulate_moving_txs, config): @@ -1306,7 +1306,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 10000000 self.assertEqual('52e669a20a26c8b3df5b41e5e6309b18bcde8e1ad7ea17a18f63b6dc6c8becc0', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('2N1VTMMFb91SH9SNRAkT7z8otP5eZEct4KL', 2500000)] @@ -1326,7 +1326,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1335,7 +1335,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('b019bbad45a46ed25365e46e4cae6428fb12ae425977eb93011ffb294cb4977e', tx_copy.txid()) self.assertEqual('ba87313e2b3b42f1cc478843d4d53c72d6e06f6c66ac8cfbe2a59cdac2fd532d', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, funding_output_value - 2500000 - 5000, 0), wallet.get_balance()) # bump tx @@ -1358,7 +1358,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('dad75ab7078b9ce9698a83e7a954c1c38b235d3a4ab79bcb340245e3d9b62b93', tx_copy.txid()) self.assertEqual('05a484c64a094724b1c58a15463c8c772a98f084cc23ee636204ad9c4d9e5b51', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 7490060, 0), wallet.get_balance()) def _bump_fee_when_not_all_inputs_are_ismine_subcase_some_outputs_are_ismine_but_not_all(self, *, simulate_moving_txs, config): @@ -1388,12 +1388,12 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('02000000000101a5883f3de780d260e6f26cf85144403c7744a65a44cd38f9ff45aecadf010c540100000000fdffffff0220a1070000000000160014db44724ac632ae47ee5765954d64796dd5fec72708de3c000000000016001424b32aadb42a89016c4de8f11741c3b29b15f21c02473044022045cc6c1cc875cbb0c0d8fe323dc1de9716e49ed5659741b0fb3dd9a196894066022077c242640071d12ec5763c5870f482a4823d8713e4bd14353dd621ed29a7f96d012102aea8d439a0f79d8b58e8d7bda83009f587e1f3da350adaa484329bf47cd03465fef61c00') funding_txid = funding_tx.txid() self.assertEqual('08557327673db61cc921e1a30826608599b86457836be3021105c13940d9a9a3', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) orig_rbf_tx = Transaction('02000000000102a3a9d94039c1051102e36b835764b89985602608a3e121c91cb63d67277355080000000000fdfffffffd57af9ecf29b1cb42cb91087cf0d1d9fce59a3ca0b25bbfa7d27c07f99870590200000000fdffffff03b2a00700000000001600145dc80fd43eb70fd21a6c4446e3ce043df94f100cb2a00700000000001600147db4ab480b7d2218fba561ff304178f4afcbc972be358900000000001600149d91f0053172fab394d277ae27e9fa5c5a49210902473044022003999f03be8b9e299b2cd3bc7bce05e273d5d9ce24fc47af8754f26a7a13e13f022004e668499a67061789f6ebd2932c969ece74417ae3f2307bf696428bbed4fe36012102a1c9b25b37aa31ccbb2d72caaffce81ec8253020a74017d92bbfc14a832fc9cb0247304402207121358a66c0e716e2ba2be928076736261c691b4fbf89ea8d255449a4f5837b022042cadf9fe1b4f3c03ede3cef6783b42f0ba319f2e0273b624009cd023488c4c1012103a5ba95fb1e0043428ed70680fc17db254b3f701dfccf91e48090aa17c1b7ea40fef61c00') orig_rbf_txid = orig_rbf_tx.txid() self.assertEqual('6057690010ddac93a371629e1f41866400623e13a9cd336d280fc3239086a983', orig_rbf_txid) - wallet.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) # bump tx tx = wallet.bump_fee(tx=tx_from_any(orig_rbf_tx.serialize()), new_fee_rate=70) @@ -1444,12 +1444,12 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('02000000000102c247447533b530cacc3e716aae84621857f04a483252374cbdccfdf8b4ef816b0000000000fdffffffc247447533b530cacc3e716aae84621857f04a483252374cbdccfdf8b4ef816b0100000000fdffffff01d63f0f00000000001600141ef4658adb12ec745a1a1fef6ab8897f04bade060247304402201dc5be86749d8ce33571a6f1a2f8bbfceba89b9dbf2b4683e66c8c17cf7df6090220729199516cb894569ebbe3e998d47fc74030231ed30f110c9babd8a9dc361115012102728251a5f5f55375eef3c14fe59ab0755ba4d5f388619895238033ac9b51aad20247304402202e5d416489c20810e96e931b98a84b0c0c4fc32d2d34d3470b7ee16810246a4c022040f86cf8030d2117d6487bbe6e23d68d6d70408b002d8055de1f33d038d3a0550121039c009e7e7dad07e74ec5a8ac9f9e3499420dd9fe9709995525c714170152512620f71c00') funding_txid = funding_tx.txid() self.assertEqual('59ff0dd3962db651444d9fa6a61311302e47158533714d006e7e024ce45777da', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) orig_rbf_tx = Transaction('02000000000102a3a9d94039c1051102e36b835764b89985602608a3e121c91cb63d67277355080000000000fdffffffda7757e44c027e6e004d71338515472e301113a6a69f4d4451b62d96d30dff590000000000fdffffff02b2a00700000000001600144710cfecc31828d31e68ad101dd022fe091a02b1683f0f00000000001600145fd89e3ff2f32c48d85ac65edb4fdf40112ffdfb02473044022032a64a01b0975b65b0adfee53baa6dfb2ca9917714ae3f3acbe609397cc4912d02207da348511a156f6b6eab9d4c762a421e629784108c61d128ad9409483c1e4819012102a1c9b25b37aa31ccbb2d72caaffce81ec8253020a74017d92bbfc14a832fc9cb024730440220620795910e9d96680a2d869024fc5048cb80d038e60a5b92850de65eb938a49c02201a550737b18eda5f93ce3ce0c5907d7b0a9856bbc3bb81cec14349c5b6c97c08012102999b1062a5acf7071a43fd6f2bd37a4e0f7162182490661949dbeeb7d1b03401eef61c00') orig_rbf_txid = orig_rbf_tx.txid() self.assertEqual('2dcc543035c90c25734c9381096cc2f211ac1c2467e072170bc9e51e4580029b', orig_rbf_txid) - wallet.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) # bump tx tx = wallet.bump_fee(tx=tx_from_any(orig_rbf_tx.serialize()), new_fee_rate=50) @@ -1480,7 +1480,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 10000000 self.assertEqual('52e669a20a26c8b3df5b41e5e6309b18bcde8e1ad7ea17a18f63b6dc6c8becc0', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('tb1q7rl9cxr85962ztnsze089zs8ycv52hk43f3m9n', '!')] @@ -1499,7 +1499,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1508,7 +1508,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('839b4d7ec2480975126ffa0c2a4552a85dd43435b23b375536391943e1f27074', tx_copy.txid()) self.assertEqual('b6fc78267494951771d935ef0338f50b13e62258e54265ad4989fe9ffe98b018', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, funding_output_value - 5000, 0), wallet.get_balance()) # bump tx @@ -1530,7 +1530,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('0787da6829907ede8a322273d19ba47943ac234ad7fd1cb1821f6a0e78fcc003', tx_copy.txid()) self.assertEqual('65760ae60ed5feedfd10a9198b44e483ea64dcfa116d32cf247f45d474ee5ce0', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 9991750, 0), wallet.get_balance()) def _bump_fee_when_user_sends_max(self, *, simulate_moving_txs, config): @@ -1541,7 +1541,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('01000000000102acd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba020000001716001455c7f5e0631d8e6f5f05dddb9f676cec48845532fdffffffd146691ef6a207b682b13da5f2388b1f0d2a2022c8cfb8dc27b65434ec9ec8f701000000171600147b3be8a7ceaf15f57d7df2a3d216bc3c259e3225fdffffff02a9875b000000000017a914ea5a99f83e71d1c1dfc5d0370e9755567fe4a141878096980000000000160014d4ca56fcbad98fb4dcafdc573a75d6a6fffb09b702483045022100dde1ba0c9a2862a65791b8d91295a6603207fb79635935a67890506c214dd96d022046c6616642ef5971103c1db07ac014e63fa3b0e15c5729eacdd3e77fcb7d2086012103a72410f185401bb5b10aaa30989c272b554dc6d53bda6da85a76f662723421af024730440220033d0be8f74e782fbcec2b396647c7715d2356076b442423f23552b617062312022063c95cafdc6d52ccf55c8ee0f9ceb0f57afb41ea9076eb74fe633f59c50c6377012103b96a4954d834fbcfb2bbf8cf7de7dc2b28bc3d661c1557d1fd1db1bfc123a94abb391400') funding_txid = funding_tx.txid() self.assertEqual('52e669a20a26c8b3df5b41e5e6309b18bcde8e1ad7ea17a18f63b6dc6c8becc0', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('2N1VTMMFb91SH9SNRAkT7z8otP5eZEct4KL', '!')] @@ -1561,7 +1561,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1570,7 +1570,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('dc4b622f3225f00edb886011fa02b74630cdbc24cebdd3210d5ea3b68bef5cc9', tx_copy.txid()) self.assertEqual('a00340ee8c90673e05f2cf368601b6bba6a7f0513bd974feb218a326e39b1874', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 0, 0), wallet.get_balance()) # bump tx @@ -1593,7 +1593,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('53824cc67e8fe973b0dfa1b8cc10f4e2441b9b4b2b1eb92576fbba7000c2908a', tx_copy.txid()) self.assertEqual('bb137a5a810bb44d3b1cc77fb4f840e7c8c0f84771f7ce4671c3b1a9f5f93724', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 0, 0), wallet.get_balance()) def _bump_fee_when_new_inputs_need_to_be_added(self, *, simulate_moving_txs, config): @@ -1605,7 +1605,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid1 = funding_tx1.txid() #funding_output_value = 10_000_000 self.assertEqual('52e669a20a26c8b3df5b41e5e6309b18bcde8e1ad7ea17a18f63b6dc6c8becc0', funding_txid1) - wallet.receive_tx_callback(funding_txid1, funding_tx1, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid1, funding_tx1, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('2N1VTMMFb91SH9SNRAkT7z8otP5eZEct4KL', '!')] @@ -1625,7 +1625,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1634,7 +1634,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('dc4b622f3225f00edb886011fa02b74630cdbc24cebdd3210d5ea3b68bef5cc9', tx_copy.txid()) self.assertEqual('a00340ee8c90673e05f2cf368601b6bba6a7f0513bd974feb218a326e39b1874', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 0, 0), wallet.get_balance()) # another incoming transaction (funding_tx2) @@ -1642,7 +1642,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid2 = funding_tx2.txid() #funding_output_value = 5_000_000 self.assertEqual('c36a6e1cd54df108e69574f70bc9b88dc13beddc70cfad9feb7f8f6593255d4a', funding_txid2) - wallet.receive_tx_callback(funding_txid2, funding_tx2, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid2, funding_tx2, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 5_000_000, 0), wallet.get_balance()) # bump tx @@ -1665,7 +1665,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('cdcf070cb8ddd9fbdd6b5cd29f2da395aa1e00640c3123a1a60941f49baddb6c', tx_copy.txid()) self.assertEqual('dceb4ffe55261c861f6f0841ba603fdd18f187df13d2b67c86bfbcb57e6a1870', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 4_990_300, 0), wallet.get_balance()) def _rbf_batching(self, *, simulate_moving_txs, config): @@ -1678,7 +1678,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid1 = funding_tx1.txid() #funding_output_value = 10_000_000 self.assertEqual('52e669a20a26c8b3df5b41e5e6309b18bcde8e1ad7ea17a18f63b6dc6c8becc0', funding_txid1) - wallet.receive_tx_callback(funding_txid1, funding_tx1, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid1, funding_tx1, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('2N1VTMMFb91SH9SNRAkT7z8otP5eZEct4KL', 2_500_000)] @@ -1698,7 +1698,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1707,7 +1707,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('b019bbad45a46ed25365e46e4cae6428fb12ae425977eb93011ffb294cb4977e', tx_copy.txid()) self.assertEqual('ba87313e2b3b42f1cc478843d4d53c72d6e06f6c66ac8cfbe2a59cdac2fd532d', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 7_495_000, 0), wallet.get_balance()) # another incoming transaction (funding_tx2) @@ -1715,7 +1715,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid2 = funding_tx2.txid() #funding_output_value = 5_000_000 self.assertEqual('c36a6e1cd54df108e69574f70bc9b88dc13beddc70cfad9feb7f8f6593255d4a', funding_txid2) - wallet.receive_tx_callback(funding_txid2, funding_tx2, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid2, funding_tx2, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 12_495_000, 0), wallet.get_balance()) # create new tx (output should be batched with existing!) @@ -1737,7 +1737,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1746,7 +1746,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('21112d35fa08b9577bfe46405ad17720d0fa85bcefab0b0a1cffe79b9d6167c4', tx_copy.txid()) self.assertEqual('d49ffdaa832a35d88f3f43bcfb08306347c2342200098f450e41ccb289b26db3', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 9_980_000, 0), wallet.get_balance()) # create new tx (output should be batched with existing!) @@ -1768,7 +1768,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(2, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -1777,7 +1777,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('88791bcd352b50592a5521c15595972b14b5d6be165be2df0e57ea19e588c025', tx_copy.txid()) self.assertEqual('7c5e5bff601e5467036b574b41090681a86de403867dd2b14097920b95e392ed', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 3_900_000, 0), wallet.get_balance()) @mock.patch.object(wallet.Abstract_Wallet, 'save_db') @@ -1789,7 +1789,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 5000000 self.assertEqual('c36a6e1cd54df108e69574f70bc9b88dc13beddc70cfad9feb7f8f6593255d4a', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # cpfp tx tx = wallet.cpfp(funding_tx, fee=50000) @@ -1810,7 +1810,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('6bb0490b29b65c7292f6bb1715982fe4474417b4fbdcf8a4675a0994ce12d156', tx_copy.txid()) self.assertEqual('ce94905afcb396d7bc6de28e4d102dcefc85224abae7df16399b2789f5596db8', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, funding_output_value - 50000, 0), wallet.get_balance()) def test_sweep_p2pk(self): @@ -1858,13 +1858,13 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('0200000000010162ecbac2f0c8662f53505d9410fdc56c84c5642ddbd3358d9a27d564e26731130200000000fdffffff02c0d8a70000000000160014aba1c9faecc3f8882e641583e8734a3f9d01b15ab89ed5000000000016001470afbd97b2dc351bd167f714e294b2fd3b60aedf02483045022100c93449989510e279eb14a0193d5c262ae93034b81376a1f6be259c6080d3ba5d0220536ab394f7c20f301d7ec2ef11be6e7b6d492053dce56458931c1b54218ec0fd012103b8f5a11df8e68cf335848e83a41fdad3c7413dc42148248a3799b58c93919ca010851800') funding_txid = funding_tx.txid() self.assertEqual('d8f8186379085cffc9a3fd747e7a7527435db974d1e2941f52f063be8e4fbdd5', funding_txid) - wallet1.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet1.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # bootstrap wallet2 funding_tx = Transaction('02000000000101d5bd4f8ebe63f0521f94e2d174b95d4327757a7e74fda3c9ff5c08796318f8d80100000000fdffffff025066350000000000160014e3aa82aa2e754507d5585c0b6db06cc0cb4927b7a037a000000000001600140719d12228c61cab793ecd659c09cfe565a845c302483045022100f42e27519bd2379c22951c16b038fa6d49164fe6802854f2fdc7ee87fe31a8bc02204ea71e9324781b44bf7fea2f318caf3bedc5b497cbd1b4313fa71f833500bcb7012103a7853e1ee02a1629c8e870ec694a1420aeb98e6f5d071815257028f62d6f784169851800') funding_txid = funding_tx.txid() self.assertEqual('934f26a72c840293f06c37dc10a358df056dfe245cdf072ae836977c0abc46e5', funding_txid) - wallet2.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet2.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # wallet1 creates tx1, with output back to himself outputs = [PartialTxOutput.from_address_and_value("tb1qhye4wfp26kn0l7ynpn5a4hvt539xc3zf0n76t3", 10_000_000)] @@ -1918,8 +1918,8 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('4a33546eeaed0e25f9e6a58968be92a804a7e70a5332360dabc79f93cd059752', tx.txid()) self.assertEqual('32584f78479a1b6f7aeff4f4d0e0323b67c36ce155d010f9b324b6189b91a540', tx.wtxid()) - wallet1.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) - wallet2.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet1.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet2.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) # wallet level checks self.assertEqual((0, 10995000, 0), wallet1.get_balance()) @@ -1949,7 +1949,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('020000000001018ed0132bb5f35d097572081524cd5e847c895e765b93d5af46b8a8bef621244a0100000000fdffffff0220a1070000000000220020302981db44eb5dad0dab3987134a985b360ae2227a7e7a10cfe8cffd23bacdc9b07912000000000016001442b423aab2aa803f957084832b10359beaa2469002473044022065c5e28900b4706487223357e8539e176552e3560e2081ac18de7c26e8e420ba02202755c7fc8177ff502634104c090e3fd4c4252bfa8566d4eb6605bb9e236e7839012103b63bbf85ec9e5e312e4d7a2b45e690f48b916a442e787a47a6092d6c052394c5966a1900') funding_txid = funding_tx.txid() self.assertEqual('0c2f5981981a6cb69d7b729feceb55be7962b16dc41e8aaf64e5203f7cb604d0', funding_txid) - wallet_2of2.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_2of2.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('tb1qfrlx5pza9vmez6vpx7swt8yp0nmgz3qa7jjkuf', 100_000)] @@ -2010,7 +2010,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 10000000 self.assertEqual('03052739fcfa2ead5f8e57e26021b0c2c546bcd3d74c6e708d5046dc58d90762', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('miFLSDZBXUo4on8PGhTRTAufUn4mP61uoH', '!')] @@ -2030,7 +2030,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertFalse(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -2039,7 +2039,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('200d5173d3113e9cec7a63e885b64836245572d93b6dda4035f3ed44341b6277', tx_copy.txid()) self.assertEqual('200d5173d3113e9cec7a63e885b64836245572d93b6dda4035f3ed44341b6277', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, funding_output_value - 5000, 0), wallet.get_balance()) # cancel tx @@ -2055,7 +2055,7 @@ class TestWalletSending(TestCaseForTestnet): funding_txid = funding_tx.txid() funding_output_value = 10000000 self.assertEqual('52e669a20a26c8b3df5b41e5e6309b18bcde8e1ad7ea17a18f63b6dc6c8becc0', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('2N1VTMMFb91SH9SNRAkT7z8otP5eZEct4KL', 2500000)] @@ -2075,7 +2075,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -2084,7 +2084,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('b019bbad45a46ed25365e46e4cae6428fb12ae425977eb93011ffb294cb4977e', tx_copy.txid()) self.assertEqual('ba87313e2b3b42f1cc478843d4d53c72d6e06f6c66ac8cfbe2a59cdac2fd532d', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, funding_output_value - 2500000 - 5000, 0), wallet.get_balance()) # cancel tx @@ -2109,7 +2109,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('165f82b1440cd3a31c005cec660cf834917a1e0a89011805a620c702840fc46a', tx_copy.txid()) self.assertEqual('a164fff4f4231a09e8745eb27d0fe636c5c291400b8506d932b0bde6ff8cf9ee', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 9992300, 0), wallet.get_balance()) def _dscancel_when_user_sends_max(self, *, simulate_moving_txs, config): @@ -2120,7 +2120,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('01000000000102acd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba020000001716001455c7f5e0631d8e6f5f05dddb9f676cec48845532fdffffffd146691ef6a207b682b13da5f2388b1f0d2a2022c8cfb8dc27b65434ec9ec8f701000000171600147b3be8a7ceaf15f57d7df2a3d216bc3c259e3225fdffffff02a9875b000000000017a914ea5a99f83e71d1c1dfc5d0370e9755567fe4a141878096980000000000160014d4ca56fcbad98fb4dcafdc573a75d6a6fffb09b702483045022100dde1ba0c9a2862a65791b8d91295a6603207fb79635935a67890506c214dd96d022046c6616642ef5971103c1db07ac014e63fa3b0e15c5729eacdd3e77fcb7d2086012103a72410f185401bb5b10aaa30989c272b554dc6d53bda6da85a76f662723421af024730440220033d0be8f74e782fbcec2b396647c7715d2356076b442423f23552b617062312022063c95cafdc6d52ccf55c8ee0f9ceb0f57afb41ea9076eb74fe633f59c50c6377012103b96a4954d834fbcfb2bbf8cf7de7dc2b28bc3d661c1557d1fd1db1bfc123a94abb391400') funding_txid = funding_tx.txid() self.assertEqual('52e669a20a26c8b3df5b41e5e6309b18bcde8e1ad7ea17a18f63b6dc6c8becc0', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx outputs = [PartialTxOutput.from_address_and_value('2N1VTMMFb91SH9SNRAkT7z8otP5eZEct4KL', '!')] @@ -2140,7 +2140,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertTrue(tx.is_segwit()) self.assertEqual(1, len(tx.inputs())) tx_copy = tx_from_any(tx.serialize()) - self.assertTrue(wallet.is_mine(wallet.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet.is_mine(wallet.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) self.assertEqual(tx.wtxid(), tx_copy.wtxid()) @@ -2149,7 +2149,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('dc4b622f3225f00edb886011fa02b74630cdbc24cebdd3210d5ea3b68bef5cc9', tx_copy.txid()) self.assertEqual('a00340ee8c90673e05f2cf368601b6bba6a7f0513bd974feb218a326e39b1874', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 0, 0), wallet.get_balance()) # cancel tx @@ -2174,7 +2174,7 @@ class TestWalletSending(TestCaseForTestnet): self.assertEqual('42e222b8faff6cb7fcb82697e04f7bc88a5ed57293773a57a5e400ce0450203e', tx_copy.txid()) self.assertEqual('0c6511d0c008604948ea68b0f8cb3da00966c5a97a08a220716ff47eecd4922d', tx_copy.wtxid()) - wallet.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual((0, 9992300, 0), wallet.get_balance()) def _dscancel_when_not_all_inputs_are_ismine(self, *, simulate_moving_txs, config): @@ -2204,12 +2204,12 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('02000000000101a5883f3de780d260e6f26cf85144403c7744a65a44cd38f9ff45aecadf010c540100000000fdffffff0220a1070000000000160014db44724ac632ae47ee5765954d64796dd5fec72708de3c000000000016001424b32aadb42a89016c4de8f11741c3b29b15f21c02473044022045cc6c1cc875cbb0c0d8fe323dc1de9716e49ed5659741b0fb3dd9a196894066022077c242640071d12ec5763c5870f482a4823d8713e4bd14353dd621ed29a7f96d012102aea8d439a0f79d8b58e8d7bda83009f587e1f3da350adaa484329bf47cd03465fef61c00') funding_txid = funding_tx.txid() self.assertEqual('08557327673db61cc921e1a30826608599b86457836be3021105c13940d9a9a3', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) orig_rbf_tx = Transaction('02000000000102a3a9d94039c1051102e36b835764b89985602608a3e121c91cb63d67277355080000000000fdfffffffd57af9ecf29b1cb42cb91087cf0d1d9fce59a3ca0b25bbfa7d27c07f99870590200000000fdffffff03b2a00700000000001600145dc80fd43eb70fd21a6c4446e3ce043df94f100cb2a00700000000001600147db4ab480b7d2218fba561ff304178f4afcbc972be358900000000001600149d91f0053172fab394d277ae27e9fa5c5a49210902473044022003999f03be8b9e299b2cd3bc7bce05e273d5d9ce24fc47af8754f26a7a13e13f022004e668499a67061789f6ebd2932c969ece74417ae3f2307bf696428bbed4fe36012102a1c9b25b37aa31ccbb2d72caaffce81ec8253020a74017d92bbfc14a832fc9cb0247304402207121358a66c0e716e2ba2be928076736261c691b4fbf89ea8d255449a4f5837b022042cadf9fe1b4f3c03ede3cef6783b42f0ba319f2e0273b624009cd023488c4c1012103a5ba95fb1e0043428ed70680fc17db254b3f701dfccf91e48090aa17c1b7ea40fef61c00') orig_rbf_txid = orig_rbf_tx.txid() self.assertEqual('6057690010ddac93a371629e1f41866400623e13a9cd336d280fc3239086a983', orig_rbf_txid) - wallet.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(orig_rbf_txid, orig_rbf_tx, TX_HEIGHT_UNCONFIRMED) # bump tx tx = wallet.dscancel(tx=tx_from_any(orig_rbf_tx.serialize()), new_fee_rate=70) @@ -2239,7 +2239,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('0200000000010132515e6aade1b79ec7dd3bac0896d8b32c56195d23d07d48e21659cef24301560100000000fdffffff0112841e000000000016001477fe6d2a27e8860c278d4d2cd90bad716bb9521a02473044022041ed68ef7ef122813ac6a5e996b8284f645c53fbe6823b8e430604a8915a867802203233f5f4d347a687eb19b2aa570829ab12aeeb29a24cc6d6d20b8b3d79e971ae012102bee0ee043817e50ac1bb31132770f7c41e35946ccdcb771750fb9696bdd1b307ad951d00') funding_txid = funding_tx.txid() self.assertEqual('db949963c3787c90a40fb689ffdc3146c27a9874a970d1fd20921afbe79a7aa9', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create tx1 outputs = [PartialTxOutput.from_address_and_value('tb1qsfcddwf7yytl62e3catwv8hpl2hs9e36g2cqxl', 100000)] @@ -2252,7 +2252,7 @@ class TestWalletSending(TestCaseForTestnet): tx.serialize_as_bytes().hex()) self.assertFalse(tx.is_complete()) self.assertTrue(tx.is_segwit()) - wallet.add_transaction(tx) + wallet.adb.add_transaction(tx) # create tx2, which spends from unsigned tx1 outputs = [PartialTxOutput.from_address_and_value('tb1qq0lm9esmq6pfjc3jls7v6twy93lnqcs85wlth3', '!')] @@ -2265,7 +2265,7 @@ class TestWalletSending(TestCaseForTestnet): tx.serialize_as_bytes().hex()) self.assertFalse(tx.is_complete()) self.assertTrue(tx.is_segwit()) - wallet.add_transaction(tx) + wallet.adb.add_transaction(tx) coins = wallet.get_spendable_coins(domain=None) self.assertEqual(1, len(coins)) @@ -2287,7 +2287,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('0200000000010132515e6aade1b79ec7dd3bac0896d8b32c56195d23d07d48e21659cef24301560100000000fdffffff0112841e000000000016001477fe6d2a27e8860c278d4d2cd90bad716bb9521a02473044022041ed68ef7ef122813ac6a5e996b8284f645c53fbe6823b8e430604a8915a867802203233f5f4d347a687eb19b2aa570829ab12aeeb29a24cc6d6d20b8b3d79e971ae012102bee0ee043817e50ac1bb31132770f7c41e35946ccdcb771750fb9696bdd1b307ad951d00') funding_txid = funding_tx.txid() self.assertEqual('db949963c3787c90a40fb689ffdc3146c27a9874a970d1fd20921afbe79a7aa9', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) with self.subTest(msg="funded wallet, zero output value, zero fee"): outputs = [PartialTxOutput.from_address_and_value('tb1qsfcddwf7yytl62e3catwv8hpl2hs9e36g2cqxl', 0)] @@ -2307,7 +2307,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('02000000000101c6edaaf0157020a38de8b07810b22ffe331d5b79c83b680dad24da15c572ae7d0000000000fdffffff026080010000000000160014eabbd791df76eeeaa3ed273cac4e1dde3be295cca0860100000000001600147a65e09bb1da80abfc65d545388a2e61aab7c7210247304402203cb8b2f84ed4fb8de5f51a07b2159bc0d8d474e5dba0f77cc66ab641cf48621b022076fb3c6b4bc76aa06dd29ebe1dd081c063cdbd2949ffcf4ab4bd8bddae6c948b0121029f16b602a6b3c738b66a03dd5133abe810169a377bbc2fdf5c5363f59b8d9bdec3951e00') funding_txid = funding_tx.txid() self.assertEqual('9bed2a210b4154183295bc7b78c8841a3a6116197713f744e5cd95ab0c0c01ce', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # imported wallets do not send change to change addresses by default # (they send it back to the "from address") @@ -2343,7 +2343,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('02000000000101c6edaaf0157020a38de8b07810b22ffe331d5b79c83b680dad24da15c572ae7d0000000000fdffffff026080010000000000160014eabbd791df76eeeaa3ed273cac4e1dde3be295cca0860100000000001600147a65e09bb1da80abfc65d545388a2e61aab7c7210247304402203cb8b2f84ed4fb8de5f51a07b2159bc0d8d474e5dba0f77cc66ab641cf48621b022076fb3c6b4bc76aa06dd29ebe1dd081c063cdbd2949ffcf4ab4bd8bddae6c948b0121029f16b602a6b3c738b66a03dd5133abe810169a377bbc2fdf5c5363f59b8d9bdec3951e00') funding_txid = funding_tx.txid() self.assertEqual('9bed2a210b4154183295bc7b78c8841a3a6116197713f744e5cd95ab0c0c01ce', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # instead of sending the change back to the "from address", we want it sent to another unused address wallet.use_change = True @@ -2378,7 +2378,7 @@ class TestWalletSending(TestCaseForTestnet): funding_tx = Transaction('02000000000101c6edaaf0157020a38de8b07810b22ffe331d5b79c83b680dad24da15c572ae7d0000000000fdffffff026080010000000000160014eabbd791df76eeeaa3ed273cac4e1dde3be295cca0860100000000001600147a65e09bb1da80abfc65d545388a2e61aab7c7210247304402203cb8b2f84ed4fb8de5f51a07b2159bc0d8d474e5dba0f77cc66ab641cf48621b022076fb3c6b4bc76aa06dd29ebe1dd081c063cdbd2949ffcf4ab4bd8bddae6c948b0121029f16b602a6b3c738b66a03dd5133abe810169a377bbc2fdf5c5363f59b8d9bdec3951e00') funding_txid = funding_tx.txid() self.assertEqual('9bed2a210b4154183295bc7b78c8841a3a6116197713f744e5cd95ab0c0c01ce', funding_txid) - wallet.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # add more txs so that all addresses become used _txs = [ ("077c8f7a3b0cbb660192c3e35d01a65694f7b90b10e4c6434713912c44cdbfb7", "02000000000101bc125beec2014e3b89679207116e28bcf5bf85cab63ac2903119c8c21ab84cac0100000000fdffffff02daff000000000000160014caf086bb82f85b35d13b118cd0e052bf5a27eb04814201000000000016001491145275b4c4a4814b733fbd28f2a519a5874bad02473044022008ae14e4f7802639a34e92348db7eef95c9fb5d480d7a110d4b11e7d0c45a0cc02205d29414eebcdc76a07f5e2422ed3e560cd663de4b733a0f9c7b3ad7102a733510121030438b8bdbe8121b6a6508e54247b9d1b0547d9ac94c4d3154afd7d7376fe7ae6b6951e00"), @@ -2387,7 +2387,7 @@ class TestWalletSending(TestCaseForTestnet): for txid, rawtx in _txs: tx = Transaction(rawtx) self.assertEqual(txid, tx.txid()) - wallet.receive_tx_callback(txid, tx, TX_HEIGHT_UNCONFIRMED) + wallet.adb.receive_tx_callback(txid, tx, TX_HEIGHT_UNCONFIRMED) # instead of sending the change back to the "from address", we want it sent to another unused address. # (except all our addresses are used! so we expect change sent back to "from address") @@ -2437,7 +2437,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000101161115f8d8110001aa0883989487f9c7a2faf4451038e4305c7594c5236cbb490100000000fdffffff0338117a0000000000160014c1d7b2ded7017cbde837aab36c1e7b2a3952a57800127a00000000001600143e2ab71fc9738ce16fbe6b3b1c210a68c12db84180969800000000001976a91424b64d981d621c227716b51479faf33019371f4688ac0247304402207a5efc6d970f6a5fdcd1933f68b353b4bf2904743f9f1dc3e9177d8754074baf02202eed707e661493bc450357f12cd7a8b8c610c7cb32ded10516c2933a2ba4346a01210287dce03f594fd889726b13a12970237992a0094a5c9f4eebcca6d50d454b39e9ff121600') funding_txid = funding_tx.txid() self.assertEqual('3b9e0581602f4656cb04633dac13662bc62d9f5191caa15cc901dcc76e430856', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qyw3c0rvn6kk2c688y3dygvckn57525y8qnxt3a', 2500000)] @@ -2453,7 +2453,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff01007401000000015608436ec7dc01c95ca1ca91519f2dc62b6613ac3d6304cb56462f6081059e3b0200000000fdffffff02a02526000000000016001423a3878d93d5acac68e7245a4433169d3d455087585d7200000000001976a914b6a6bbbc4cf9da58786a8acc58291e218d52130688acff121600000100fd000101000000000101161115f8d8110001aa0883989487f9c7a2faf4451038e4305c7594c5236cbb490100000000fdffffff0338117a0000000000160014c1d7b2ded7017cbde837aab36c1e7b2a3952a57800127a00000000001600143e2ab71fc9738ce16fbe6b3b1c210a68c12db84180969800000000001976a91424b64d981d621c227716b51479faf33019371f4688ac0247304402207a5efc6d970f6a5fdcd1933f68b353b4bf2904743f9f1dc3e9177d8754074baf02202eed707e661493bc450357f12cd7a8b8c610c7cb32ded10516c2933a2ba4346a01210287dce03f594fd889726b13a12970237992a0094a5c9f4eebcca6d50d454b39e9ff121600420604e79eb77f2f3f989f5e9d090bc0af50afeb0d5bd6ec916f2022c5629ed022e84a87584ef647d69f073ea314a0f0c110ebe24ad64bc1922a10819ea264fc3f35f50c343ddcab000000000100000000004202048e2004ca581afcc54a5d9b3b47affdf48b3f89e16d5bd96774fc0f167f2d7873bac6264e3d1f1bb96f64d1530a54e026e0bd7d674151d146fba582e79f4ef5e80c343ddcab010000000000000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2484,7 +2484,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a19391400') funding_txid = funding_tx.txid() self.assertEqual('98574bc5f6e75769eb0c93d41453cc1dfbd15c14e63cc3c42f37cdbd08858762', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] @@ -2510,7 +2510,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff010074010000000162878508bdcd372fc4c33ce6145cd1fb1dcc5314d4930ceb6957e7f6c54b57980200000000fdffffff02a0252600000000001600140bf6c540d0218c99511f7c62a49784c88b1870b8585d7200000000001976a9149b308d0b3efd4e3469441bc83c3521afde4072b988ac1c391400000100fd4c0d01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a19391400220602ab053d10eda769fab03ab52ee4f1692730288751369643290a8506e31d1e80f00c233d2ae40000000002000000000022020327295144ffff9943356c2d6625f5e2d6411bab77fd56dce571fda6234324e3d90c233d2ae4010000000000000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2539,7 +2539,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a19391400') funding_txid = funding_tx.txid() self.assertEqual('98574bc5f6e75769eb0c93d41453cc1dfbd15c14e63cc3c42f37cdbd08858762', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] @@ -2555,7 +2555,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff010072010000000162878508bdcd372fc4c33ce6145cd1fb1dcc5314d4930ceb6957e7f6c54b57980300000000fdffffff02a0252600000000001600140bf6c540d0218c99511f7c62a49784c88b1870b8585d72000000000017a914191e7373ae7b4829532220e8f281f4581ed52638871d391400000100fd4c0d01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a193914000104160014105db4dae7e5b8dd4dda7b7d3b1e588c9bf26f192206030dddd5d3c31738ca2d8b25391f648af6a8b08e6961e8f56d4173d03e9db82d3e0c105d19280000000002000000000001001600144f485261505d5cbd33dce02a723776c99240c28722020211ab9359cc49c95b3b9a87ee95fd4edf0cecce862f9e9f86ff63e10880baaba80c105d1928010000000000000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('3f0d188519237478258ad2bf881643618635d11c2bb95512e830fcf2eda3c522', tx_copy.txid()) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2585,7 +2585,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a19391400') funding_txid = funding_tx.txid() self.assertEqual('98574bc5f6e75769eb0c93d41453cc1dfbd15c14e63cc3c42f37cdbd08858762', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] @@ -2611,7 +2611,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff010071010000000162878508bdcd372fc4c33ce6145cd1fb1dcc5314d4930ceb6957e7f6c54b57980100000000fdffffff02a0252600000000001600140bf6c540d0218c99511f7c62a49784c88b1870b8585d7200000000001600145543fe1a1364b806b27a5c9dc92ac9bbf0d42aa31d391400000100fd4c0d01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a19391400220603fd88f32a81e812af0187677fc0e7ac9b7fb63ca68c2d98c2afbcf99aa311ac060cdf758ae500000000020000000000220202ac05f54ef082ac98302d57d532e728653565bd55f46fcf03cacbddb168fd6c760cdf758ae5010000000000000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('ee76c0c6da87f0eb5ab4d1ae05d3942512dcd3c4c42518f9d3619e74400cfc1f', tx_copy.txid()) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2641,7 +2641,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a19391400') funding_txid = funding_tx.txid() self.assertEqual('98574bc5f6e75769eb0c93d41453cc1dfbd15c14e63cc3c42f37cdbd08858762', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] @@ -2657,7 +2657,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff010071010000000162878508bdcd372fc4c33ce6145cd1fb1dcc5314d4930ceb6957e7f6c54b57980100000000fdffffff02a0252600000000001600140bf6c540d0218c99511f7c62a49784c88b1870b8585d7200000000001600145543fe1a1364b806b27a5c9dc92ac9bbf0d42aa31d391400000100fd4c0d01000000000116e9c9dac2651672316aab3b9553257b6942c5f762c5d795776d9cfa504f183c000000000000fdffffff8085019852fada9da84b58dcf753d292dde314a19f5a5527f6588fa2566142130000000000fdffffffa4154a48db20ce538b28722a89c6b578bd5b5d60d6d7b52323976339e39405230000000000fdffffff0b5ef43f843a96364aebd708e25ea1bdcf2c7df7d0d995560b8b1be5f357b64f0100000000fdffffffd41dfe1199c76fdb3f20e9947ea31136d032d9da48c5e45d85c8f440e2351a510100000000fdffffff5bd015d17e4a1837b01c24ebb4a6b394e3da96a85442bd7dc6abddfbf16f20510000000000fdffffff13a3e7f80b1bd46e38f2abc9e2f335c18a4b0af1778133c7f1c3caae9504345c0200000000fdffffffdf4fc1ab21bca69d18544ddb10a913cd952dbc730ab3d236dd9471445ff405680100000000fdffffffe0424d78a30d5e60ac6b26e2274d7d6e7c6b78fe0b49bdc3ac4dd2147c9535750100000000fdffffff7ab6dd6b3c0d44b0fef0fdc9ab0ad6eee23eef799eee29c005d52bc4461998760000000000fdffffff48a77e5053a21acdf4f235ce00c82c9bc1704700f54d217f6a30704711b9737d0000000000fdffffff86918b39c1d9bb6f34d9b082182f73cedd15504331164dc2b186e95c568ccb870000000000fdffffff15a847356cbb44be67f345965bb3f2589e2fec1c9a0ada21fd28225dcc602e8f0100000000fdffffff9a2875297f81dfd3b77426d63f621db350c270cc28c634ad86b9969ee33ac6960000000000fdffffffd6eeb1d1833e00967083d1ab86fa5a2e44355bd613d9277135240fe6f60148a20100000000fdffffffd8a6e5a9b68a65ff88220ca33e36faf6f826ae8c5c8a13fe818a5e63828b68a40100000000fdffffff73aab8471f82092e45ed1b1afeffdb49ea1ec74ce4853f971812f6a72a7e85aa0000000000fdffffffacd6459dec7c3c51048eb112630da756f5d4cb4752b8d39aa325407ae0885cba0000000000fdffffff1eddd5e13bef1aba1ff151762b5860837daa9b39db1eae8ea8227c81a5a1c8ba0000000000fdffffff67a096ff7c343d39e96929798097f6d7a61156bbdb905fbe534ba36f273271d40100000000fdffffff109a671eb7daf6dcd07c0ceff99f2de65864ab36d64fb3a890bab951569adeee0100000000fdffffff4f1bdc64da8056d08f79db7f5348d1de55946e57aa7c8279499c703889b6e0fd0200000000fdffffff042f280000000000001600149c756aa33f4f89418b33872a973274b5445c727b80969800000000001600146c540c1c9f546004539f45318b8d9f4d7b4857ef80969800000000001976a91422a6daa4a7b695c8a2dd104d47c5dc73d655c96f88ac809698000000000017a914a6885437e0762013facbda93894202a0fe86e35f8702473044022075ef5f04d7a63347064938e15a0c74277a79e5c9d32a26e39e8a517a44d565cc022015246790fb5b29c9bf3eded1b95699b1635bcfc6d521886fddf1135ba1b988ec012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe02473044022061aa9b0d9649ffd7259bc54b35f678565dbbe11507d348dd8885522eaf1fa70c02202cc79de09e8e63e8d57fde6ef66c079ddac4d9828e1936a9db833d4c142615c3012103a8f58fc1f5625f18293403104874f2d38c9279f777e512570e4199c7d292b81b0247304402207744dc1ab0bf77c081b58540c4321d090c0a24a32742a361aa55ad86f0c7c24e02201a9b0dd78b63b495ab5a0b5b161c54cb085d70683c90e188bb4dc2e41e142f6601210361fb354f8259abfcbfbdda36b7cb4c3b05a3ca3d68dd391fd8376e920d93870d0247304402204803e423c321acc6c12cb0ebf196d2906842fdfed6de977cc78277052ee5f15002200634670c1dc25e6b1787a65d3e09c8e6bb0340238d90b9d98887e8fd53944e080121031104c60d027123bf8676bcaefaa66c001a0d3d379dc4a9492a567a9e1004452d02473044022050e4b5348d30011a22b6ae8b43921d29249d88ea71b1fbaa2d9c22dfdef58b7002201c5d5e143aa8835454f61b0742226ebf8cd466bcc2cdcb1f77b92e473d3b13190121030496b9d49aa8efece4f619876c60a77d2c0dc846390ecdc5d9acbfa1bb3128760247304402204d6a9b986e1a0e3473e8aef84b3eb7052442a76dfd7631e35377f141496a55490220131ab342853c01e31f111436f8461e28bc95883b871ca0e01b5f57146e79d7bb012103262ffbc88e25296056a3c65c880e3686297e07f360e6b80f1219d65b0900e84e02483045022100c8ffacf92efa1dddef7e858a241af7a80adcc2489bcc325195970733b1f35fac022076f40c26023a228041a9665c5290b9918d06f03b716e4d8f6d47e79121c7eb37012102d9ba7e02d7cd7dd24302f823b3114c99da21549c663f72440dc87e8ba412120902483045022100b55545d84e43d001bbc10a981f184e7d3b98a7ed6689863716cab053b3655a2f0220537eb76a695fbe86bf020b4b6f7ae93b506d778bbd0885f0a61067616a2c8bce0121034a57f2fa2c32c9246691f6a922fb1ebdf1468792bae7eff253a99fc9f2a5023902483045022100f1d4408463dbfe257f9f778d5e9c8cdb97c8b1d395dbd2e180bc08cad306492c022002a024e19e1a406eaa24467f033659de09ab58822987281e28bb6359288337bd012103e91daa18d924eea62011ce596e15b6d683975cf724ea5bf69a8e2022c26fc12f0247304402204f1e12b923872f396e5e1a3aa94b0b2e86b4ce448f4349a017631db26d7dff8a022069899a05de2ad2bbd8e0202c56ab1025a7db9a4998eea70744e3c367d2a7eb71012103b0eee86792dbef1d4a49bc4ea32d197c8c15d27e6e0c5c33e58e409e26d4a39a0247304402201787dacdb92e0df6ad90226649f0e8321287d0bd8fddc536a297dd19b5fc103e022001fe89300a76e5b46d0e3f7e39e0ee26cc83b71d59a2a5da1dd7b13350cd0c07012103afb1e43d7ec6b7999ef0f1093069e68fe1dfe5d73fc6cfb4f7a5022f7098758c02483045022100acc1212bba0fe4fcc6c3ae5cf8e25f221f140c8444d3c08dfc53a93630ac25da02203f12982847244bd9421ef340293f3a38d2ab5d028af60769e46fcc7d81312e7e012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024830450221009c04934102402949484b21899271c3991c007b783b8efc85a3c3d24641ac7c24022006fb1895ce969d08a2cb29413e1a85427c7e85426f7a185108ca44b5a0328cb301210360248db4c7d7f76fe231998d2967104fee04df8d8da34f10101cc5523e82648c02483045022100b11fe61b393fa5dbe18ab98f65c249345b429b13f69ee2d1b1335725b24a0e73022010960cdc5565cbc81885c8ed95142435d3c202dfa5a3dc5f50f3914c106335ce0121029c878610c34c21381cda12f6f36ab88bf60f5f496c1b82c357b8ac448713e7b50247304402200ca080db069c15bbf98e1d4dff68d0aea51227ff5d17a8cf67ceae464c22bbb0022051e7331c0918cbb71bb2cef29ca62411454508a16180b0fb5df94248890840df0121028f0be0cde43ff047edbda42c91c37152449d69789eb812bb2e148e4f22472c0f0247304402201fefe258938a2c481d5a745ef3aa8d9f8124bbe7f1f8c693e2ddce4ddc9a927c02204049e0060889ede8fda975edf896c03782d71ba53feb51b04f5ae5897d7431dc012103946730b480f52a43218a9edce240e8b234790e21df5e96482703d81c3c19d3f1024730440220126a6a56dbe69af78d156626fc9cf41d6aac0c07b8b5f0f8491f68db5e89cb5002207ee6ed6f2f41da256f3c1e79679a3de6cf34cc08b940b82be14aefe7da031a6b012102801bc7170efb82c490e243204d86970f15966aa3bce6a06bef5c09a83a5bfffe024730440220363204a1586d7f13c148295122cbf9ec7939685e3cadab81d6d9e921436d21b7022044626b8c2bd4aa7c167d74bc4e9eb9d0744e29ce0ad906d78e10d6d854f23d170121037fb9c51716739bb4c146857fab5a783372f72a65987d61f3b58c74360f4328dd0247304402207925a4c2a3a6b76e10558717ee28fcb8c6fde161b9dc6382239af9f372ace99902204a58e31ce0b4a4804a42d2224331289311ded2748062c92c8aca769e81417a4c012102e18a8c235b48e41ef98265a8e07fa005d2602b96d585a61ad67168d74e7391cb02483045022100bbfe060479174a8d846b5a897526003eb2220ba307a5fee6e1e8de3e4e8b38fd02206723857301d447f67ac98a5a5c2b80ef6820e98fae213db1720f93d91161803b01210386728e2ac3ecee15f58d0505ee26f86a68f08c702941ffaf2fb7213e5026aea10247304402203a2613ae68f697eb02b5b7d18e3c4236966dac2b3a760e3021197d76e9ad4239022046f9067d3df650fcabbdfd250308c64f90757dec86f0b08813c979a42d06a6ec012102a1d7ee1cb4dc502f899aaafae0a2eb6cbf80d9a1073ae60ddcaabc3b1d1f15df02483045022100ab1bea2cc5388428fd126c7801550208701e21564bd4bd00cfd4407cfafc1acd0220508ee587f080f3c80a5c0b2175b58edd84b755e659e2135b3152044d75ebc4b501210236dd1b7f27a296447d0eb3750e1bdb2d53af50b31a72a45511dc1ec3fe7a684a19391400220603fd88f32a81e812af0187677fc0e7ac9b7fb63ca68c2d98c2afbcf99aa311ac060cdf758ae500000000020000000000220202ac05f54ef082ac98302d57d532e728653565bd55f46fcf03cacbddb168fd6c760cdf758ae5010000000000000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('ee76c0c6da87f0eb5ab4d1ae05d3942512dcd3c4c42518f9d3619e74400cfc1f', tx_copy.txid()) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2701,7 +2701,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400') funding_txid = funding_tx.txid() self.assertEqual('0a08ea26a49e2b80f253796d605b69e2d0403fac64bdf6f7db82ada4b7bb6b62', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] @@ -2716,7 +2716,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff0100740100000001626bbbb7a4ad82dbf7f6bd64ac3f40d0e2695b606d7953f2802b9ea426ea080a0100000000fdffffff02a025260000000000160014e5bddbfee3883729b48fe3385216e64e6035f6eb585d7200000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac1c391400000100fd200101000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(None, tx_copy.txid()) # not segwit self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2739,7 +2739,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400') funding_txid = funding_tx.txid() self.assertEqual('0a08ea26a49e2b80f253796d605b69e2d0403fac64bdf6f7db82ada4b7bb6b62', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] @@ -2754,7 +2754,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff0100720100000001626bbbb7a4ad82dbf7f6bd64ac3f40d0e2695b606d7953f2802b9ea426ea080a0200000000fdffffff02a025260000000000160014e5bddbfee3883729b48fe3385216e64e6035f6eb585d72000000000017a914b808938a8007bc54509cd946944c479c0fa6554f871c391400000100fd200101000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(None, tx_copy.txid()) # redeem script not available self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2777,7 +2777,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400') funding_txid = funding_tx.txid() self.assertEqual('0a08ea26a49e2b80f253796d605b69e2d0403fac64bdf6f7db82ada4b7bb6b62', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] @@ -2792,7 +2792,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff0100710100000001626bbbb7a4ad82dbf7f6bd64ac3f40d0e2695b606d7953f2802b9ea426ea080a0000000000fdffffff02a025260000000000160014e5bddbfee3883729b48fe3385216e64e6035f6eb585d720000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a1c391400000100fd200101000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('f8039bd85279f2b5698f15d47f2e338d067d09af391bd8a19467aa94d03f280c', tx_copy.txid()) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2819,7 +2819,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400') funding_txid = funding_tx.txid() self.assertEqual('0a08ea26a49e2b80f253796d605b69e2d0403fac64bdf6f7db82ada4b7bb6b62', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] @@ -2834,7 +2834,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff0100740100000001626bbbb7a4ad82dbf7f6bd64ac3f40d0e2695b606d7953f2802b9ea426ea080a0100000000fdffffff02a025260000000000160014e5bddbfee3883729b48fe3385216e64e6035f6eb585d7200000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac1c391400000100fd200101000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(None, tx_copy.txid()) # not segwit self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2861,7 +2861,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400') funding_txid = funding_tx.txid() self.assertEqual('0a08ea26a49e2b80f253796d605b69e2d0403fac64bdf6f7db82ada4b7bb6b62', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] @@ -2876,7 +2876,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff0100720100000001626bbbb7a4ad82dbf7f6bd64ac3f40d0e2695b606d7953f2802b9ea426ea080a0200000000fdffffff02a025260000000000160014e5bddbfee3883729b48fe3385216e64e6035f6eb585d72000000000017a914b808938a8007bc54509cd946944c479c0fa6554f871c391400000100fd200101000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(None, tx_copy.txid()) # redeem script not available self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2903,7 +2903,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('01000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400') funding_txid = funding_tx.txid() self.assertEqual('0a08ea26a49e2b80f253796d605b69e2d0403fac64bdf6f7db82ada4b7bb6b62', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] @@ -2918,7 +2918,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff0100710100000001626bbbb7a4ad82dbf7f6bd64ac3f40d0e2695b606d7953f2802b9ea426ea080a0000000000fdffffff02a025260000000000160014e5bddbfee3883729b48fe3385216e64e6035f6eb585d720000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a1c391400000100fd200101000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('f8039bd85279f2b5698f15d47f2e338d067d09af391bd8a19467aa94d03f280c', tx_copy.txid()) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -2958,7 +2958,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('010000000001016207d958dc46508d706e4cd7d3bc46c5c2b02160e2578e5fad2efafc3927050301000000171600147a4fc8cdc1c2cf7abbcd88ef6d880e59269797acfdffffff02809698000000000017a91480c2353f6a7bc3c71e99e062655b19adb3dd2e48870d0916020000000017a914703f83ef20f3a52d908475dcad00c5144164d5a2870247304402203b1a5cb48cadeee14fa6c7bbf2bc581ca63104762ec5c37c703df778884cc5b702203233fa53a2a0bfbd85617c636e415da72214e359282cce409019319d031766c50121021112c01a48cc7ea13cba70493c6bffebb3e805df10ff4611d2bf559d26e25c04bf391400') funding_txid = funding_tx.txid() self.assertEqual('c59913a1fa9b1ef1f6928f0db490be67eeb9d7cb05aa565ee647e859642f3532', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2MuCQQHJNnrXzQzuqfUCfAwAjPqpyEHbgue', 2500000)] @@ -2973,7 +2973,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff010073010000000132352f6459e847e65e56aa05cbd7b9ee67be90b40d8f92f6f11e9bfaa11399c50000000000fdffffff02a02526000000000017a9141567b2578f300fa618ef0033611fd67087aff6d187585d72000000000017a91480c2353f6a7bc3c71e99e062655b19adb3dd2e4887bf391400000100f7010000000001016207d958dc46508d706e4cd7d3bc46c5c2b02160e2578e5fad2efafc3927050301000000171600147a4fc8cdc1c2cf7abbcd88ef6d880e59269797acfdffffff02809698000000000017a91480c2353f6a7bc3c71e99e062655b19adb3dd2e48870d0916020000000017a914703f83ef20f3a52d908475dcad00c5144164d5a2870247304402203b1a5cb48cadeee14fa6c7bbf2bc581ca63104762ec5c37c703df778884cc5b702203233fa53a2a0bfbd85617c636e415da72214e359282cce409019319d031766c50121021112c01a48cc7ea13cba70493c6bffebb3e805df10ff4611d2bf559d26e25c04bf391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(None, tx_copy.txid()) # not segwit self.assertEqual(tx.txid(), tx_copy.txid()) @@ -3024,7 +3024,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('0100000000010118d494d28e5c3bf61566ca0313e22c3b561b888a317d689cc8b47b947adebd440000000017160014aec84704ea8508ddb94a3c6e53f0992d33a2a529fdffffff020f0925000000000017a91409f7aae0265787a02de22839d41e9c927768230287809698000000000017a91400698bd11c38f887f17c99846d9be96321fbf989870247304402206b906369f4075ebcfc149f7429dcfc34e11e1b7bbfc85d1185d5e9c324be0d3702203ce7fc12fd3131920fbcbb733250f05dbf7d03e18a4656232ee69d5c54dd46bd0121028a4b697a37f3f57f6e53f90db077fa9696095b277454fda839c211d640d48649c0391400') funding_txid = funding_tx.txid() self.assertEqual('54356de9e156b85c8516fd4d51bdb68b5513f58b4a6147483978ae254627ee3e', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2N8CtJRwxb2GCaiWWdSHLZHHLoZy53CCyxf', 2500000)] @@ -3039,7 +3039,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff01007301000000013eee274625ae78394847614a8bf513558bb6bd514dfd16855cb856e1e96d35540100000000fdffffff02a02526000000000017a914a4189ef02c95cfe36f8e880c6cb54dff0837b22687585d72000000000017a91400698bd11c38f887f17c99846d9be96321fbf98987c0391400000100f70100000000010118d494d28e5c3bf61566ca0313e22c3b561b888a317d689cc8b47b947adebd440000000017160014aec84704ea8508ddb94a3c6e53f0992d33a2a529fdffffff020f0925000000000017a91409f7aae0265787a02de22839d41e9c927768230287809698000000000017a91400698bd11c38f887f17c99846d9be96321fbf989870247304402206b906369f4075ebcfc149f7429dcfc34e11e1b7bbfc85d1185d5e9c324be0d3702203ce7fc12fd3131920fbcbb733250f05dbf7d03e18a4656232ee69d5c54dd46bd0121028a4b697a37f3f57f6e53f90db077fa9696095b277454fda839c211d640d48649c0391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual(None, tx_copy.txid()) # redeem script not available self.assertEqual(tx.txid(), tx_copy.txid()) @@ -3095,7 +3095,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): funding_tx = Transaction('0100000000010132352f6459e847e65e56aa05cbd7b9ee67be90b40d8f92f6f11e9bfaa11399c501000000171600142e5d579693b2a7679622935df94d9f3c84909b24fdffffff0280969800000000002200203c43ac80d6e3015cf378bf6bac0c22456723d6050bef324ec641e7762440c63c83717d010000000017a91441b772909ad301b41b76f4a3c5058888a7fe6f9a8702483045022100de54689f74b8efcce7fdc91e40761084686003bcd56c886ee97e75a7e803526102204dea51ae5e7d01bd56a8c336c64841f7fe02a8b101fa892e13f2d079bb14e6bf012102024e2f73d632c49f4b821ccd3b6da66b155427b1e5b1c4688cefd5a4b4bfa404c1391400') funding_txid = funding_tx.txid() self.assertEqual('643a7ab9083d0227dd9df314ce56b18d279e6018ff975079dfaab82cd7a66fa3', funding_txid) - wallet_online.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) + wallet_online.adb.receive_tx_callback(funding_txid, funding_tx, TX_HEIGHT_UNCONFIRMED) # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2MyoZVy8T1t94yLmyKu8DP1SmbWvnxbkwRA', 2500000)] @@ -3110,7 +3110,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet): self.assertEqual("70736274ff01007e0100000001a36fa6d72cb8aadf795097ff18609e278db156ce14f39ddd27023d08b97a3a640000000000fdffffff02a02526000000000017a91447ee5a659f6ffb53f7e3afc1681b6415f3c00fa187585d7200000000002200203c43ac80d6e3015cf378bf6bac0c22456723d6050bef324ec641e7762440c63cc1391400000100fd03010100000000010132352f6459e847e65e56aa05cbd7b9ee67be90b40d8f92f6f11e9bfaa11399c501000000171600142e5d579693b2a7679622935df94d9f3c84909b24fdffffff0280969800000000002200203c43ac80d6e3015cf378bf6bac0c22456723d6050bef324ec641e7762440c63c83717d010000000017a91441b772909ad301b41b76f4a3c5058888a7fe6f9a8702483045022100de54689f74b8efcce7fdc91e40761084686003bcd56c886ee97e75a7e803526102204dea51ae5e7d01bd56a8c336c64841f7fe02a8b101fa892e13f2d079bb14e6bf012102024e2f73d632c49f4b821ccd3b6da66b155427b1e5b1c4688cefd5a4b4bfa404c1391400000000", partial_tx) tx_copy = tx_from_any(partial_tx) # simulates moving partial txn between cosigners - self.assertTrue(wallet_online.is_mine(wallet_online.get_txin_address(tx_copy.inputs()[0]))) + self.assertTrue(wallet_online.is_mine(wallet_online.adb.get_txin_address(tx_copy.inputs()[0]))) self.assertEqual('32e946761b4e718c1fa8d044db9e72d5831f6395eb284faf2fb5c4af0743e501', tx_copy.txid()) self.assertEqual(tx.txid(), tx_copy.txid()) @@ -3176,7 +3176,7 @@ class TestWalletHistory_SimpleRandomOrder(TestCaseForTestnet): w = self.create_old_wallet() for i in [2, 12, 7, 9, 11, 10, 16, 6, 17, 1, 13, 15, 5, 8, 4, 0, 14, 18, 3]: tx = Transaction(self.transactions[self.txid_list[i]]) - w.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + w.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(27633300, sum(w.get_balance())) @mock.patch.object(wallet.Abstract_Wallet, 'save_db') @@ -3184,7 +3184,7 @@ class TestWalletHistory_SimpleRandomOrder(TestCaseForTestnet): w = self.create_old_wallet() for i in [9, 18, 2, 0, 13, 3, 1, 11, 4, 17, 7, 14, 12, 15, 10, 8, 5, 6, 16]: tx = Transaction(self.transactions[self.txid_list[i]]) - w.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + w.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(27633300, sum(w.get_balance())) @mock.patch.object(wallet.Abstract_Wallet, 'save_db') @@ -3192,7 +3192,7 @@ class TestWalletHistory_SimpleRandomOrder(TestCaseForTestnet): w = self.create_old_wallet() for i in [5, 8, 17, 0, 9, 10, 12, 3, 15, 18, 2, 11, 14, 7, 16, 1, 4, 6, 13]: tx = Transaction(self.transactions[self.txid_list[i]]) - w.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) + w.adb.receive_tx_callback(tx.txid(), tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(27633300, sum(w.get_balance())) @@ -3225,27 +3225,27 @@ class TestWalletHistory_EvilGapLimit(TestCaseForTestnet): w.db.put('stored_height', 1316917 + 100) for txid in self.transactions: tx = Transaction(self.transactions[txid]) - w.add_transaction(tx) + w.adb.add_transaction(tx) # txn A is an external incoming txn paying to addr (3) and (15) # txn B is an external incoming txn paying to addr (4) and (25) # txn C is an internal transfer txn from addr (25) -- to -- (1) and (25) - w.receive_history_callback('tb1qgh5c088he4d559wl0hw27hrdeg8p2z96pefn4q', # HD index 1 + w.adb.receive_history_callback('tb1qgh5c088he4d559wl0hw27hrdeg8p2z96pefn4q', # HD index 1 [('268fce617aaaa4847835c2212b984d7b7741fdab65de22813288341819bc5656', 1316917)], {}) w.synchronize() - w.receive_history_callback('tb1qm0ejr6g964zt2jux5te7m9ds43n28hdsdz9ull', # HD index 3 + w.adb.receive_history_callback('tb1qm0ejr6g964zt2jux5te7m9ds43n28hdsdz9ull', # HD index 3 [('511a35e240f4c8855de4c548dad932d03611a37e94e9203fdb6fc79911fe1dd4', 1316912)], {}) w.synchronize() - w.receive_history_callback('tb1qj4pnq958k89zcem3342lhcgyz0rnmhkzl6x0cl', # HD index 4 + w.adb.receive_history_callback('tb1qj4pnq958k89zcem3342lhcgyz0rnmhkzl6x0cl', # HD index 4 [('fde0b68938709c4979827caa576e9455ded148537fdb798fd05680da64dc1b4f', 1316917)], {}) w.synchronize() - w.receive_history_callback('tb1q3pyjwpm8wxgvquak240mprfhaydmkawcsl25je', # HD index 15 + w.adb.receive_history_callback('tb1q3pyjwpm8wxgvquak240mprfhaydmkawcsl25je', # HD index 15 [('511a35e240f4c8855de4c548dad932d03611a37e94e9203fdb6fc79911fe1dd4', 1316912)], {}) w.synchronize() - w.receive_history_callback('tb1qr0qjp99ygawul0eylxfqmt7alygye22mj33vej', # HD index 25 + w.adb.receive_history_callback('tb1qr0qjp99ygawul0eylxfqmt7alygye22mj33vej', # HD index 25 [('fde0b68938709c4979827caa576e9455ded148537fdb798fd05680da64dc1b4f', 1316917), ('268fce617aaaa4847835c2212b984d7b7741fdab65de22813288341819bc5656', 1316917)], {}) @@ -3275,7 +3275,7 @@ class TestWalletHistory_DoubleSpend(TestCaseForTestnet): config=self.config)['wallet'] # type: Abstract_Wallet for txid in self.transactions: tx = Transaction(self.transactions[txid]) - w.add_transaction(tx) + w.adb.add_transaction(tx) # txn A is an external incoming txn funding the wallet # txn B is an outgoing payment to an external address # txn C is double-spending txn B, to a wallet address @@ -3289,17 +3289,17 @@ class TestWalletHistory_DoubleSpend(TestCaseForTestnet): config=self.config)['wallet'] # type: Abstract_Wallet # txn A is an external incoming txn funding the wallet txA = Transaction(self.transactions["a3849040f82705151ba12a4389310b58a17b78025d81116a3338595bdefa1625"]) - w.add_transaction(txA) + w.adb.add_transaction(txA) # txn B is an outgoing payment to an external address txB = Transaction(self.transactions["0e2182ead6660790290371516cb0b80afa8baebd30dad42b5e58a24ceea17f1c"]) - w.add_transaction(txB) + w.adb.add_transaction(txB) # now the user manually deletes txn B to attempt the double spend # txn C is double-spending txn B, to a wallet address # rationale1: user might do this with opt-in RBF transactions # rationale2: this might be a local transaction, in which case the GUI even allows it - w.remove_transaction(txB.txid()) + w.adb.remove_transaction(txB.txid()) txC = Transaction(self.transactions["2c9aa33d9c8ec649f9bfb84af027a5414b760be5231fe9eca4a95b9eb3f8a017"]) - w.add_transaction(txC) + w.adb.add_transaction(txC) self.assertEqual(999890, sum(w.get_balance())) @@ -3323,18 +3323,18 @@ class TestImportedWallet(TestCaseForTestnet): path='if_this_exists_mocking_failed_648151893', config=self.config)['wallet'] # type: Abstract_Wallet self.assertEqual(1, len(w.get_addresses())) - w.add_transaction(Transaction(self.transactions["0e350564ee7ed4ffce24a998b538f7f3ebbab6fcb4bb331f8bb6b9d86d86fcd8"])) - w.add_transaction(Transaction(self.transactions["54de13f7ee4853dc1a281c0e7132efb95330f7ceebc1dbce76fdf34c28028f14"])) + w.adb.add_transaction(Transaction(self.transactions["0e350564ee7ed4ffce24a998b538f7f3ebbab6fcb4bb331f8bb6b9d86d86fcd8"])) + w.adb.add_transaction(Transaction(self.transactions["54de13f7ee4853dc1a281c0e7132efb95330f7ceebc1dbce76fdf34c28028f14"])) self.assertEqual(0, sum(w.get_balance())) with self.assertRaises(UnrelatedTransactionException): - w.add_transaction(Transaction(self.transactions["314385a9f24457098de9fe5cb3893cc408b9f66085268457b82050c988c97908"])) + w.adb.add_transaction(Transaction(self.transactions["314385a9f24457098de9fe5cb3893cc408b9f66085268457b82050c988c97908"])) w.import_address("tb1qsyzgpwa0vg2940u5t6l97etuvedr5dejpf9tdy") self.assertEqual(2, len(w.get_addresses())) self.assertEqual(2, len(w.db.transactions)) self.assertEqual(0, sum(w.get_balance())) - w.add_transaction(Transaction(self.transactions["314385a9f24457098de9fe5cb3893cc408b9f66085268457b82050c988c97908"])) + w.adb.add_transaction(Transaction(self.transactions["314385a9f24457098de9fe5cb3893cc408b9f66085268457b82050c988c97908"])) self.assertEqual(3, len(w.db.transactions)) self.assertEqual(0, sum(w.get_balance())) diff --git a/electrum/wallet.py b/electrum/wallet.py index 73eac99db..0062ac141 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -45,6 +45,7 @@ from abc import ABC, abstractmethod import itertools import threading import enum +import asyncio from aiorpcx import timeout_after, TaskTimeout, ignore_after @@ -260,7 +261,7 @@ class TxWalletDetails(NamedTuple): is_lightning_funding_tx: bool -class Abstract_Wallet(AddressSynchronizer, ABC): +class Abstract_Wallet(ABC): """ Wallet classes are created to handle various address generation methods. Completion states (watching-only, single account, no seed, etc) are handled inside classes. @@ -285,7 +286,13 @@ class Abstract_Wallet(AddressSynchronizer, ABC): # load addresses needs to be called before constructor for sanity checks db.load_addresses(self.wallet_type) self.keystore = None # type: Optional[KeyStore] # will be set by load_keystore - AddressSynchronizer.__init__(self, db) + + self.network = None + self.adb = AddressSynchronizer(db) + for addr in self.get_addresses(): + self.adb.add_address(addr) + self.lock = self.adb.lock + self.transaction_lock = self.adb.transaction_lock # saved fields self.use_change = db.get('use_change', True) @@ -309,6 +316,24 @@ class Abstract_Wallet(AddressSynchronizer, ABC): self._coin_price_cache = {} self.lnworker = None + self.load_keystore() + self.test_addresses_sanity() + # callbacks + util.register_callback(self.on_adb_set_up_to_date, ['adb_set_up_to_date']) + util.register_callback(self.on_adb_added_tx, ['adb_added_tx']) + util.register_callback(self.on_adb_added_verified_tx, ['adb_added_verified_tx']) + util.register_callback(self.on_adb_removed_verified_tx, ['adb_removed_verified_tx']) + + async def main(self): + from aiorpcx import run_in_thread + # calls synchronize + while True: + await asyncio.sleep(0.1) + # note: we only generate new HD addresses if the existing ones + # have history that are mined and SPV-verified. This inherently couples + # the Sychronizer and the Verifier. + num_new_addrs = await run_in_thread(self.synchronize) + up_to_date = self.adb.is_up_to_date() and num_new_addrs == 0 def save_db(self): if self.storage: @@ -367,9 +392,13 @@ class Abstract_Wallet(AddressSynchronizer, ABC): async def stop(self): """Stop all networking and save DB to disk.""" + util.unregister_callback(self.on_adb_set_up_to_date) + util.unregister_callback(self.on_adb_added_tx) + util.unregister_callback(self.on_adb_added_verified_tx) + util.unregister_callback(self.on_adb_removed_verified_tx) try: async with ignore_after(5): - await super().stop() + await self.adb.stop() if self.network: if self.lnworker: await self.lnworker.stop() @@ -379,28 +408,56 @@ class Abstract_Wallet(AddressSynchronizer, ABC): self.save_keystore() self.save_db() - def set_up_to_date(self, b): - super().set_up_to_date(b) - if b: self.save_db() + def is_up_to_date(self): + return self.adb.is_up_to_date() + + def on_adb_set_up_to_date(self, event, adb): + if adb != self.adb: + return + if adb.is_up_to_date(): + self.save_db() + util.trigger_callback('wallet_updated', self) + util.trigger_callback('status') + + def on_adb_added_tx(self, event, adb, tx_hash): + if self.adb != adb: + return + tx = self.db.get_transaction(tx_hash) + if not tx: + raise Exception(tx_hash) + self._maybe_set_tx_label_based_on_invoices(tx) + if self.lnworker: + self.lnworker.maybe_add_backup_from_tx(tx) + self._update_request_statuses_touched_by_tx(tx_hash) + util.trigger_callback('new_transaction', self, tx) + + def on_adb_added_verified_tx(self, event, adb, tx_hash): + if adb != self.adb: + return + self._update_request_statuses_touched_by_tx(tx_hash) + tx_mined_status = self.adb.get_tx_height(tx_hash) + util.trigger_callback('verified', self, tx_hash, tx_mined_status) + + def on_adb_removed_verified_tx(self, event, adb, tx_hash): + if adb != self.adb: + return + self._update_request_statuses_touched_by_tx(tx_hash) def clear_history(self): - super().clear_history() + self.adb.clear_history() self.save_db() def start_network(self, network): - AddressSynchronizer.start_network(self, network) + self.network = network if network: + asyncio.run_coroutine_threadsafe(self.main(), self.network.asyncio_loop) + self.adb.start_network(network) if self.lnworker: self.lnworker.start_network(network) # only start gossiping when we already have channels if self.db.get('channels'): self.network.start_gossip() - def load_and_cleanup(self): - self.load_keystore() - self.test_addresses_sanity() - super().load_and_cleanup() - @abstractmethod def load_keystore(self) -> None: pass @@ -450,7 +507,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): self._not_old_change_addresses = [addr for addr in self._not_old_change_addresses if not self.address_is_old(addr)] unused_addrs = [addr for addr in self._not_old_change_addresses - if not self.is_used(addr) and not self.is_address_reserved(addr)] + if not self.adb.is_used(addr) and not self.is_address_reserved(addr)] return unused_addrs def is_deterministic(self) -> bool: @@ -537,6 +594,10 @@ class Abstract_Wallet(AddressSynchronizer, ABC): return False return self.get_address_index(address)[0] == 1 + @abstractmethod + def get_addresses(self) -> Sequence[str]: + pass + @abstractmethod def get_address_index(self, address: str) -> Optional[AddressIndexGeneric]: pass @@ -595,7 +656,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): return bool(self.lnworker.swap_manager.get_swap_by_tx(tx)) if self.lnworker else False def get_tx_info(self, tx: Transaction) -> TxWalletDetails: - tx_wallet_delta = self.get_wallet_delta(tx) + tx_wallet_delta = self.adb.get_wallet_delta(tx) is_relevant = tx_wallet_delta.is_relevant is_any_input_ismine = tx_wallet_delta.is_any_input_ismine is_swap = self.is_swap_tx(tx) @@ -606,11 +667,11 @@ class Abstract_Wallet(AddressSynchronizer, ABC): can_cpfp = False tx_hash = tx.txid() # note: txid can be None! e.g. when called from GUI tx dialog is_lightning_funding_tx = self.is_lightning_funding_tx(tx_hash) - tx_we_already_have_in_db = self.db.get_transaction(tx_hash) + tx_we_already_have_in_db = self.adb.db.get_transaction(tx_hash) can_save_as_local = (is_relevant and tx.txid() is not None and (tx_we_already_have_in_db is None or not tx_we_already_have_in_db.is_complete())) label = '' - tx_mined_status = self.get_tx_height(tx_hash) + tx_mined_status = self.adb.get_tx_height(tx_hash) can_remove = ((tx_mined_status.height in [TX_HEIGHT_FUTURE, TX_HEIGHT_LOCAL]) # otherwise 'height' is unreliable (typically LOCAL): and is_relevant @@ -628,7 +689,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): elif tx_mined_status.height in (TX_HEIGHT_UNCONF_PARENT, TX_HEIGHT_UNCONFIRMED): status = _('Unconfirmed') if fee is None: - fee = self.get_tx_fee(tx_hash) + fee = self.adb.get_tx_fee(tx_hash) if fee and self.network and self.config.has_fee_mempool(): size = tx.estimated_size() fee_per_byte = fee / size @@ -682,11 +743,22 @@ class Abstract_Wallet(AddressSynchronizer, ABC): is_lightning_funding_tx=is_lightning_funding_tx, ) + def get_balance(self, **kwargs): + domain = self.get_addresses() + return self.adb.get_balance(domain, **kwargs) + + def get_addr_balance(self, address): + return self.adb.get_balance([address]) + + def get_utxos(self, **kwargs): + domain = self.get_addresses() + return self.adb.get_utxos(domain=domain, **kwargs) + def get_spendable_coins(self, domain, *, nonlocal_only=False) -> Sequence[PartialTxInput]: confirmed_only = self.config.get('confirmed_only', False) with self._freeze_lock: frozen_addresses = self._frozen_addresses.copy() - utxos = self.get_utxos(domain, + utxos = self.get_utxos( excluded_addresses=frozen_addresses, mature_only=True, confirmed_funding_only=confirmed_only, @@ -714,7 +786,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): frozen_coins = {utxo.prevout.to_str() for utxo in self.get_utxos() if self.is_frozen_coin(utxo)} if not frozen_coins: # shortcut - return self.get_balance(frozen_addresses) + return self.adb.get_balance(frozen_addresses) c1, u1, x1 = self.get_balance() c2, u2, x2 = self.get_balance( excluded_addresses=frozen_addresses, @@ -739,7 +811,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): def balance_at_timestamp(self, domain, target_timestamp): # we assume that get_history returns items ordered by block height # we also assume that block timestamps are monotonic (which is false...!) - h = self.get_history(domain=domain) + h = self.adb.get_history(domain=domain) balance = 0 for hist_item in h: balance = hist_item.balance @@ -749,8 +821,10 @@ class Abstract_Wallet(AddressSynchronizer, ABC): return balance def get_onchain_history(self, *, domain=None): + if domain is None: + domain = self.get_addresses() monotonic_timestamp = 0 - for hist_item in self.get_history(domain=domain): + for hist_item in self.adb.get_history(domain=domain): monotonic_timestamp = max(monotonic_timestamp, (hist_item.tx_mined_status.timestamp or 999_999_999_999)) yield { 'txid': hist_item.txid, @@ -768,7 +842,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): } def create_invoice(self, *, outputs: List[PartialTxOutput], message, pr, URI) -> Invoice: - height = self.get_local_height() + height = self.adb.get_local_height() if pr: return Invoice.from_bip70_payreq(pr, height=height) amount_msat = 0 @@ -801,7 +875,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): key = self.get_key_for_outgoing_invoice(invoice) if not invoice.is_lightning(): if self.is_onchain_invoice_paid(invoice, 0): - self.logger.info("saving invoice... but it is already paid!") + _logger.info("saving invoice... but it is already paid!") with self.transaction_lock: for txout in invoice.get_outputs(): self._invoices_from_scriptpubkey_map[txout.scriptpubkey].add(key) @@ -888,7 +962,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): prevouts_and_values = self.db.get_prevouts_by_scripthash(scripthash) total_received = 0 for prevout, v in prevouts_and_values: - tx_height = self.get_tx_height(prevout.txid.hex()) + tx_height = self.adb.get_tx_height(prevout.txid.hex()) if tx_height.height > 0 and tx_height.height <= invoice.height: continue if tx_height.conf < conf: @@ -917,14 +991,15 @@ class Abstract_Wallet(AddressSynchronizer, ABC): self.set_label(tx_hash, "; ".join(labels)) return bool(labels) - def add_transaction(self, tx, *, allow_unrelated=False): - is_known = bool(self.db.get_transaction(tx.txid())) - tx_was_added = super().add_transaction(tx, allow_unrelated=allow_unrelated) - if tx_was_added and not is_known: - self._maybe_set_tx_label_based_on_invoices(tx) - if self.lnworker: - self.lnworker.maybe_add_backup_from_tx(tx) - return tx_was_added + # fixme: this needs a callback + #def add_transaction(self, tx, *, allow_unrelated=False): + # is_known = bool(self.db.get_transaction(tx.txid())) + # tx_was_added = self.adb.add_transaction(tx, allow_unrelated=allow_unrelated) + # if tx_was_added and not is_known: + # self._maybe_set_tx_label_based_on_invoices(tx) + # if self.lnworker: + # self.lnworker.maybe_add_backup_from_tx(tx) + # return tx_was_added @profiler def get_full_history(self, fx=None, *, onchain_domain=None, include_lightning=True): @@ -1076,13 +1151,11 @@ class Abstract_Wallet(AddressSynchronizer, ABC): end_timestamp = last_item['timestamp'] start_coins = self.get_utxos( - domain=None, block_height=start_height, confirmed_funding_only=True, confirmed_spending_only=True, nonlocal_only=True) end_coins = self.get_utxos( - domain=None, block_height=end_height, confirmed_funding_only=True, confirmed_spending_only=True, @@ -1130,7 +1203,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): } def acquisition_price(self, coins, price_func, ccy): - return Decimal(sum(self.coin_price(coin.prevout.txid.hex(), price_func, ccy, self.get_txin_value(coin)) for coin in coins)) + return Decimal(sum(self.coin_price(coin.prevout.txid.hex(), price_func, ccy, self.adb.get_txin_value(coin)) for coin in coins)) def liquidation_price(self, coins, price_func, timestamp): p = price_func(timestamp) @@ -1204,7 +1277,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): is_final = tx and tx.is_final() if not is_final: extra.append('rbf') - fee = self.get_tx_fee(tx_hash) + fee = self.adb.get_tx_fee(tx_hash) if fee is not None: size = tx.estimated_size() fee_per_byte = fee / size @@ -1238,7 +1311,8 @@ class Abstract_Wallet(AddressSynchronizer, ABC): def get_unconfirmed_base_tx_for_batching(self) -> Optional[Transaction]: candidate = None - for hist_item in self.get_history(): + domain = self.get_addresses() + for hist_item in self.adb.get_history(domain): # tx should not be mined yet if hist_item.tx_mined_status.conf > 0: continue # conservative future proofing of code: only allow known unconfirmed types @@ -1259,7 +1333,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): for output_idx, o in enumerate(tx.outputs())]): continue # all inputs should be is_mine - if not all([self.is_mine(self.get_txin_address(txin)) for txin in tx.inputs()]): + if not all([self.is_mine(self.adb.get_txin_address(txin)) for txin in tx.inputs()]): continue # do not mutate LN funding txs, as that would change their txid if self.is_lightning_funding_tx(txid): @@ -1392,7 +1466,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): if self.config.get('batch_rbf', False) and base_tx: # make sure we don't try to spend change from the tx-to-be-replaced: coins = [c for c in coins if c.prevout.txid.hex() != base_tx.txid()] - is_local = self.get_tx_height(base_tx.txid()).height == TX_HEIGHT_LOCAL + is_local = self.adb.get_tx_height(base_tx.txid()).height == TX_HEIGHT_LOCAL base_tx = PartialTransaction.from_tx(base_tx) base_tx.add_info_from_wallet(self) base_tx_fee = base_tx.get_fee() @@ -1512,7 +1586,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): # we should typically have the funding tx available; # might not have it e.g. while not up_to_date return True - if any(self.is_mine(self.get_txin_address(txin)) + if any(self.is_mine(self.adb.get_txin_address(txin)) for txin in funding_tx.inputs()): return False return True @@ -1565,12 +1639,12 @@ class Abstract_Wallet(AddressSynchronizer, ABC): needs_spv_check = not self.config.get("skipmerklecheck", False) for tx_hash, tx_height in h: if needs_spv_check: - tx_age = self.get_tx_height(tx_hash).conf + tx_age = self.adb.get_tx_height(tx_hash).conf else: if tx_height <= 0: tx_age = 0 else: - tx_age = self.get_local_height() - tx_height + 1 + tx_age = self.adb.get_local_height() - tx_height + 1 max_conf = max(max_conf, tx_age) return max_conf >= req_conf @@ -1835,7 +1909,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): break else: raise CannotCPFP(_("Could not find suitable output")) - coins = self.get_addr_utxo(address) + coins = self.adb.get_addr_utxo(address) item = coins.get(TxOutpoint.from_str(txid+':%d'%i)) if not item: raise CannotCPFP(_("Could not find coins for output")) @@ -1881,7 +1955,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): raise CannotDoubleSpendTx(_("The new fee rate needs to be higher than the old fee rate.")) # grab all ismine inputs inputs = [txin for txin in tx.inputs() - if self.is_mine(self.get_txin_address(txin))] + if self.is_mine(self.adb.get_txin_address(txin))] value = sum([txin.value_sats() for txin in inputs]) # figure out output address old_change_addrs = [o.address for o in tx.outputs() if self.is_mine(o.address)] @@ -1925,7 +1999,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): # in which case we might include a WITNESS_UTXO. address = address or txin.address if txin.witness_utxo is None and txin.is_segwit() and address: - received, spent = self.get_addr_io(address) + received, spent = self.adb.get_addr_io(address) item = received.get(txin.prevout.to_str()) if item: txin_value = item[1] @@ -1949,7 +2023,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): only_der_suffix: bool = False, ignore_network_issues: bool = True, ) -> None: - address = self.get_txin_address(txin) + address = self.adb.get_txin_address(txin) # note: we add input utxos regardless of is_mine self._add_input_utxo_info(txin, ignore_network_issues=ignore_network_issues, address=address) is_mine = self.is_mine(address) @@ -2006,8 +2080,8 @@ class Abstract_Wallet(AddressSynchronizer, ABC): raw_tx = self.network.run_from_another_thread( self.network.get_transaction(tx_hash, timeout=10)) except NetworkException as e: - self.logger.info(f'got network error getting input txn. err: {repr(e)}. txid: {tx_hash}. ' - f'if you are intentionally offline, consider using the --offline flag') + _logger.info(f'got network error getting input txn. err: {repr(e)}. txid: {tx_hash}. ' + f'if you are intentionally offline, consider using the --offline flag') if not ignore_network_issues: raise e else: @@ -2082,7 +2156,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): # TODO we should index receive_requests by id # add lightning requests. (use as key) in_use_by_request = set(self.receive_requests.keys()) - return [addr for addr in domain if not self.is_used(addr) + return [addr for addr in domain if not self.adb.is_used(addr) and addr not in in_use_by_request] @check_returned_address_for_corruption @@ -2105,7 +2179,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): raise Exception("no receiving addresses in wallet?!") choice = domain[0] for addr in domain: - if not self.is_used(addr): + if not self.adb.is_used(addr): if addr not in self.receive_requests.keys(): return addr else: @@ -2128,12 +2202,12 @@ class Abstract_Wallet(AddressSynchronizer, ABC): def get_onchain_request_status(self, r: Invoice) -> Tuple[bool, Optional[int]]: address = r.get_address() amount = int(r.get_amount_sat() or 0) - received, sent = self.get_addr_io(address) + received, sent = self.adb.get_addr_io(address) l = [] for txo, x in received.items(): h, v, is_cb = x txid, n = txo.split(':') - tx_height = self.get_tx_height(txid) + tx_height = self.adb.get_tx_height(txid) height = tx_height.height if height > 0 and height <= r.height: continue @@ -2276,19 +2350,6 @@ class Abstract_Wallet(AddressSynchronizer, ABC): d['bip70'] = x.bip70 return d - def receive_tx_callback(self, tx_hash, tx, tx_height): - super().receive_tx_callback(tx_hash, tx, tx_height) - self._update_request_statuses_touched_by_tx(tx_hash) - - def add_verified_tx(self, tx_hash, info): - super().add_verified_tx(tx_hash, info) - self._update_request_statuses_touched_by_tx(tx_hash) - - def undo_verifications(self, blockchain, above_height): - reorged_txids = super().undo_verifications(blockchain, above_height) - for txid in reorged_txids: - self._update_request_statuses_touched_by_tx(txid) - def _update_request_statuses_touched_by_tx(self, tx_hash: str) -> None: # FIXME in some cases if tx2 replaces unconfirmed tx1 in the mempool, we are not called. # For a given receive request, if tx1 touches it but tx2 does not, then @@ -2310,7 +2371,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): fallback_address = address if self.config.get('bolt11_fallback', True) else None lightning_invoice = self.lnworker.add_request(amount_sat, message, exp_delay, fallback_address) if lightning else None outputs = [ PartialTxOutput.from_address_and_value(address, amount_sat)] if address else [] - height = self.get_local_height() + height = self.adb.get_local_height() req = Invoice( outputs=outputs, message=message, @@ -2502,7 +2563,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC): def price_at_timestamp(self, txid, price_func): """Returns fiat price of bitcoin at the time tx got confirmed.""" - timestamp = self.get_tx_height(txid).timestamp + timestamp = self.adb.get_tx_height(txid).timestamp return price_func(timestamp if timestamp else time.time()) def average_price(self, txid, price_func, ccy) -> Decimal: @@ -2663,6 +2724,9 @@ class Abstract_Wallet(AddressSynchronizer, ABC): else: return allow_send, long_warning, short_warning + def synchronize(self) -> int: + """Returns the number of new addresses we generated.""" + return 0 class Simple_Wallet(Abstract_Wallet): # wallet with a single keystore @@ -2766,7 +2830,7 @@ class Imported_Wallet(Simple_Wallet): continue good_addr.append(address) self.db.add_imported_address(address, {}) - self.add_address(address) + self.adb.add_address(address) if write_to_disk: self.save_db() return good_addr, bad_addr @@ -2787,7 +2851,7 @@ class Imported_Wallet(Simple_Wallet): transactions_new = set() # txs that are not only referred to by address with self.lock: for addr in self.db.get_history(): - details = self.get_address_history(addr) + details = self.adb.get_address_history(addr) if addr == address: for tx_hash, height in details: transactions_to_remove.add(tx_hash) @@ -2797,7 +2861,7 @@ class Imported_Wallet(Simple_Wallet): transactions_to_remove -= transactions_new self.db.remove_addr_history(address) for tx_hash in transactions_to_remove: - self._remove_transaction(tx_hash) + self.adb._remove_transaction(tx_hash) self.set_label(address, None) self.remove_payment_request(address) self.set_frozen_state_of_addresses([address], False) @@ -2831,7 +2895,7 @@ class Imported_Wallet(Simple_Wallet): def calc_unused_change_addresses(self) -> Sequence[str]: with self.lock: unused_addrs = [addr for addr in self.get_change_addresses() - if not self.is_used(addr) and not self.is_address_reserved(addr)] + if not self.adb.is_used(addr) and not self.is_address_reserved(addr)] return unused_addrs def is_mine(self, address) -> bool: @@ -2865,7 +2929,7 @@ class Imported_Wallet(Simple_Wallet): addr = bitcoin.pubkey_to_address(txin_type, pubkey) good_addr.append(addr) self.db.add_imported_address(addr, {'type':txin_type, 'pubkey':pubkey}) - self.add_address(addr) + self.adb.add_address(addr) self.save_keystore() if write_to_disk: self.save_db() @@ -3055,7 +3119,7 @@ class Deterministic_Wallet(Abstract_Wallet): n = self.db.num_change_addresses() if for_change else self.db.num_receiving_addresses() address = self.derive_address(int(for_change), n) self.db.add_change_address(address) if for_change else self.db.add_receiving_address(address) - self.add_address(address) + self.adb.add_address(address) if for_change: # note: if it's actually "old", it will get filtered later self._not_old_change_addresses.append(address) @@ -3081,7 +3145,7 @@ class Deterministic_Wallet(Abstract_Wallet): break return count - @AddressSynchronizer.with_local_height_cached + #@AddressSynchronizer.with_local_height_cached FIXME def synchronize(self): count = 0 with self.lock: