Commit Graph

727 Commits

Author SHA1 Message Date
ThomasV 8dca907891 get_tx_parent: populate cache in chronological order 2023-04-26 18:29:46 +02:00
SomberNight ad5f95cb87 util.profiler: add "min_threshold" arg 2023-04-26 14:49:37 +00:00
SomberNight bf41675d4c qml: invoice/request list: flip sort order: newest on top
to be consistent with the History, and with other GUIs

(the model is the easiest place to do it. QSortFilterProxyModel/etc looks overkill)
2023-04-24 15:33:10 +00:00
SomberNight 612d3493df fix flake8-bugbear B017
B017 `assertRaises(Exception)` and `pytest.raises(Exception)` should be considered evil. They can lead to your test passing even if the code being tested is never executed due to a typo. Assert for a more specific exception (builtin or custom), or use `assertRaisesRegex` (if using `assertRaises`), or add the `match` keyword argument (if using `pytest.raises`), or use the context manager form with a target.
2023-04-24 12:58:30 +00:00
SomberNight 312f2641e7 don't use bare except
use "except Exception", or if really needed explicitly "except BaseException"
2023-04-24 12:58:01 +00:00
SomberNight 6b0db411ae wallet: save_db immediately after init_lightning() generates keys
Had a crash shortly after enabling lightning and the LN keys were lost...
Though note that opening a channel triggers wallet.save_db(), so I think
nothing of real value is at risk without this change.
2023-04-23 00:06:45 +00:00
SomberNight dd93ebda4d wallet: _bump_fee_through_decreasing_payment: handle too high fee_rate
fixes https://github.com/spesmilo/electrum/issues/8316
2023-04-19 21:55:07 +00:00
SomberNight 89b75f95d0 wallet.set_broadcasting: fix incorrect type-hint and rename arg 2023-04-19 16:29:54 +00:00
SomberNight 6ac3f84095 wallet/lnworker/etc: add sanity checks to start_network methods
related: https://github.com/spesmilo/electrum/issues/8301
2023-04-17 16:56:57 +00:00
Sander van Grieken 99a78d4d6c wallet: don't restart wallet/network when init_lightning 2023-04-17 15:00:53 +02:00
SomberNight c9cc56b687 transaction: don't include WIT_UTXO for non-segwit txins
probably regression from d3227d7489

fixes https://github.com/spesmilo/electrum/issues/8305
2023-04-16 21:14:15 +00:00
SomberNight 488dc4871e wallet: is_up_to_date() to return False if taskgroup stopped
If the taskgroup died unexpectedly, this will result in the GUI
showing we are in the "synchronizing" state instead of the green orb.
Being stuck in "synchronizing" provides at least *some* feedback to
the user that something is wrong.

see https://github.com/spesmilo/electrum/issues/8301
2023-04-13 14:42:06 +00:00
SomberNight e748345be0 addr_sync: change return type of get_address_history to dict from list 2023-04-05 13:09:47 +00:00
ThomasV 03f0d632af wallet.sign_transaction: return tx if signed by swap manager
This fixes bumping swap fee in the qml GUI, because it expects
the value returned by this method to be None if the transaction
could not be signed.
2023-04-05 14:57:58 +02:00
SomberNight db4943ff86 wallet.get_full_history: more consistent sort order
before:
```
>>> [print(wallet.get_tx_status(txid, wallet.adb.get_tx_height(txid))) for txid in list(wallet.get_full_history())[-10:]]
(7, '2023-04-04 16:13')
(7, '2023-04-04 16:13')
(7, '2023-04-04 16:13')
(7, '2023-04-04 16:13')
(0, 'Unconfirmed [20. sat/b, 0.00 MB]')
(2, 'in 2 blocks')
(3, 'Local [180.4 sat/b]')
(3, 'Local [180.2 sat/b]')
(2, 'in 2016 blocks')
(0, 'Unconfirmed [180. sat/b, 0.00 MB]')
```

