Skip to content

Commit d735085

Browse files
authored
Merge pull request #690 from TheBlueMatt/2020-09-633-bindings
Small tweaks post #633/#684
2 parents e9d3033 + 0f6b000 commit d735085

15 files changed

+2185
-1170
lines changed

lightning-c-bindings/include/lightning.h

+431-127
Large diffs are not rendered by default.

lightning-c-bindings/include/lightningpp.hpp

+534-464
Large diffs are not rendered by default.

lightning-c-bindings/include/rust_types.h

+12-2
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ struct nativeUnsignedChannelUpdateOpaque;
104104
typedef struct nativeUnsignedChannelUpdateOpaque LDKnativeUnsignedChannelUpdate;
105105
struct nativeChannelUpdateOpaque;
106106
typedef struct nativeChannelUpdateOpaque LDKnativeChannelUpdate;
107+
struct nativeQueryChannelRangeOpaque;
108+
typedef struct nativeQueryChannelRangeOpaque LDKnativeQueryChannelRange;
109+
struct nativeReplyChannelRangeOpaque;
110+
typedef struct nativeReplyChannelRangeOpaque LDKnativeReplyChannelRange;
111+
struct nativeQueryShortChannelIdsOpaque;
112+
typedef struct nativeQueryShortChannelIdsOpaque LDKnativeQueryShortChannelIds;
113+
struct nativeReplyShortChannelIdsEndOpaque;
114+
typedef struct nativeReplyShortChannelIdsEndOpaque LDKnativeReplyShortChannelIdsEnd;
115+
struct nativeGossipTimestampFilterOpaque;
116+
typedef struct nativeGossipTimestampFilterOpaque LDKnativeGossipTimestampFilter;
107117
struct nativeLightningErrorOpaque;
108118
typedef struct nativeLightningErrorOpaque LDKnativeLightningError;
109119
struct nativeCommitmentUpdateOpaque;
@@ -122,8 +132,8 @@ struct nativeChannelPublicKeysOpaque;
122132
typedef struct nativeChannelPublicKeysOpaque LDKnativeChannelPublicKeys;
123133
struct nativeHTLCOutputInCommitmentOpaque;
124134
typedef struct nativeHTLCOutputInCommitmentOpaque LDKnativeHTLCOutputInCommitment;
125-
struct nativeLocalCommitmentTransactionOpaque;
126-
typedef struct nativeLocalCommitmentTransactionOpaque LDKnativeLocalCommitmentTransaction;
135+
struct nativeHolderCommitmentTransactionOpaque;
136+
typedef struct nativeHolderCommitmentTransactionOpaque LDKnativeHolderCommitmentTransaction;
127137
struct nativeInitFeaturesOpaque;
128138
typedef struct nativeInitFeaturesOpaque LDKnativeInitFeatures;
129139
struct nativeNodeFeaturesOpaque;

lightning-c-bindings/src/c_types/derived.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ pub extern "C" fn C2Tuple_OutPointScriptZ_new(a: crate::chain::transaction::OutP
216216
}
217217
}
218218

