1
0
Commit Graph

16582 Commits

Author SHA1 Message Date
ThomasV
4d84769096 Qt: Show notification instead of popup if a lightning payment fails. 2023-07-24 17:56:20 +02:00
ThomasV
49b5bf99ae fw_info: use hex value of payment_key, as this is persisted 2023-07-24 17:22:44 +02:00
ThomasV
3bb5ebf137 simplify check_mpp_status
(the distinction that was between is_accepted and is_expired does
not seem to be useful)
2023-07-24 16:43:06 +02:00
ThomasV
141cd524bc lnpeer: do not run maybe_fulfill_htlc more than once, if it
triggered a payment forwarding.

Final onions may trigger a payment forwarding, through the callback
returned by maybe_fulfill_htlc. In that case, we should not fail the
HTLC later; doing so might result in fund loss.

Remove test_simple_payment_with_hold_invoice_timing_out: once we
have accepted to forward a payment HTLC with a hold invoice, we
do not want to time it out, for the same reason.
2023-07-24 12:44:56 +02:00
ThomasV
1296d3361d use payment_secret instead of payment_hash 2023-07-22 09:35:00 +02:00
ThomasV
8630030bd9 Restrict exception type in trampoline_forwarding_failures (follow-up 017186d107) 2023-07-21 19:35:27 +02:00
3rd Iteration
0e5cb19408 Add Vendor/Device IDs for CH340 based DIY Jade devices. (#8546)
* Add Vendor/Device IDs for CH340 based DIY Jade devices.

* Add device descriptions to hardwareIDs
2023-07-21 15:14:56 +00:00
ThomasV
017186d107 Refactor trampoline forwarding and hold invoices.
- maybe_fulfill_htlc returns a forwarding callback that
   covers both cases.
 - previously, the callback of hold invoices was called as a
   side-effect of lnworker.check_mpp_status.
 - the same data structures (lnworker.trampoline_forwardings,
   lnworker.trampoline_forwarding_errors) are used for both
   trampoline forwardings and hold invoices.
 - maybe_fulfill_htlc still recursively calls itself to perform
   checks on trampoline onion. This is ugly, but ugliness is now
   contained to that method.
2023-07-21 13:40:10 +02:00
ThomasV
827792c14c lnpeer: simplify maybe_fulfill_htlc 2023-07-19 15:38:14 +02:00
ThomasV
e124ff7ee7 Trampoline MPP consolidation:
- fix parameters passed to maybe_forward_trampoline
 - use lnworker.trampoline_forwardings as a semaphore for ongoing
   trampoline payments
 - if a trampoline payment fails, fail all received HTLCs
2023-07-19 10:48:44 +02:00
ThomasV
aeaf9c71df Add unit test for trampoline MPP consolidation
This tests that a trampoline waits until all incoming HTLCs are
received, and fail or succeed them together
2023-07-19 09:49:05 +02:00
ThomasV
1e3b3b82d5 test_lnpeer: deepcopy graph definitions in test setup 2023-07-19 09:43:18 +02:00
SomberNight
6977be8e1b util.CallbackManager: keep strong references for running futures
This clears up log spam for regtest tests.

related:
- https://bugs.python.org/issue44665
- https://github.com/python/cpython/issues/88831
- https://textual.textualize.io/blog/2023/02/11/the-heisenbug-lurking-in-your-async-code/
- https://github.com/python/cpython/issues/91887#issuecomment-1434816045
- "Task was destroyed but it is pending!"

Perhaps we should inspect all our usages of
- asyncio.create_task
- loop.create_task
- asyncio.ensure_future
- asyncio.run_coroutine_threadsafe
?

Example log for running a regtest test:
```
$ python3 -m unittest electrum.tests.regtest.TestLightningAB.test_collaborative_close
***** test_collaborative_close ******
initializing alice
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.10/logging/__init__.py", line 1100, in emit
    msg = self.format(record)
  File "/usr/lib/python3.10/logging/__init__.py", line 943, in format
    return fmt.format(record)
  File "/home/user/wspace/electrum/electrum/logging.py", line 44, in format
    record = copy.copy(record)  # avoid mutating arg
  File "/usr/lib/python3.10/copy.py", line 92, in copy
    rv = reductor(4)
ImportError: sys.meta_path is None, Python is likely shutting down
Call stack:
  File "/usr/lib/python3.10/asyncio/base_events.py", line 1781, in call_exception_handler
    self._exception_handler(self, context)
  File "/home/user/wspace/electrum/electrum/util.py", line 1535, in on_exception
    loop.default_exception_handler(context)
  File "/usr/lib/python3.10/asyncio/base_events.py", line 1744, in default_exception_handler
    logger.error('\n'.join(log_lines), exc_info=exc_info)
Message: "Task was destroyed but it is pending!\ntask: <Task pending name='Task-2' coro=<Abstract_Wallet.on_event_adb_set_up_to_date() running at /home/user/wspace/electrum/electrum/wallet.py:485> wait_for=<Future finished result=0> cb=[_chain_future.<locals>._call_set_state() at /usr/lib/python3.10/asyncio/futures.py:392]>"
Arguments: ()

[--- SNIP --- more of the same --- SNIP ---]

--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.10/logging/__init__.py", line 1100, in emit
    msg = self.format(record)
  File "/usr/lib/python3.10/logging/__init__.py", line 943, in format
    return fmt.format(record)
  File "/home/user/wspace/electrum/electrum/logging.py", line 44, in format
    record = copy.copy(record)  # avoid mutating arg
  File "/usr/lib/python3.10/copy.py", line 92, in copy
    rv = reductor(4)
ImportError: sys.meta_path is None, Python is likely shutting down
Call stack:
  File "/usr/lib/python3.10/asyncio/base_events.py", line 1781, in call_exception_handler
    self._exception_handler(self, context)
  File "/home/user/wspace/electrum/electrum/util.py", line 1535, in on_exception
    loop.default_exception_handler(context)
  File "/usr/lib/python3.10/asyncio/base_events.py", line 1744, in default_exception_handler
    logger.error('\n'.join(log_lines), exc_info=exc_info)
Message: "Task was destroyed but it is pending!\ntask: <Task pending name='Task-31' coro=<Abstract_Wallet.on_event_adb_set_up_to_date() running at /home/user/wspace/electrum/electrum/wallet.py:485> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/lib/python3.10/asyncio/futures.py:385, Task.task_wakeup()]> cb=[_chain_future.<locals>._call_set_state() at /usr/lib/python3.10/asyncio/futures.py:392]>"
Arguments: ()
true
true
true
true
funding alice
```
2023-07-17 15:33:57 +00:00
SomberNight
1767d26de9 tests: make regtest tests somewhat faster by faster polling in e-x
using 4e66804dc0

on my machine, before-after:
Ran 9 tests in 495.865s
Ran 9 tests in 376.183s
2023-07-14 15:18:36 +00:00
Sander van Grieken
6b52aad3c8 qml: silence some null deref errors at shutdown 2023-07-14 10:28:50 +02:00
Sander van Grieken
60e007862b qml: defer updates, fixes listitems not updating 2023-07-13 19:17:16 +02:00
Sander van Grieken
0428fc7c0a qml: add explanatory infomessage when sending capacity is significantly less than local balance.
Show message when attempting unfreeze of gossip channel in trampoline mode
2023-07-13 19:17:16 +02:00
Sander van Grieken
45944d280d qml: update channelbar when conditions change 2023-07-13 19:17:16 +02:00
Sander van Grieken
2cf4cc1978 qml: render reserved channel capacity in a darker tone, take frozen into account 2023-07-13 19:17:16 +02:00
Sander van Grieken
4900d01344 allow more time to detect tor 2023-07-13 18:51:48 +02:00
Sander van Grieken
0d7ff92c43 send_tab: remove payment_identifier comments in send_tab 2023-07-11 19:54:07 +02:00
Sander van Grieken
40f15b158c payment_identifier: reconstruct PI for bip70 invoice in pay_onchain_dialog instead of taking the send_tab PI 2023-07-11 17:16:27 +02:00
SomberNight
5b9b616146 simple_config: allow deepcopy-ing ConfigVars
Was getting error:
```
>>> import copy
>>> from electrum.simple_config import SimpleConfig
>>> copy.deepcopy(SimpleConfig.EXPERIMENTAL_LN_FORWARD_PAYMENTS)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "...\Python\Python310\lib\copy.py", line 161, in deepcopy
    rv = reductor(4)
TypeError: cannot pickle 'ConfigVar' object
```

This is useful in tests/test_lnpeer.py, to deepcopy the GRAPH_DEFINITIONS dict.
2023-07-11 14:50:09 +00:00
Sander van Grieken
b1b2190f0a payment_identifier: add payment_identifier_from_invoice function to reconstruct a PI from bip70 invoice 2023-07-11 16:43:49 +02:00
Sander van Grieken
ad4b431738 payment_identifier: fix setting self.bolt11 to invoice in bip21 LN alt case 2023-07-11 15:24:03 +02:00
Sander van Grieken
33acfd3d1c followup d15050a2bf 2023-07-11 14:24:43 +02:00
Sander van Grieken
78a741e4a3 actually remove the FIXME 2023-07-11 14:19:54 +02:00
SomberNight
d695dd51cd build: include AppStream metainfo.xml in tarballs
closes https://github.com/spesmilo/electrum/issues/8501
related https://github.com/spesmilo/electrum/pull/8149
2023-07-11 12:17:40 +00:00
Sander van Grieken
d15050a2bf payment_identifier: fix _on_finalize params, fix lnurlp send comment instead of description,
refactor payment_identifier.get_invoice to standalone invoice_from_payment_identifier
2023-07-11 14:15:17 +02:00
Sander van Grieken
b6863b4854 qml: add LabelSync toggle 2023-07-11 12:51:37 +02:00
SomberNight
bb8c73cabd qt: kind of fix bip70 notify_merchant logic by passing around PI
```
229.18 | E | gui.qt.main_window.[test_segwit_2] | on_error
Traceback (most recent call last):
  File "...\electrum\gui\qt\util.py", line 917, in run
    result = task.task()
  File "...\electrum\gui\qt\send_tab.py", line 681, in broadcast_thread
    if self.payto_e.payment_identifier.has_expired():
AttributeError: 'NoneType' object has no attribute 'has_expired'
```

In SendTab.broadcast_transaction.broadcast_thread, self.payto_e.payment_identifier was referenced -
but do_clear() has already cleared it by then.
E.g. consider SendTab.pay_onchain_dialog: it calls save_pending_invoice(), which calls do_clear(),
and later (in sign_done), it calls window.broadcast_or_show, which will call SendTab.broadcast_transaction().

As there might be multiple independent transaction dialogs open simultaneously, the single shared state
send_tab.payto_e.payment_identifier approach was problematic -- I think it is conceptually nicer to
pass around the payment_identifiers as needed, as done with this change.

However, this change is not a full proper fix, as it still somewhat relies on
send_tab.payto_e.payment_identifier (e.g. in pay_onchain_dialog). Hence, e.g. when using
the invoice_list context menu "Pay..." item, as payto_e.payment_identifier is not set,
payment_identifier will be None in broadcast_transaction.

but at least we handle PI being None gracefully -- before this change, broadcast_transaction
expected PI to be set, and it was never set to the correct thing (as do_clear() already ran by then):
depending on timing it was either None or a new empty PI. In the former case, producing the above
traceback and hard failing (not only for bip70 stuff!), and in the latter, silently ignoring the logic bug.
2023-07-10 18:16:56 +00:00
SomberNight
f2dbf47413 payment_identifier.py: add some type hints, trivial clean-up 2023-07-10 17:59:56 +00:00
SomberNight
612a8e6424 qt: fix: bip70 pay reqs need x509 verification
regression from https://github.com/spesmilo/electrum/pull/8462

- pr.verify() was called in qml, but not in qt gui
- we now call pr.verify() in get_payment_request(), to make the API less error-prone
- it is now ok to call pr.verify() multiple times, the result is cached
2023-07-10 17:50:53 +00:00
Sander van Grieken
023e8ff0eb qml: remember invoice/qr type on ReceiveDialog 2023-07-10 18:10:15 +02:00
Sander van Grieken
86d79f3ec9 qml: show backup type, as in qt 2023-07-10 14:45:36 +02:00
Sander van Grieken
a572b9bf87 lnchannel: add noop get_local_scid_alias for ChannelBackup 2023-07-10 14:22:38 +02:00
SomberNight
0b0d58b289 qml: fix "copy" and "share" buttons for channel backup dialogs
The QR code was shown but the copy/share buttons did not do anything.
2023-07-10 11:23:31 +00:00
Sander van Grieken
6dd630cf3b followup f5a8cc7076 2023-07-10 11:39:16 +02:00
ThomasV
63a5ca4f93 Merge pull request #8529 from Toporin/patch_parse_URI
Patch error caused by the method "parse_URI()" being moved to bip21.py and renamed "parse_bip21_URI"
2023-07-10 10:58:23 +02:00
Toporin
f5a8cc7076 Patch error caused by the method "parse_URI()" being moved and renamed:
Aucun périphérique matériel détecté.
Pour déclencher un nouveau scan, pressez 'Suivant'.

Sur Linux, vous pouvez avoir à ajouter une nouvelle permission à vos règles udev.


Message de débogage
  bitbox02: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading bitbox02 plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  coldcard: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading coldcard plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  digitalbitbox: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading digitalbitbox plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  jade: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading jade plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  keepkey: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading keepkey plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  ledger: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading ledger plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  safe_t: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading safe_t plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  satochip: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading satochip plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
  trezor: (error during plugin init)
    Vous avez peut-être une bibliothèque incompatible.
    Error loading trezor plugin: ImportError("cannot import name 'parse_URI' from 'electrum.util' (/Users/satochip/Documents/github/electrum-satochip/dist/Electrum.app/Contents/MacOS/electrum/util.pyc)")
2023-07-10 09:50:35 +01:00
Sander van Grieken
2d95c457dd qml: addressdetails item order, add technical properties header 2023-07-09 13:43:39 +02:00
Sander van Grieken
016b5eb743 qml: show private key in address details 2023-07-09 13:43:39 +02:00
Sander van Grieken
5f2fee5184 qml: strip whitespace of data pasted/scanned before processing 2023-07-09 11:56:21 +02:00
ThomasV
4b29a46890 lnpeer: fix logging of 'will fullfill htlc' 2023-07-09 10:06:46 +02:00
ThomasV
6bacd65a80 payment_identifter: add FIXME 2023-07-09 10:05:31 +02:00
ThomasV
5cf320b2c7 Merge pull request #8462 from spesmilo/payment_identifiers2
Payment identifiers
2023-07-09 10:02:14 +02:00
Sander van Grieken
ae8c4f1281 payment_identifier: check if payment identifier is usable and enable/disable Send/Pay buttons 2023-07-08 12:19:37 +02:00
Sander van Grieken
f980bd97b5 payment_identifier: factor out bip21 functions to bip21.py to break cyclic dependencies,
parse bolt11 only once, store invoice internally instead of bolt11 string
add is_onchain method to indicate if payment identifier can be paid onchain
2023-07-08 12:18:37 +02:00
Sander van Grieken
7f766f6dfb payment_identifiers: also match local contacts 2023-07-07 22:54:46 +02:00
Sander van Grieken
db6779bf04 qt: show send tab if payment identifier is passed on the cmdline 2023-07-07 20:49:45 +02:00