after:
```
>>> [print(wallet.get_tx_status(txid, wallet.adb.get_tx_height(txid))) for txid in list(wallet.get_full_history())[-10:]]
(7, '2023-04-04 16:13')
(7, '2023-04-04 16:13')
(7, '2023-04-04 16:13')
(7, '2023-04-04 16:13')
(0, 'Unconfirmed [20. sat/b, 0.00 MB]')
(0, 'Unconfirmed [180. sat/b, 0.00 MB]')
(2, 'in 2016 blocks')
(2, 'in 2 blocks')
(3, 'Local [180.4 sat/b]')
(3, 'Local [180.2 sat/b]')
```
2023-04-04 18:32:53 +00:00
ThomasV f04e2e2e6f Add an extra state for invoices where our tx has been broadcast
successfully, but it is not in our history yet.

(follow-up 159646fe54)
2023-04-04 19:31:25 +02:00
ThomasV 159646fe54 Set status of onchain invoices to PR_INFLIGHT while tx is being broadcast 2023-04-04 18:22:30 +02:00
ThomasV 56e685feaa invoices: Use the same base method to export invoices and requests.
This fixes an inconsistency where the 'expiration' field was
relative for invoices, and absolute timestamp for requests.

This in turn fixes QML the timer refreshing the request list.

In order to prevent any API using that field from being silently
broken, the 'expiration' field is renamed as 'expiry'.
2023-03-31 14:55:08 +02:00
Sander van Grieken d99a220c66 qml: add new 'removed_transaction' callback in wallet.py, hook up callback in qewallet and
emit balanceChanged events for add_transaction and remove_transaction
2023-03-31 12:32:02 +02:00
SomberNight 9df5f55a1f password unification: bugfix, now passes test cases
fixes https://github.com/spesmilo/electrum/issues/8259

note that technically this is an API change for
- wallet.check_password
- wallet.update_password
- storage.check_password
2023-03-20 20:07:53 +00:00
SomberNight 11f06d860e tests: add more tests for daemon.update_password_for_directory 2023-03-20 20:05:31 +00:00
SomberNight b8d4ccd432 wallet: fix get_locktime_for_new_transaction for lagging server
Merchant reported that 0.5% of txs they make are rejected
by the connected server due to the locktime being in the future.

fixes https://github.com/spesmilo/electrum/issues/8245
2023-03-20 15:50:38 +00:00
ThomasV 8cc610298b QML: auto-delete expired requests. Add action to Qt menu 2023-03-18 09:59:18 +01:00
SomberNight 55da7276d3 qt export history/privkeys: put wallet name in path
closes https://github.com/spesmilo/electrum/issues/8255
2023-03-17 15:49:58 +00:00
ThomasV 503776c0de move fiat columns show/hide settings from settings_dialog to tab toolbars 2023-03-12 13:30:11 +01:00
SomberNight d83863cc52 qt tx dialog: add checkbox "Download input data"
If checked, we download prev (parent) txs from the network, asynchronously.
This allows calculating the fee and showing "input addresses".

We could also SPV-verify the tx, to fill in missing tx_mined_status
(block height, blockhash, timestamp, short ids), but this is not done currently.
Note that there is no clean way to do this with electrum protocol 1.4:
`blockchain.transaction.get_merkle(tx_hash, height)` requires knowledge of the block height.

Loosely based on https://github.com/Electron-Cash/Electron-Cash/commit/6112fe0e51e48e9ceaaecf47a014e6f4a7b41703
2023-03-12 00:24:31 +00:00
SomberNight 81772faf6c wallet: add_input_info to no longer do network requests
- wallet.add_input_info() previously had a fallback to download parent
  prev txs from the network (after a lookup in wallet.db failed).
  wallet.add_input_info() is not async, so the network request cannot
  be done cleanly there and was really just a hack.
