-
Notifications
You must be signed in to change notification settings - Fork 415
Introduce FundingTransactionReadyForSignatures
event
#3889
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5911,6 +5911,86 @@ where | |
result | ||
} | ||
|
||
/// Handles a signed funding transaction generated by interactive transaction construction and | ||
/// provided by the client. | ||
/// | ||
/// Do NOT broadcast the funding transaction yourself. When we have safely received our | ||
/// counterparty's signature(s) the funding transaction will automatically be broadcast via the | ||
/// [`BroadcasterInterface`] provided when this `ChannelManager` was constructed. | ||
/// | ||
/// `SIGHASH_ALL` MUST be used for all signatures when providing signatures. | ||
/// | ||
/// <div class="warning"> | ||
/// WARNING: LDK makes no attempt to prevent the counterparty from using non-standard inputs which | ||
/// will prevent the funding transaction from being relayed on the bitcoin network and hence being | ||
/// confirmed. | ||
/// </div> | ||
/// | ||
/// Returns [`ChannelUnavailable`] when a channel is not found or an incorrect | ||
/// `counterparty_node_id` is provided. | ||
/// | ||
/// Returns [`APIMisuseError`] when a channel is not in a state where it is expecting funding | ||
/// signatures. | ||
/// | ||
/// [`ChannelUnavailable`]: APIError::ChannelUnavailable | ||
/// [`APIMisuseError`]: APIError::APIMisuseError | ||
pub fn funding_transaction_signed( | ||
&self, channel_id: &ChannelId, counterparty_node_id: &PublicKey, transaction: Transaction, | ||
) -> Result<(), APIError> { | ||
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self); | ||
let witnesses: Vec<_> = transaction | ||
.input | ||
.into_iter() | ||
.filter_map(|input| if input.witness.is_empty() { None } else { Some(input.witness) }) | ||
.collect(); | ||
Comment on lines
+5941
to
+5945
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't have a strong opinion here, but seems we can avoid this by passing the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Cool, yeah will look at changing this after fixups. |
||
|
||
let per_peer_state = self.per_peer_state.read().unwrap(); | ||
let peer_state_mutex = per_peer_state.get(counterparty_node_id).ok_or_else(|| { | ||
APIError::ChannelUnavailable { | ||
err: format!( | ||
"Can't find a peer matching the passed counterparty node_id {}", | ||
counterparty_node_id | ||
), | ||
} | ||
})?; | ||
|
||
let mut peer_state_lock = peer_state_mutex.lock().unwrap(); | ||
let peer_state = &mut *peer_state_lock; | ||
|
||
match peer_state.channel_by_id.get_mut(channel_id) { | ||
Some(channel) => match channel.as_funded_mut() { | ||
Some(chan) => { | ||
if let Some(tx_signatures) = | ||
chan.funding_transaction_signed(witnesses, &self.logger)? | ||
{ | ||
peer_state.pending_msg_events.push(MessageSendEvent::SendTxSignatures { | ||
node_id: *counterparty_node_id, | ||
msg: tx_signatures, | ||
}); | ||
} | ||
}, | ||
None => { | ||
return Err(APIError::APIMisuseError { | ||
err: format!( | ||
"Channel with id {} not expecting funding signatures", | ||
channel_id | ||
), | ||
}) | ||
}, | ||
}, | ||
None => { | ||
return Err(APIError::ChannelUnavailable { | ||
err: format!( | ||
"Channel with id {} not found for the passed counterparty node_id {}", | ||
channel_id, counterparty_node_id | ||
), | ||
}) | ||
}, | ||
jkczyz marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
Ok(()) | ||
} | ||
|
||
/// Atomically applies partial updates to the [`ChannelConfig`] of the given channels. | ||
/// | ||
/// Once the updates are applied, each eligible channel (advertised with a known short channel | ||
|
@@ -9037,13 +9117,19 @@ This indicates a bug inside LDK. Please report this error at https://github.com/ | |
peer_state.pending_msg_events.push(msg_send_event); | ||
}; | ||
if let Some(signing_session) = signing_session_opt { | ||
let (commitment_signed, funding_ready_for_sig_event_opt) = chan_entry | ||
let (commitment_signed, funding_tx_opt) = chan_entry | ||
.get_mut() | ||
.funding_tx_constructed(signing_session, &self.logger) | ||
.map_err(|err| MsgHandleErrInternal::send_err_msg_no_close(format!("{}", err), msg.channel_id))?; | ||
if let Some(funding_ready_for_sig_event) = funding_ready_for_sig_event_opt { | ||
if let Some(unsigned_transaction) = funding_tx_opt { | ||
let mut pending_events = self.pending_events.lock().unwrap(); | ||
pending_events.push_back((funding_ready_for_sig_event, None)); | ||
pending_events.push_back(( | ||
Event::FundingTransactionReadyForSigning { | ||
unsigned_transaction, | ||
counterparty_node_id, | ||
channel_id: msg.channel_id, | ||
user_channel_id: chan_entry.get().context().get_user_id(), | ||
}, None)); | ||
} | ||
peer_state.pending_msg_events.push(MessageSendEvent::UpdateHTLCs { | ||
node_id: counterparty_node_id, | ||
|
Uh oh!
There was an error while loading. Please reload this page.