Commit graph

2243 commits

Author SHA1 Message Date
Valentine Wallace
4cee62233c
Set UpdateAddHTLC::skimmed_fee_msat on forward
So the receiver can verify it and approve underpaying HTLCs (see
ChannelConfig::accept_underpaying_htlcs).
2023-06-20 17:57:38 -04:00
Valentine Wallace
5a79d6cc53
Persist update_add sender skimmed fee in Channel 2023-06-20 17:57:38 -04:00
Valentine Wallace
47567e45dc
Track the sender's skimmed fee in UpdateAddHTLC 2023-06-20 17:57:38 -04:00
Valentine Wallace
9a3914dee6
Allow receiving less than the onion claims to pay
Useful for penultimate hops in routes to take an extra fee, if for example they
opened a JIT channel to the payee and want them to help bear the channel open
cost.
2023-06-20 17:57:38 -04:00
Valentine Wallace
27b99acd64
Add PaymentClaimable::counterparty_skimmed_fee_msat
See its docs
2023-06-20 17:57:38 -04:00
Valentine Wallace
94853044fe
Persist counterparty skimmed fee in ClaimableHTLC
Used to get an accurate skimmed fee in the resulting PaymentClaimable event.
2023-06-20 17:57:38 -04:00
Valentine Wallace
52f290119d
Set extra skimmed fee on intercepted forward
Receivers need to use this value to verify incoming payments if
ChannelConfig::accept_underpaying_htlcs is set.
2023-06-20 17:57:38 -04:00
Valentine Wallace
672d666ef4
Move next hop packet pubkey calculation to outside channel lock 2023-06-20 17:57:38 -04:00
Valentine Wallace
a2a7fef4d7
Move PendingHTLCStatus construction inside channel lock
We need the channel lock for constructing a pending HTLC's status because we
need to know if the channel accepts underpaying HTLCs in upcoming commits.
2023-06-20 17:57:35 -04:00
Duncan Dean
d957f362ff
Rename inbound_is_awaiting_accept() to is_awaiting_accept() 2023-06-15 22:31:41 +02:00
Duncan Dean
8f93e2dc94
Rename InboundV1Channel::new_from_req to InboundV1Channel::new 2023-06-15 22:31:40 +02:00
Duncan Dean
637e03a3de
Move inbound channel methods into InboundV1Channel's impl 2023-06-15 22:31:37 +02:00
Duncan Dean
4a0cd5cf55
Move outbound channel methods into OutboundV1Channel's impl 2023-06-15 22:20:14 +02:00
Duncan Dean
4b1e2865cf
Create and use methods for counting channels
This commit also adds two new maps to `PeerState` for keeping track
of `OutboundV1Channel`s and `InboundV1Channel`s so that further
commits are a bit easier to review.
2023-06-15 12:55:40 +02:00
Duncan Dean
4ad67cfe18
Refactor channel map update macros for use with ChannelContext 2023-06-15 12:55:37 +02:00
Duncan Dean
2ea27e02cd
Move Channel::force_shutdown to ChannelContext impl 2023-06-15 12:51:45 +02:00
Duncan Dean
baadeb7374
Move inbound channel constructor into InboundV1Channel impl 2023-06-15 12:51:44 +02:00
Duncan Dean
e6c2f04f15
Move outbound channel constructor into OutboundV1Channel impl 2023-06-15 12:51:43 +02:00
Duncan Dean
883e0566ef
Introduce InboundV1Channel & OutboundV1Channel 2023-06-15 12:51:34 +02:00
Duncan Dean
10125269d2
Move channel constants up 2023-06-14 16:04:30 +02:00
Duncan Dean
e3f0c55182
Make ChannelManager::issue_channel_close_events take a ChannelContext 2023-06-14 16:04:28 +02:00
Duncan Dean
25c1ad8e19
Convert ChannelDetails::from_channel to ChannelDetails::from_channel_context
This rename and refactor is so that we can get channel details from a
`ChannelContext` which is a common object to all channels.
2023-06-14 16:04:27 +02:00
Duncan Dean
60706d6338
Move Channel::get_available_balances to ChannelContext impl 2023-06-14 16:04:26 +02:00
Duncan Dean
9f4e71452a
Move Channel::next_*_commit_tx_fee_msat methods to ChannelContext impl 2023-06-14 16:04:25 +02:00
Duncan Dean
08ee72be9d
Move Channel::commit_tx_fee_msat to file-level utilities 2023-06-14 16:04:24 +02:00
Duncan Dean
ed6a5bb151
Move Channel::get_*_pending_htlc_stats to ChannelContext impl 2023-06-14 16:04:23 +02:00
Duncan Dean
2774aa26d9
Prepare some methods for upcoming moves to ChannelContext
To reduce interleaving in commits, we introduce a `context` variable
in methods to be moved in upcoming commits so there is minimal change
with the moves.
2023-06-14 16:04:22 +02:00
Duncan Dean
3ff94fae55
Move Channel::get_feerate_sat_per_1000_weight and other methods
This is one of a series of commits to make sure methods are moved by
chunks so they are easily reviewable in diffs. Unfortunately they are
not purely move-only as fields to be updated for things to
compile, but these should be quite clear.