- tx.add_info_from_wallet() calls wallet.add_input_info() on each txin,
  in which case these network requests were done sequentially, not concurrently
- the network part of wallet.add_input_info() is now split out into new method:
  txin.add_info_from_network()
- in addition to tx.add_info_from_wallet(), there is now also tx.add_info_from_network()
  - callers of old tx.add_info_from_wallet() should now called either
    - tx.add_info_from_wallet(), then tx.add_info_from_network(), preferably in that order
    - tx.add_info_from_wallet() alone is sufficient if the tx is complete,
      or typically when not in a signing context
- callers of wallet.bump_fee and wallet.dscancel are now expected to have already
  called tx.add_info_from_network(), as it cannot be done in a non-async context
  (but for the common case of all-inputs-are-ismine, bump_fee/dscancel should work regardless)
- PartialTxInput.utxo was moved to the baseclass, TxInput.utxo
2023-03-12 00:21:57 +00:00
SomberNight 7746cc8e60 bip32: (trivial) rename method strpath_to_intpath, for symmetry
Required a much higher mental load to parse the name "convert_bip32_path_to_list_of_uint32"
than to parse "convert_bip32_strpath_to_intpath".
And we already have the ~inverse: "convert_bip32_intpath_to_strpath".
2023-03-10 14:23:17 +00:00
SomberNight 7584ba00ce wallet: kill negative conf numbers for TxMinedInfo
fixes https://github.com/spesmilo/electrum/issues/8240

#8240 was triggering an AssertionError in wallet.get_invoice_status,
as code there was assuming conf >= 0. To trigger, force-close
a LN channel, and while the sweep is waiting on the CSV, try to
make a payment in the Send tab to the ismine change address used
for the sweep in the future_tx. (order of events can also be reversed)
2023-03-09 14:59:08 +00:00
ThomasV 364510906f Fix edge case of batch_rbf, where we need to spend outputs from the base tx 2023-03-08 15:03:05 +01:00
ThomasV 3253e4904b Add rbf_merge_txid to PartialTransaction, instead of calling
get_unconfirmed_base_tx_for_batching a second time from GUI.
2023-03-08 12:38:41 +01:00
ThomasV a5c7cc65ee make_unsigned_transaction: call get_unconfirmed_base_tx_for_batching lazily 2023-03-07 18:13:27 +01:00
ThomasV 74718e9085 confirm_tx_dialog: separate messages from warnings. add warnings about tx batching and spending unconfirmed coins 2023-03-06 19:25:46 +01:00
ThomasV 2f6d60c715 Move transaction related settings into transaction editor.
That way, users can see the effects settings directly on their transaction.
This changes the API of make_tx:
 - get_coins is called inside make_tx, so that inputs can be changed dynamically
 - make_tx takes an optional parameter: unconfirmed_only, passed to get_coins
 - ConfirmTxDialog detects if we can pay by disabling confirmed_only or lowering fee
2023-03-05 10:17:03 +01:00
ThomasV 2ed71579c3 privacy analysis: detect address reuse
add tx position to get_addr_io
2023-03-04 08:53:49 +01:00
ThomasV 798cd607b5 Merge pull request #8230 from SomberNight/202302_osd_tx
output script descriptors, part 1: change API of transaction.py
2023-03-04 08:48:56 +01:00
SomberNight a80bef8421 follow-up descriptor.py: small clean-up 2023-03-03 16:40:45 +00:00
SomberNight 31f457c242 wallet.get_script_desc_for_addr: use xpub instead of derived pubkey
also put key origin info into descriptor, if available
2023-03-03 16:40:38 +00:00
SomberNight 36986a9881 transaction.py: set txio.{witness,redeem}|script based on descriptor 2023-03-03 16:40:15 +00:00
SomberNight 0647a2cf9f transaction.py: rm PartialTxInput.{num_sig, script_type} 2023-03-03 16:40:12 +00:00
SomberNight ec889b8c3f wallet: fix import_requests, and mention quirk re preimages 2023-03-03 16:35:34 +00:00
SomberNight 81bd6f7d1b follow-up invoice changes: fix "Add lightning invoice to bitcoin URIs"
follow-up 719b468eee
2023-03-03 16:14:35 +00:00
SomberNight a1a1fae4cc invoices.py: small clean-up 2023-03-03 16:02:19 +00:00
SomberNight 5673f08750 follow-up invoice changes: fix wallet.get_bolt11_inv if amt is None
follow-up 719b468eee