219+
#[no_mangle]
220+
pub type CVec_u64Z = crate::c_types::CVecTempl<u64>;
221+
#[no_mangle]
222+
pub static CVec_u64Z_free: extern "C" fn(CVec_u64Z) = crate::c_types::CVecTempl_free::<u64>;
223+
219224
#[no_mangle]
220225
pub type CVec_UpdateAddHTLCZ = crate::c_types::CVecTempl<crate::ln::msgs::UpdateAddHTLC>;
221226
#[no_mangle]
@@ -398,8 +403,3 @@ pub static CResult_RouteLightningErrorZ_ok: extern "C" fn (crate::routing::route
398403
pub static CResult_RouteLightningErrorZ_err: extern "C" fn (crate::ln::msgs::LightningError) -> CResult_RouteLightningErrorZ =
399404
crate::c_types::CResultTempl::<crate::routing::router::Route, crate::ln::msgs::LightningError>::err;
400405

401-
#[no_mangle]
402-
pub type CVec_u64Z = crate::c_types::CVecTempl<u64>;
403-
#[no_mangle]
404-
pub static CVec_u64Z_free: extern "C" fn(CVec_u64Z) = crate::c_types::CVecTempl_free::<u64>;
405-

lightning-c-bindings/src/chain/keysinterface.rs

+33-33
Large diffs are not rendered by default.

lightning-c-bindings/src/ln/chan_utils.rs

+49-33
Large diffs are not rendered by default.

lightning-c-bindings/src/ln/channelmanager.rs

+38-38
Original file line numberDiff line numberDiff line change
@@ -624,62 +624,62 @@ pub extern "C" fn ChannelManager_as_ChannelMessageHandler(this_arg: *const Chann
624624
}
625625
}
626626
use lightning::ln::msgs::ChannelMessageHandler as ChannelMessageHandlerTraitImport;
627-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_open_channel(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, mut their_features: crate::ln::features::InitFeatures, msg: &crate::ln::msgs::OpenChannel) {
628-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_open_channel(&their_node_id.into_rust(), *unsafe { Box::from_raw(their_features.take_ptr()) }, unsafe { &*msg.inner })
627+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_open_channel(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, mut their_features: crate::ln::features::InitFeatures, msg: &crate::ln::msgs::OpenChannel) {
628+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_open_channel(&counterparty_node_id.into_rust(), *unsafe { Box::from_raw(their_features.take_ptr()) }, unsafe { &*msg.inner })
629629
}
630-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_accept_channel(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, mut their_features: crate::ln::features::InitFeatures, msg: &crate::ln::msgs::AcceptChannel) {
631-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_accept_channel(&their_node_id.into_rust(), *unsafe { Box::from_raw(their_features.take_ptr()) }, unsafe { &*msg.inner })
630+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_accept_channel(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, mut their_features: crate::ln::features::InitFeatures, msg: &crate::ln::msgs::AcceptChannel) {
631+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_accept_channel(&counterparty_node_id.into_rust(), *unsafe { Box::from_raw(their_features.take_ptr()) }, unsafe { &*msg.inner })
632632
}
633-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_funding_created(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::FundingCreated) {
634-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_funding_created(&their_node_id.into_rust(), unsafe { &*msg.inner })
633+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_funding_created(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::FundingCreated) {
634+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_funding_created(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
635635
}
636-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_funding_signed(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::FundingSigned) {
637-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_funding_signed(&their_node_id.into_rust(), unsafe { &*msg.inner })
636+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_funding_signed(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::FundingSigned) {
637+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_funding_signed(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
638638
}
639-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_funding_locked(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::FundingLocked) {
640-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_funding_locked(&their_node_id.into_rust(), unsafe { &*msg.inner })
639+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_funding_locked(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::FundingLocked) {
640+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_funding_locked(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
641641
}
642-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_shutdown(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::Shutdown) {
643-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_shutdown(&their_node_id.into_rust(), unsafe { &*msg.inner })
642+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_shutdown(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::Shutdown) {
643+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_shutdown(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
644644
}
645-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_closing_signed(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::ClosingSigned) {
646-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_closing_signed(&their_node_id.into_rust(), unsafe { &*msg.inner })
645+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_closing_signed(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::ClosingSigned) {
646+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_closing_signed(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
647647
}
648-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_add_htlc(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateAddHTLC) {
649-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_add_htlc(&their_node_id.into_rust(), unsafe { &*msg.inner })
648+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_add_htlc(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateAddHTLC) {
649+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_add_htlc(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
650650
}
651-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fulfill_htlc(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFulfillHTLC) {
652-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fulfill_htlc(&their_node_id.into_rust(), unsafe { &*msg.inner })
651+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fulfill_htlc(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFulfillHTLC) {
652+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fulfill_htlc(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
653653
}
654-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fail_htlc(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFailHTLC) {
655-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fail_htlc(&their_node_id.into_rust(), unsafe { &*msg.inner })
654+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fail_htlc(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFailHTLC) {
655+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fail_htlc(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
656656
}
657-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fail_malformed_htlc(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFailMalformedHTLC) {
658-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fail_malformed_htlc(&their_node_id.into_rust(), unsafe { &*msg.inner })
657+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fail_malformed_htlc(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFailMalformedHTLC) {
658+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fail_malformed_htlc(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
659659
}
660-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_commitment_signed(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::CommitmentSigned) {
661-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_commitment_signed(&their_node_id.into_rust(), unsafe { &*msg.inner })
660+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_commitment_signed(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::CommitmentSigned) {
661+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_commitment_signed(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
662662
}
663-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_revoke_and_ack(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::RevokeAndACK) {
664-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_revoke_and_ack(&their_node_id.into_rust(), unsafe { &*msg.inner })
663+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_revoke_and_ack(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::RevokeAndACK) {
664+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_revoke_and_ack(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
665665
}
666-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fee(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFee) {
667-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fee(&their_node_id.into_rust(), unsafe { &*msg.inner })
666+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_update_fee(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::UpdateFee) {
667+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_update_fee(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
668668
}
669-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_announcement_signatures(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::AnnouncementSignatures) {
670-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_announcement_signatures(&their_node_id.into_rust(), unsafe { &*msg.inner })
669+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_announcement_signatures(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::AnnouncementSignatures) {
670+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_announcement_signatures(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
671671
}
672-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_channel_reestablish(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::ChannelReestablish) {
673-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_channel_reestablish(&their_node_id.into_rust(), unsafe { &*msg.inner })
672+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_channel_reestablish(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::ChannelReestablish) {
673+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_channel_reestablish(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
674674
}
675-
extern "C" fn ChannelManager_ChannelMessageHandler_peer_disconnected(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, mut no_connection_possible: bool) {
676-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.peer_disconnected(&their_node_id.into_rust(), no_connection_possible)
675+
extern "C" fn ChannelManager_ChannelMessageHandler_peer_disconnected(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, mut no_connection_possible: bool) {
676+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.peer_disconnected(&counterparty_node_id.into_rust(), no_connection_possible)
677677
}
678-
extern "C" fn ChannelManager_ChannelMessageHandler_peer_connected(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, init_msg: &crate::ln::msgs::Init) {
679-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.peer_connected(&their_node_id.into_rust(), unsafe { &*init_msg.inner })
678+
extern "C" fn ChannelManager_ChannelMessageHandler_peer_connected(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, init_msg: &crate::ln::msgs::Init) {
679+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.peer_connected(&counterparty_node_id.into_rust(), unsafe { &*init_msg.inner })
680680
}
681-
extern "C" fn ChannelManager_ChannelMessageHandler_handle_error(this_arg: *const c_void, their_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::ErrorMessage) {
682-
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_error(&their_node_id.into_rust(), unsafe { &*msg.inner })
681+
extern "C" fn ChannelManager_ChannelMessageHandler_handle_error(this_arg: *const c_void, counterparty_node_id: crate::c_types::PublicKey, msg: &crate::ln::msgs::ErrorMessage) {
682+
unsafe { &mut *(this_arg as *mut nativeChannelManager) }.handle_error(&counterparty_node_id.into_rust(), unsafe { &*msg.inner })
683683
}
684684
use lightning::util::events::MessageSendEventsProvider as nativeMessageSendEventsProviderTrait;
685685
#[must_use]

lightning-c-bindings/src/ln/channelmonitor.rs

+24-11
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ pub enum ChannelMonitorUpdateErr {
111111
/// our state failed, but is expected to succeed at some point in the future).
112112
///
113113
/// Such a failure will \"freeze\" a channel, preventing us from revoking old states or
114-
/// submitting new commitment transactions to the remote party. Once the update(s) which failed
114+
/// submitting new commitment transactions to the counterparty. Once the update(s) which failed
115115
/// have been successfully applied, ChannelManager::channel_monitor_updated can be used to
116116
/// restore the channel to an operational state.
117117
///
@@ -144,11 +144,19 @@ pub enum ChannelMonitorUpdateErr {
144144
TemporaryFailure,
145145
/// Used to indicate no further channel monitor updates will be allowed (eg we've moved on to a
146146
/// different watchtower and cannot update with all watchtowers that were previously informed
147-
/// of this channel). This will force-close the channel in question (which will generate one
148-
/// final ChannelMonitorUpdate which must be delivered to at least one ChannelMonitor copy).
147+
/// of this channel).
149148
///
150-
/// Should also be used to indicate a failure to update the local persisted copy of the channel
151-
/// monitor.
149+
/// At reception of this error, ChannelManager will force-close the channel and return at
150+
/// least a final ChannelMonitorUpdate::ChannelForceClosed which must be delivered to at
151+
/// least one ChannelMonitor copy. Revocation secret MUST NOT be released and offchain channel
152+
/// update must be rejected.
153+
///
154+
/// This failure may also signal a failure to update the local persisted copy of one of
155+
/// the channel monitor instance.
156+
///
157+
/// Note that even when you fail a holder commitment transaction update, you must store the
158+
/// update to ensure you can claim from it in case of a duplicate copy of this ChannelMonitor
159+
/// broadcasts it (e.g distributed channel-monitor deployment)
152160
PermanentFailure,
153161
}
154162
use lightning::ln::channelmonitor::ChannelMonitorUpdateErr as nativeChannelMonitorUpdateErr;
@@ -424,6 +432,11 @@ pub struct ManyChannelMonitor {
424432
///
425433
/// Any spends of outputs which should have been registered which aren't passed to
426434
/// ChannelMonitors via block_connected may result in FUNDS LOSS.
435+
///
436+
/// In case of distributed watchtowers deployment, even if an Err is return, the new version
437+
/// must be written to disk, as state may have been stored but rejected due to a block forcing
438+
/// a commitment broadcast. This storage is used to claim outputs of rejected state confirmed
439+
/// onchain by another watchtower, lagging behind on block processing.
427440
#[must_use]
428441
pub update_monitor: extern "C" fn (this_arg: *const c_void, funding_txo: crate::chain::transaction::OutPoint, monitor: crate::ln::channelmonitor::ChannelMonitorUpdate) -> crate::c_types::derived::CResult_NoneChannelMonitorUpdateErrZ,
429442
/// Used by ChannelManager to get list of HTLC resolved onchain and which needed to be updated
@@ -531,12 +544,12 @@ pub extern "C" fn ChannelMonitor_get_and_clear_pending_events(this_arg: &mut Cha
531544
local_ret.into()
532545
}
533546

534-
/// Used by ChannelManager deserialization to broadcast the latest local state if its copy of
535-
/// the Channel was out-of-date. You may use it to get a broadcastable local toxic tx in case of
536-
/// fallen-behind, i.e when receiving a channel_reestablish with a proof that our remote side knows
537-
/// a higher revocation secret than the local commitment number we are aware of. Broadcasting these
538-
/// transactions are UNSAFE, as they allow remote side to punish you. Nevertheless you may want to
539-
/// broadcast them if remote don't close channel with his higher commitment transaction after a
547+
/// Used by ChannelManager deserialization to broadcast the latest holder state if its copy of
548+
/// the Channel was out-of-date. You may use it to get a broadcastable holder toxic tx in case of
549+
/// fallen-behind, i.e when receiving a channel_reestablish with a proof that our counterparty side knows
550+
/// a higher revocation secret than the holder commitment number we are aware of. Broadcasting these
551+
/// transactions are UNSAFE, as they allow counterparty side to punish you. Nevertheless you may want to
552+
/// broadcast them if counterparty don't close channel with his higher commitment transaction after a
540553
/// substantial amount of time (a month or even a year) to get back funds. Best may be to contact
541554
/// out-of-band the other node operator to coordinate with him if option is available to you.
542555
/// In any-case, choice is up to the user.

0 commit comments

Comments
 (0)