This commit also uses the `context` field where needed for compilation
and tests to pass due to the above change.

f s/tarcontext.get_/target_/
2023-06-14 16:04:21 +02:00
Duncan Dean
0d739eeb22
Move Channel::build_holder_transaction_keys and some other methods
This is one of a series of commits to make sure methods are moved by
chunks so they are easily reviewable in diffs. Unfortunately they are
not purely move-only as fields need to be updated for things to
compile, but these should be quite clear.

This commit also uses the `context` field where needed for compilation
and tests to pass due to the above change.
2023-06-14 16:04:14 +02:00
Duncan Dean
497aeb006f
Move Channel::build_commitment_transaction to ChannelContext impl
This is one of a series of commits to make sure methods are moved by
chunks so they are easily reviewable in diffs. Unfortunately they are
not purely move-only as fields need to be updated for things to
compile, but these should be quite clear.

This commit also uses the `context` field where needed for compilation
and tests to pass due to the above change.
2023-06-14 13:42:27 +02:00
Duncan Dean
ede8324397
Move Channel::channel_id and some other methods to ChannelContext impl
This is one of a series of commits to make sure methods are moved by
chunks so they are easily reviewable in diffs. Unfortunately they are
not purely move-only as fields need to be updated for things to
compile, but these should be quite clear.

This commit also uses the `context` field where needed for compilation
and tests to pass due to the above change.
2023-06-14 13:42:26 +02:00
Duncan Dean
1ee0a66d21
Move Channel::get_update_time_counter and some other methods
This is one of a series of commits to make sure methods are moved by
chunks so they are easily reviewable in diffs. Unfortunately they are
not purely move-only as fields need to be updated for things to
compile, but these should be quite clear.

This commit also uses these methods through the `context` field where
needed for compilation and tests to pass due to the above change.
2023-06-14 13:42:24 +02:00
Duncan Dean
1503ebbc0e
Move Channel::opt_anchors to ChannelContext impl & move some util fns
This is one of a series of commits to make sure methods are moved by
chunks so they are easily reviewable in diffs. Unfortunately they are
not purely move-only as fields need to be updated for things to
compile, but these should be quite clear.
2023-06-14 13:42:23 +02:00
Duncan Dean
883afb38d4
Move Channel fields into ChannelContext struct
This is a first step for simplifying the channel state and introducing
new unfunded channel types that hold similar state before being promoted
to funded channels.

Essentially, we want the outer `Channel` type (and upcoming channel types)
to wrap the context so we can apply typestate patterns to the that wrapper
while also deduplicating code for common state and other internal fields.
2023-06-14 13:42:22 +02:00
Jeffrey Czyz
c17c2ae3c0
Support onion message replies in OnionMessenger
Modify onion message handlers to return an optional response message for
OnionMessenger to reply with.
2023-06-13 13:07:47 -05:00
Jeffrey Czyz
a71000f35d
MessageRouter trait for OnionMessenger
Add a trait for finding routes for onion messages and parameterize
OnionMessenger with it. This allows OnionMessenger to reply to messages
that it handles via one of its handlers (e.g., OffersMessageHandler).
2023-06-13 13:07:47 -05:00
Jeffrey Czyz
f521e4cceb
OffersMessageHandler trait for OnionMessenger
Add a trait for handling BOLT 12 Offers messages to OnionMessenger and a
skeleton implementation of it for ChannelManager. This allows users to
either provide their own custom handling Offers messages or rely on a
version provided by LDK using stateless verification.
2023-06-13 13:07:47 -05:00
Matt Corallo
42e2f1d1a6
Merge pull request #2156 from alecchendev/2023-04-mpp-keysend
Support MPP Keysend
2023-06-10 19:48:54 +00:00
Alec Chen
9db962c719
Add test for duplicate keysend payment
The logic has been changed around duplicate keysend payments such that
it's no longer explicitly clear that we reject duplicate keysend
payments now that we handle receiving multi-part keysends. This test
catches that. Note that this also tests that we reject MPP keysends when
our config states we should, and that we reject MPP keysends without
payemnt secrets when our config states we support MPP keysends.
2023-06-09 11:27:09 -05:00
Alec Chen
8dde17773a
Support receiving MPP keysend
This commit refactors a significant portion of the receive validation in
`ChannelManager::process_pending_htlc_forwards` now that we repurpose
previous MPP validation logic to accomodate keysends. This also removes
a previous restriction on claiming, as well as tests sending and
receiving MPP keysends.
2023-06-09 11:27:07 -05:00
Alec Chen
4be3adb51f
Track MPP data while receiving keysends
This commit adds the field `payment_data: FinalOnionHopData` to
`ReceiveKeysend` which will allow us to check for payment secrets and
total amounts which is needed to support receiving MPP keysends. This
field is non-backwards compatible since we wouldn't be able to handle
an MPP keysend properly if we were to downgrade to a prior version.