Traceback (most recent call last):
  File "...\electrum\electrum\gui\qt\request_list.py", line 111, in item_changed
    self.receive_tab.update_current_request()
  File "...\electrum\electrum\gui\qt\receive_tab.py", line 227, in update_current_request
    lnaddr = self.wallet.get_bolt11_invoice(req) if not help_texts.ln_is_error else ''
  File "...\electrum\electrum\wallet.py", line 2515, in get_bolt11_invoice
    amount_msat = req.amount_msat if req.amount_msat > 0 else None
TypeError: '>' not supported between instances of 'NoneType' and 'int'
2023-03-03 16:02:12 +00:00
ThomasV e24c4004fa change invoice type hints following 719b468eee 2023-03-03 10:08:34 +01:00
ThomasV 9f5c5f92b3 follow-up 719b468eee 2023-03-03 10:04:37 +01:00
SomberNight f1f39f0e82 descriptors: wallet/transaction: construct intermediate osd 2023-03-01 17:53:52 +00:00
SomberNight d11237d6a1 lnworker: start watching already redeemed chans if txs are missing
This fixes a bug where if one runs `wallet.clear_history()` they would see exceptions later:
```
Traceback (most recent call last):
  File "/home/user/wspace/electrum/electrum/gui/qt/main_window.py", line 866, in timer_actions
	self.update_wallet()
  File "/home/user/wspace/electrum/electrum/gui/qt/main_window.py", line 1021, in update_wallet
	self.update_tabs()
  File "/home/user/wspace/electrum/electrum/gui/qt/main_window.py", line 1033, in update_tabs
	self.utxo_list.update()
  File "/home/user/wspace/electrum/electrum/gui/qt/utxo_list.py", line 103, in update
	self.refresh_row(name, idx)
  File "/home/user/wspace/electrum/electrum/gui/qt/utxo_list.py", line 124, in refresh_row
	parents = self.wallet.get_tx_parents(txid)
  File "/home/user/wspace/electrum/electrum/wallet.py", line 885, in get_tx_parents
	result.update(self.get_tx_parents(_txid))
  File "/home/user/wspace/electrum/electrum/wallet.py", line 881, in get_tx_parents
	for i, txin in enumerate(tx.inputs()):
AttributeError: 'NoneType' object has no attribute 'inputs'
```
This is related to the privacy analysis, which assumes that for each tx item in the history list
we should have the raw tx in the db. This is no longer true after wallet.clear_history(), if
the wallet has certain LN channels. E.g. an already redeemed channel that was local-force-closed,
as that closing tx is not related to the wallet directly.

In commit 3541ecb576, we decided not to watch already redeemed channels.
This is potentially good for e.g. privacy, as the server would otherwise see us subscribe to that chan.
However it means that after running wallet.clear_history() txs related to the channel but not to the
wallet won't be re-downloaded.

Instead, now if there are missing txs for a redeemed channel, we start watching it, hence the
synchronizer will re-downloaded the txs.
2023-03-01 16:20:42 +00:00
ThomasV 4ad9caddab Merge pull request #8231 from spesmilo/fix_8213
Refresh bolt11 routing hints when channel liquidity changes:
2023-03-01 11:35:34 +01:00
ThomasV 33c7ecbaf8 utxo details: show list of parents as a tree 2023-03-01 11:07:12 +01:00