We also no longer reject keysends with payment secrets if we support MPP
keysend.
2023-06-09 11:27:06 -05:00
Alec Chen
07def9292a
Help users support sending MPP keysend
When routing a keysend payment, the user may want to signal to the
router whether to find multi-path routes in the
`PaymentParameters::for_keysend` helper, without going through manual
construction. Since some implementations do not support MPP keysend, we
have the user make the choice here rather than making it the default.

Some implementations will reject keysend payments with payment secrets,
so this commit also adds docs to `RecipientOnionFields` to communicate
this to the user.
2023-06-09 11:26:58 -05:00
Matt Corallo
f09c37082c
Merge pull request #2342 from vladimirfomene/2023-06-use-untrustedstring-in-error-logs
Use PrintableString for displaying errors in PeerManager
2023-06-07 23:06:15 +00:00
Vladimir Fomene
b5c89cc977
Use PrintableString for displaying errors in PeerManager
We currently just print "with non-ASCII error message"
to log when we see non-ASCII chars, but should instead
use our fancy PrintableString type to display the
untrusted string and ignore control chars.
2023-06-07 21:38:23 +03:00
Matt Corallo
f068df03c5
Merge pull request #2312 from TheBlueMatt/2023-05-next-htlc-min-max
Avoid generating unpayable routes due to balance restrictions
2023-06-07 17:03:01 +00:00
Matt Corallo
583a5b2748
Merge pull request #2330 from wvanlint/partial_config_updates
Support atomic partial updates to ChannelConfig
2023-06-07 01:02:48 +00:00
Matt Corallo
4bc3a79365 Slightly improve docs on next_*_commit_tx_fee_msat 2023-06-06 23:57:56 +00:00
Matt Corallo
10e213cf40 Replace send_htlc amount checking with available balances
Now that the `get_available_balances` min/max bounds are exact, we
can stop doing all the explicit checks in `send_htlc` entirely,
instead comparing against the `get_available_balances` bounds and
failing if the amount is out of those bounds.

This breaks support for sending amounts below the dust limit if
there is some amount of dust exposure remaining before we hit our
cap, however we will no longer generate such routes anyway.
2023-06-06 23:57:56 +00:00
Matt Corallo
66c4f454f0 Ensure a 1:1 mapping of value sendable to send success in fuzzing
Now that the value available to send is expected to match the
success or failure of sending exactly, we should assert this in the
`chanmon_consistency` fuzzer.

In the next commit we'll actually rip the checks out of `send_htlc`
which will make this a somewhat less useful test, however fuzzing
on this specific commit can help to reveal bugs.
2023-06-06 23:57:56 +00:00
Matt Corallo
7edbf547fb Consider dust exposure when assembling a route
When calculating the amount available to send for the next HTLC, if
we over-count we may create routes which are not actually usable.

Historically this has been an issue, which we resolve over a few
commits.

Here we consider how much adding one additional (dust) HTLC would
impact our total dust exposure, setting the new next-HTLC-minimum
field to require HTLCs be non-dust if required or set our next-HTLC
maximum if we cannot send a dust HTLC but do have some additional
exposure remaining.

We also add some testing when sending to ensure that send failures
are accounted for in our balance calculations.

Fixes #2252.
2023-06-06 23:57:56 +00:00