pub struct ChannelManager<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref>{ /* private fields */ }
Expand description

Manager which keeps track of a number of channels and sends messages to the appropriate channel, also tracking HTLC preimages and forwarding onion packets appropriately.

Implements ChannelMessageHandler, handling the multi-channel parts and passing things through to individual Channels.

Implements Writeable to write out all channel state to disk. Implies peer_disconnected for all peers during write/read (though does not modify this instance, only the instance being serialized). This will result in any channels which have not yet exchanged funding_created (i.e., called funding_transaction_generated for outbound channels) being closed.

Note that you can be a bit lazier about writing out ChannelManager than you can be with ChannelMonitor. With ChannelMonitor you MUST durably write each ChannelMonitorUpdate before returning from chain::Watch::watch_channel/update_channel or before completing async writes. With ChannelManagers, writing updates happens out-of-band (and will prevent any other ChannelManager operations from occurring during the serialization process). If the deserialized version is out-of-date compared to the ChannelMonitor passed by reference to read, those channels will be force-closed based on the ChannelMonitor state and no funds will be lost (modulo on-chain transaction fees).

Note that the deserializer is only implemented for (BlockHash, ChannelManager), which tells you the last block hash which was connected. You should get the best block tip before using the manager. See chain::Listen and chain::Confirm for more details.

Note that ChannelManager is responsible for tracking liveness of its channels and generating ChannelUpdate messages informing peers that the channel is temporarily disabled. To avoid spam due to quick disconnection/reconnection, updates are not sent until the channel has been offline for a full minute. In order to track this, you must call timer_tick_occurred roughly once per minute, though it doesn’t have to be perfect.

To avoid trivial DoS issues, ChannelManager limits the number of inbound connections and inbound channels without confirmed funding transactions. This may result in nodes which we do not have a channel with being unable to connect to us or open new channels with us if we have many peers with unfunded channels.

Because it is an indication of trust, inbound channels which we’ve accepted as 0conf are exempted from the count of unfunded channels. Similarly, outbound channels and connections are never limited. Please ensure you limit the count of such channels yourself.

Rather than using a plain ChannelManager, it is preferable to use either a SimpleArcChannelManager a SimpleRefChannelManager, for conciseness. See their documentation for more details, but essentially you should default to using a SimpleRefChannelManager, and use a SimpleArcChannelManager when you require a ChannelManager with a static lifetime, such as when you’re using lightning-net-tokio.

Implementations§

source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<M, T, ES, NS, SP, F, R, L>

source

pub fn new( fee_est: F, chain_monitor: M, tx_broadcaster: T, router: R, logger: L, entropy_source: ES, node_signer: NS, signer_provider: SP, config: UserConfig, params: ChainParameters, current_timestamp: u32 ) -> Self

Constructs a new ChannelManager to hold several channels and route between them.

The current time or latest block header time can be provided as the current_timestamp.

This is the main “logic hub” for all channel-related actions, and implements ChannelMessageHandler.

Non-proportional fees are fixed according to our risk using the provided fee estimator.

Users need to notify the new ChannelManager when a new block is connected or disconnected using its block_connected and block_disconnected methods, starting from after params.best_block.block_hash. See chain::Listen and chain::Confirm for more details.

source

pub fn get_current_default_configuration(&self) -> &UserConfig

Gets the current configuration applied to all new channels.

source

pub fn create_channel( &self, their_network_key: PublicKey, channel_value_satoshis: u64, push_msat: u64, user_channel_id: u128, temporary_channel_id: Option<ChannelId>, override_config: Option<UserConfig> ) -> Result<ChannelId, APIError>

Creates a new outbound channel to the given remote node and with the given value.

user_channel_id will be provided back as in Event::FundingGenerationReady::user_channel_id to allow tracking of which events correspond with which create_channel call. Note that the user_channel_id defaults to a randomized value for inbound channels. user_channel_id has no meaning inside of LDK, it is simply copied to events and otherwise ignored.

Raises APIError::APIMisuseError when channel_value_satoshis > 2**24 or push_msat is greater than channel_value_satoshis * 1k or channel_value_satoshis < 1000.

Raises APIError::ChannelUnavailable if the channel cannot be opened due to failing to generate a shutdown scriptpubkey or destination script set by SignerProvider::get_shutdown_scriptpubkey or SignerProvider::get_destination_script.

Note that we do not check if you are currently connected to the given peer. If no connection is available, the outbound open_channel message may fail to send, resulting in the channel eventually being silently forgotten (dropped on reload).

If temporary_channel_id is specified, it will be used as the temporary channel ID of the channel. Otherwise, a random one will be generated for you.

Returns the new Channel’s temporary channel_id. This ID will appear as Event::FundingGenerationReady::temporary_channel_id and in ChannelDetails::channel_id until after ChannelManager::funding_transaction_generated is called, swapping the Channel’s ID for one derived from the funding transaction’s TXID. If the counterparty rejects the channel immediately, this temporary ID will appear in Event::ChannelClosed::channel_id.

source

pub fn list_channels(&self) -> Vec<ChannelDetails>

Gets the list of open channels, in random order. See ChannelDetails field documentation for more information.

source

pub fn list_usable_channels(&self) -> Vec<ChannelDetails>

Gets the list of usable channels, in random order. Useful as an argument to Router::find_route to ensure non-announced channels are used.

These are guaranteed to have their ChannelDetails::is_usable value set to true, see the documentation for ChannelDetails::is_usable for more info on exactly what the criteria are.

source

pub fn list_channels_with_counterparty( &self, counterparty_node_id: &PublicKey ) -> Vec<ChannelDetails>

Gets the list of channels we have with a given counterparty, in random order.

source

pub fn list_recent_payments(&self) -> Vec<RecentPaymentDetails>

Returns in an undefined order recent payments that – if not fulfilled – have yet to find a successful path, or have unresolved HTLCs.

This can be useful for payments that may have been prepared, but ultimately not sent, as a result of a crash. If such a payment exists, is not listed here, and an Event::PaymentSent has not been received, you may consider resending the payment.

source

pub fn close_channel( &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey ) -> Result<(), APIError>

Begins the process of closing a channel. After this call (plus some timeout), no new HTLCs will be accepted on the given channel, and after additional timeout/the closing of all pending HTLCs, the channel will be closed on chain.

May generate a SendShutdown message event on success, which should be relayed.

Raises APIError::ChannelUnavailable if the channel cannot be closed due to failing to generate a shutdown scriptpubkey or destination script set by SignerProvider::get_shutdown_scriptpubkey. A force-closure may be needed to close the channel.

source

pub fn close_channel_with_feerate_and_script( &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey, target_feerate_sats_per_1000_weight: Option<u32>, shutdown_script: Option<ShutdownScript> ) -> Result<(), APIError>

Begins the process of closing a channel. After this call (plus some timeout), no new HTLCs will be accepted on the given channel, and after additional timeout/the closing of all pending HTLCs, the channel will be closed on chain.

target_feerate_sat_per_1000_weight has different meanings depending on if we initiated the channel being closed or not:

  • If we are the channel initiator, we will pay at least this feerate on the closing transaction. The upper-bound is set by ChannelConfig::force_close_avoidance_max_fee_satoshis plus our NonAnchorChannelFee fee estimate (or target_feerate_sat_per_1000_weight, if it is greater).
  • If our counterparty is the channel initiator, we will refuse to accept a channel closure transaction feerate below target_feerate_sat_per_1000_weight (or the feerate which will appear on a force-closure transaction, whichever is lower).

The shutdown_script provided will be used as the scriptPubKey for the closing transaction. Will fail if a shutdown script has already been set for this channel by [’ChannelHandshakeConfig::commit_upfront_shutdown_pubkey`]. The given shutdown script must also be compatible with our and the counterparty’s features.

May generate a SendShutdown message event on success, which should be relayed.

Raises APIError::ChannelUnavailable if the channel cannot be closed due to failing to generate a shutdown scriptpubkey or destination script set by SignerProvider::get_shutdown_scriptpubkey. A force-closure may be needed to close the channel.

source

pub fn force_close_broadcasting_latest_txn( &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey ) -> Result<(), APIError>

Force closes a channel, immediately broadcasting the latest local transaction(s) and rejecting new HTLCs on the given channel. Fails if channel_id is unknown to the manager, or if the counterparty_node_id isn’t the counterparty of the corresponding channel.

source

pub fn force_close_without_broadcasting_txn( &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey ) -> Result<(), APIError>

Force closes a channel, rejecting new HTLCs on the given channel but skips broadcasting the latest local transaction(s). Fails if channel_id is unknown to the manager, or if the counterparty_node_id isn’t the counterparty of the corresponding channel.

You can always get the latest local transaction(s) to broadcast from ChannelMonitor::get_latest_holder_commitment_txn.

source

pub fn force_close_all_channels_broadcasting_latest_txn(&self)

Force close all channels, immediately broadcasting the latest local commitment transaction for each to the chain and rejecting new HTLCs on each.

source

pub fn force_close_all_channels_without_broadcasting_txn(&self)

Force close all channels rejecting new HTLCs on each but without broadcasting the latest local transaction(s).

source

pub fn send_payment_with_route( &self, route: &Route, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId ) -> Result<(), PaymentSendFailure>

Sends a payment along a given route.

Value parameters are provided via the last hop in route, see documentation for RouteHop fields for more info.

May generate UpdateHTLCs message(s) event on success, which should be relayed (e.g. via PeerManager::process_events).

§Avoiding Duplicate Payments

If a pending payment is currently in-flight with the same PaymentId provided, this method will error with an APIError::InvalidRoute. Note, however, that once a payment is no longer pending (either via ChannelManager::abandon_payment, or handling of an Event::PaymentSent or Event::PaymentFailed) LDK will not stop you from sending a second payment with the same PaymentId.

Thus, in order to ensure duplicate payments are not sent, you should implement your own tracking of payments, including state to indicate once a payment has completed. Because you should also ensure that PaymentHashes are not re-used, for simplicity, you should consider using the PaymentHash as the key for tracking payments. In that case, the PaymentId should be a copy of the PaymentHash bytes.

Additionally, in the scenario where we begin the process of sending a payment, but crash before send_payment returns (or prior to ChannelMonitorUpdate persistence if you’re using ChannelMonitorUpdateStatus::InProgress), the payment may be lost on restart. See ChannelManager::list_recent_payments for more information.

§Possible Error States on PaymentSendFailure

Each path may have a different return value, and PaymentSendFailure may return a Vec with each entry matching the corresponding-index entry in the route paths, see PaymentSendFailure for more info.

In general, a path may raise:

Note that depending on the type of the PaymentSendFailure the HTLC may have been irrevocably committed to on our end. In such a case, do NOT retry the payment with a different route unless you intend to pay twice!

source

pub fn send_payment( &self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry ) -> Result<(), RetryableSendFailure>

Similar to ChannelManager::send_payment_with_route, but will automatically find a route based on route_params and retry failed payment paths based on retry_strategy.

source

pub fn abandon_payment(&self, payment_id: PaymentId)

Signals that no further attempts for the given payment should occur. Useful if you have a pending outbound payment with retries remaining, but wish to stop retrying the payment before retries are exhausted.

§Event Generation

If no Event::PaymentFailed event had been generated before, one will be generated as soon as there are no remaining pending HTLCs for this payment.

Note that calling this method does not prevent a payment from succeeding. You must still wait until you receive either a Event::PaymentFailed or Event::PaymentSent event to determine the ultimate status of a payment.

§Requested Invoices

In the case of paying a Bolt12Invoice via ChannelManager::pay_for_offer, abandoning the payment prior to receiving the invoice will result in an Event::InvoiceRequestFailed and prevent any attempts at paying it once received. The other events may only be generated once the invoice has been received.

§Restart Behavior

If an Event::PaymentFailed is generated and we restart without first persisting the ChannelManager, another Event::PaymentFailed may be generated; likewise for Event::InvoiceRequestFailed.

source

pub fn send_spontaneous_payment( &self, route: &Route, payment_preimage: Option<PaymentPreimage>, recipient_onion: RecipientOnionFields, payment_id: PaymentId ) -> Result<PaymentHash, PaymentSendFailure>

Send a spontaneous payment, which is a payment that does not require the recipient to have generated an invoice. Optionally, you may specify the preimage. If you do choose to specify the preimage, it must be a cryptographically secure random value that no intermediate node would be able to guess – otherwise, an intermediate node may claim the payment and it will never reach the recipient.

See send_payment documentation for more details on the return value of this function and idempotency guarantees provided by the PaymentId key.

Similar to regular payments, you MUST NOT reuse a payment_preimage value. See send_payment for more information about the risks of duplicate preimage usage.

source

pub fn send_spontaneous_payment_with_retry( &self, payment_preimage: Option<PaymentPreimage>, recipient_onion: RecipientOnionFields, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry ) -> Result<PaymentHash, RetryableSendFailure>

Similar to ChannelManager::send_spontaneous_payment, but will automatically find a route based on route_params and retry failed payment paths based on retry_strategy.

See PaymentParameters::for_keysend for help in constructing route_params for spontaneous payments.

source

pub fn send_probe( &self, path: Path ) -> Result<(PaymentHash, PaymentId), PaymentSendFailure>

Send a payment that is probing the given route for liquidity. We calculate the PaymentHash of probes based on a static secret and a random PaymentId, which allows us to easily discern them from real payments.

source

pub fn send_spontaneous_preflight_probes( &self, node_id: PublicKey, amount_msat: u64, final_cltv_expiry_delta: u32, liquidity_limit_multiplier: Option<u64> ) -> Result<Vec<(PaymentHash, PaymentId)>, ProbeSendFailure>

Sends payment probes over all paths of a route that would be used to pay the given amount to the given node_id.

See ChannelManager::send_preflight_probes for more information.

source

pub fn send_preflight_probes( &self, route_params: RouteParameters, liquidity_limit_multiplier: Option<u64> ) -> Result<Vec<(PaymentHash, PaymentId)>, ProbeSendFailure>

Sends payment probes over all paths of a route that would be used to pay a route found according to the given RouteParameters.

This may be used to send “pre-flight” probes, i.e., to train our scorer before conducting the actual payment. Note this is only useful if there likely is sufficient time for the probe to settle before sending out the actual payment, e.g., when waiting for user confirmation in a wallet UI.

Otherwise, there is a chance the probe could take up some liquidity needed to complete the actual payment. Users should therefore be cautious and might avoid sending probes if liquidity is scarce and/or they don’t expect the probe to return before they send the payment. To mitigate this issue, channels with available liquidity less than the required amount times the given liquidity_limit_multiplier won’t be used to send pre-flight probes. If None is given as liquidity_limit_multiplier, it defaults to 3.

source

pub fn funding_transaction_generated( &self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, funding_transaction: Transaction ) -> Result<(), APIError>

Call this upon creation of a funding transaction for the given channel.

Returns an APIError::APIMisuseError if the funding_transaction spent non-SegWit outputs or if no output was found which matches the parameters in Event::FundingGenerationReady.

Returns APIError::APIMisuseError if the funding transaction is not final for propagation across the p2p network.

Returns APIError::ChannelUnavailable if a funding transaction has already been provided for the channel or if the channel has been closed as indicated by Event::ChannelClosed.

May panic if the output found in the funding transaction is duplicative with some other channel (note that this should be trivially prevented by using unique funding transaction keys per-channel).

Do NOT broadcast the funding transaction yourself. When we have safely received our counterparty’s signature the funding transaction will automatically be broadcast via the BroadcasterInterface provided when this ChannelManager was constructed.

Note that this includes RBF or similar transaction replacement strategies - lightning does not currently support replacing a funding transaction on an existing channel. Instead, create a new channel with a conflicting funding transaction.

Note to keep the miner incentives aligned in moving the blockchain forward, we recommend the wallet software generating the funding transaction to apply anti-fee sniping as implemented by Bitcoin Core wallet. See https://bitcoinops.org/en/topics/fee-sniping/ for more details.

source

pub fn batch_funding_transaction_generated( &self, temporary_channels: &[(&ChannelId, &PublicKey)], funding_transaction: Transaction ) -> Result<(), APIError>

Call this upon creation of a batch funding transaction for the given channels.

Return values are identical to Self::funding_transaction_generated, respective to each individual channel and transaction output.

Do NOT broadcast the funding transaction yourself. This batch funding transaction will only be broadcast when we have safely received and persisted the counterparty’s signature for each channel.

If there is an error, all channels in the batch are to be considered closed.

source

pub fn update_partial_channel_config( &self, counterparty_node_id: &PublicKey, channel_ids: &[ChannelId], config_update: &ChannelConfigUpdate ) -> Result<(), APIError>

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 ID and a change in forwarding_fee_proportional_millionths, forwarding_fee_base_msat, or cltv_expiry_delta) has a BroadcastChannelUpdate event message generated containing the new ChannelUpdate message which should be broadcast to the network.

Returns ChannelUnavailable when a channel is not found or an incorrect counterparty_node_id is provided.

Returns APIMisuseError when a cltv_expiry_delta update is to be applied with a value below MIN_CLTV_EXPIRY_DELTA.

If an error is returned, none of the updates should be considered applied.

source

pub fn update_channel_config( &self, counterparty_node_id: &PublicKey, channel_ids: &[ChannelId], config: &ChannelConfig ) -> Result<(), APIError>

Atomically updates the ChannelConfig for the given channels.

Once the updates are applied, each eligible channel (advertised with a known short channel ID and a change in forwarding_fee_proportional_millionths, forwarding_fee_base_msat, or cltv_expiry_delta) has a BroadcastChannelUpdate event message generated containing the new ChannelUpdate message which should be broadcast to the network.

Returns ChannelUnavailable when a channel is not found or an incorrect counterparty_node_id is provided.

Returns APIMisuseError when a cltv_expiry_delta update is to be applied with a value below MIN_CLTV_EXPIRY_DELTA.

If an error is returned, none of the updates should be considered applied.

source

pub fn forward_intercepted_htlc( &self, intercept_id: InterceptId, next_hop_channel_id: &ChannelId, next_node_id: PublicKey, amt_to_forward_msat: u64 ) -> Result<(), APIError>

Attempts to forward an intercepted HTLC over the provided channel id and with the provided amount to forward. Should only be called in response to an HTLCIntercepted event.

Intercepted HTLCs can be useful for Lightning Service Providers (LSPs) to open a just-in-time channel to a receiving node if the node lacks sufficient inbound liquidity.

To make use of intercepted HTLCs, set UserConfig::accept_intercept_htlcs and use ChannelManager::get_intercept_scid to generate short channel id(s) to put in the receiver’s invoice route hints. These route hints will signal to LDK to generate an HTLCIntercepted event when it receives the forwarded HTLC, and this method or ChannelManager::fail_intercepted_htlc MUST be called in response to the event.

Note that LDK does not enforce fee requirements in amt_to_forward_msat, and will not stop you from forwarding more than you received. See HTLCIntercepted::expected_outbound_amount_msat for more on forwarding a different amount than expected.

Errors if the event was not handled in time, in which case the HTLC was automatically failed backwards.

source

pub fn fail_intercepted_htlc( &self, intercept_id: InterceptId ) -> Result<(), APIError>

Fails the intercepted HTLC indicated by intercept_id. Should only be called in response to an HTLCIntercepted event. See ChannelManager::forward_intercepted_htlc.

Errors if the event was not handled in time, in which case the HTLC was automatically failed backwards.

source

pub fn process_pending_htlc_forwards(&self)

Processes HTLCs which are pending waiting on random forward delay.

Should only really ever be called in response to a PendingHTLCsForwardable event. Will likely generate further events.

source

pub fn timer_tick_occurred(&self)

Performs actions which should happen on startup and roughly once per minute thereafter.

This currently includes:

  • Increasing or decreasing the on-chain feerate estimates for our outbound channels,
  • Broadcasting ChannelUpdate messages if we’ve been disconnected from our peer for more than a minute, informing the network that they should no longer attempt to route over the channel.
  • Expiring a channel’s previous ChannelConfig if necessary to only allow forwarding HTLCs with the current ChannelConfig.
  • Removing peers which have disconnected but and no longer have any channels.
  • Force-closing and removing channels which have not completed establishment in a timely manner.
  • Forgetting about stale outbound payments, either those that have already been fulfilled or those awaiting an invoice that hasn’t been delivered in the necessary amount of time. The latter is determined using the system clock in std and the highest seen block time minus two hours in no-std.

Note that this may cause reentrancy through chain::Watch::update_channel calls or feerate estimate fetches.

source

pub fn fail_htlc_backwards(&self, payment_hash: &PaymentHash)

Indicates that the preimage for payment_hash is unknown or the received amount is incorrect after a PaymentClaimable event, failing the HTLC back to its origin and freeing resources along the path (including in our own channel on which we received it).

Note that in some cases around unclean shutdown, it is possible the payment may have already been claimed by you via ChannelManager::claim_funds prior to you seeing (a second copy of) the events::Event::PaymentClaimable event. Alternatively, the payment may have already been failed automatically by LDK if it was nearing its expiration time.

While LDK will never claim a payment automatically on your behalf (i.e. without you calling ChannelManager::claim_funds), you should still monitor for events::Event::PaymentClaimed events even for payments you intend to fail, especially on startup during which time claims that were in-progress at shutdown may be replayed.

source

pub fn fail_htlc_backwards_with_reason( &self, payment_hash: &PaymentHash, failure_code: FailureCode )

This is a variant of ChannelManager::fail_htlc_backwards that allows you to specify the reason for the failure.

See FailureCode for valid failure codes.

source

pub fn claim_funds(&self, payment_preimage: PaymentPreimage)

Provides a payment preimage in response to Event::PaymentClaimable, generating any MessageSendEvents needed to claim the payment.

This method is guaranteed to ensure the payment has been claimed but only if the current height is strictly below Event::PaymentClaimable::claim_deadline. To avoid race conditions, you should wait for an Event::PaymentClaimed before considering the payment successful. It will generally be available in the next process_pending_events call.

Note that if you did not set an amount_msat when calling create_inbound_payment or create_inbound_payment_for_hash you must check that the amount in the PaymentClaimable event matches your expectation. If you fail to do so and call this method, you may provide the sender “proof-of-payment” when they did not fulfill the full expected payment.

This function will fail the payment if it has custom TLVs with even type numbers, as we will assume they are unknown. If you intend to accept even custom TLVs, you should use claim_funds_with_known_custom_tlvs.

source

pub fn claim_funds_with_known_custom_tlvs( &self, payment_preimage: PaymentPreimage )

This is a variant of claim_funds that allows accepting a payment with custom TLVs with even type numbers.

§Note

You MUST check you’ve understood all even TLVs before using this to claim, otherwise you may unintentionally agree to some protocol you do not understand.

source

pub fn get_our_node_id(&self) -> PublicKey

Gets the node_id held by this ChannelManager

source

pub fn accept_inbound_channel( &self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128 ) -> Result<(), APIError>

Accepts a request to open a channel after a Event::OpenChannelRequest.

The temporary_channel_id parameter indicates which inbound channel should be accepted, and the counterparty_node_id parameter is the id of the peer which has requested to open the channel.

The user_channel_id parameter will be provided back in Event::ChannelClosed::user_channel_id to allow tracking of which events correspond with which accept_inbound_channel/accept_inbound_channel_from_trusted_peer_0conf call.

Note that this method will return an error and reject the channel, if it requires support for zero confirmations. Instead, accept_inbound_channel_from_trusted_peer_0conf must be used to accept such channels.

source

pub fn accept_inbound_channel_from_trusted_peer_0conf( &self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128 ) -> Result<(), APIError>

Accepts a request to open a channel after a events::Event::OpenChannelRequest, treating it as confirmed immediately.

The user_channel_id parameter will be provided back in Event::ChannelClosed::user_channel_id to allow tracking of which events correspond with which accept_inbound_channel/accept_inbound_channel_from_trusted_peer_0conf call.

Unlike ChannelManager::accept_inbound_channel, this method accepts the incoming channel and (if the counterparty agrees), enables forwarding of payments immediately.

This fully trusts that the counterparty has honestly and correctly constructed the funding transaction and blindly assumes that it will eventually confirm.

If it does not confirm before we decide to close the channel, or if the funding transaction does not pay to the correct script the correct amount, you will lose funds.

source

pub fn create_offer_builder( &self, description: String ) -> Result<OfferBuilder<'_, DerivedMetadata, All>, Bolt12SemanticError>

Creates an OfferBuilder such that the Offer it builds is recognized by the ChannelManager when handling InvoiceRequest messages for the offer. The offer will not have an expiration unless otherwise set on the builder.

§Privacy

Uses MessageRouter::create_blinded_paths to construct a BlindedPath for the offer. However, if one is not found, uses a one-hop BlindedPath with ChannelManager::get_our_node_id as the introduction node instead. In the latter case, the node must be announced, otherwise, there is no way to find a path to the introduction in order to send the InvoiceRequest.

Also, uses a derived signing pubkey in the offer for recipient privacy.

§Limitations

Requires a direct connection to the introduction node in the responding InvoiceRequest’s reply path.

§Errors

Errors if the parameterized Router is unable to create a blinded path for the offer.

This is not exported to bindings users as builder patterns don’t map outside of move semantics.

source

pub fn create_refund_builder( &self, description: String, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId, retry_strategy: Retry, max_total_routing_fee_msat: Option<u64> ) -> Result<RefundBuilder<'_, All>, Bolt12SemanticError>

Creates a RefundBuilder such that the Refund it builds is recognized by the ChannelManager when handling Bolt12Invoice messages for the refund.

§Payment

The provided payment_id is used to ensure that only one invoice is paid for the refund. See Avoiding Duplicate Payments for other requirements once the payment has been sent.

The builder will have the provided expiration set. Any changes to the expiration on the returned builder will not be honored by ChannelManager. For no-std, the highest seen block time minus two hours is used for the current time when determining if the refund has expired.

To revoke the refund, use ChannelManager::abandon_payment prior to receiving the invoice. If abandoned, or an invoice isn’t received before expiration, the payment will fail with an Event::InvoiceRequestFailed.

If max_total_routing_fee_msat is not specified, The default from RouteParameters::from_payment_params_and_value is applied.

§Privacy

Uses MessageRouter::create_blinded_paths to construct a BlindedPath for the refund. However, if one is not found, uses a one-hop BlindedPath with ChannelManager::get_our_node_id as the introduction node instead. In the latter case, the node must be announced, otherwise, there is no way to find a path to the introduction in order to send the Bolt12Invoice.

Also, uses a derived payer id in the refund for payer privacy.

§Limitations

Requires a direct connection to an introduction node in the responding Bolt12Invoice::payment_paths.

§Errors

Errors if:

  • a duplicate payment_id is provided given the caveats in the aforementioned link,
  • amount_msats is invalid, or
  • the parameterized Router is unable to create a blinded path for the refund.

This is not exported to bindings users as builder patterns don’t map outside of move semantics.

source

pub fn pay_for_offer( &self, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>, payer_note: Option<String>, payment_id: PaymentId, retry_strategy: Retry, max_total_routing_fee_msat: Option<u64> ) -> Result<(), Bolt12SemanticError>

Pays for an Offer using the given parameters by creating an InvoiceRequest and enqueuing it to be sent via an onion message. ChannelManager will pay the actual Bolt12Invoice once it is received.

Uses InvoiceRequestBuilder such that the InvoiceRequest it builds is recognized by the ChannelManager when handling a Bolt12Invoice message in response to the request. The optional parameters are used in the builder, if Some:

If max_total_routing_fee_msat is not specified, The default from RouteParameters::from_payment_params_and_value is applied.

§Payment

The provided payment_id is used to ensure that only one invoice is paid for the request when received. See Avoiding Duplicate Payments for other requirements once the payment has been sent.

To revoke the request, use ChannelManager::abandon_payment prior to receiving the invoice. If abandoned, or an invoice isn’t received in a reasonable amount of time, the payment will fail with an Event::InvoiceRequestFailed.

§Privacy

Uses a one-hop BlindedPath for the reply path with ChannelManager::get_our_node_id as the introduction node and a derived payer id for payer privacy. As such, currently, the node must be announced. Otherwise, there is no way to find a path to the introduction node in order to send the Bolt12Invoice.

§Limitations

Requires a direct connection to an introduction node in Offer::paths or to Offer::signing_pubkey, if empty. A similar restriction applies to the responding Bolt12Invoice::payment_paths.

§Errors

Errors if:

  • a duplicate payment_id is provided given the caveats in the aforementioned link,
  • the provided parameters are invalid for the offer,
  • the parameterized Router is unable to create a blinded reply path for the invoice request.
source

pub fn request_refund_payment( &self, refund: &Refund ) -> Result<(), Bolt12SemanticError>

Creates a Bolt12Invoice for a Refund and enqueues it to be sent via an onion message.

The resulting invoice uses a PaymentHash recognized by the ChannelManager and a BlindedPath containing the PaymentSecret needed to reconstruct the corresponding PaymentPreimage.

§Limitations

Requires a direct connection to an introduction node in Refund::paths or to Refund::payer_id, if empty. This request is best effort; an invoice will be sent to each node meeting the aforementioned criteria, but there’s no guarantee that they will be received and no retries will be made.

§Errors

Errors if the parameterized Router is unable to create a blinded payment path or reply path for the invoice.

source

pub fn create_inbound_payment( &self, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32, min_final_cltv_expiry_delta: Option<u16> ) -> Result<(PaymentHash, PaymentSecret), ()>

Gets a payment secret and payment hash for use in an invoice given to a third party wishing to pay us.

This differs from create_inbound_payment_for_hash only in that it generates the PaymentHash and PaymentPreimage for you.

The PaymentPreimage will ultimately be returned to you in the PaymentClaimable, which will have the PaymentClaimable::purpose be PaymentPurpose::InvoicePayment with its PaymentPurpose::InvoicePayment::payment_preimage field filled in. That should then be passed directly to claim_funds.

See create_inbound_payment_for_hash for detailed documentation on behavior and requirements.

Note that a malicious eavesdropper can intuit whether an inbound payment was created by create_inbound_payment or create_inbound_payment_for_hash based on runtime.

§Note

If you register an inbound payment with this method, then serialize the ChannelManager, then deserialize it with a node running 0.0.103 and earlier, the payment will fail to be received.

Errors if min_value_msat is greater than total bitcoin supply.

If min_final_cltv_expiry_delta is set to some value, then the payment will not be receivable on versions of LDK prior to 0.0.114.

source

pub fn create_inbound_payment_for_hash( &self, payment_hash: PaymentHash, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32, min_final_cltv_expiry: Option<u16> ) -> Result<PaymentSecret, ()>

Gets a PaymentSecret for a given PaymentHash, for which the payment preimage is stored external to LDK.

A PaymentClaimable event will only be generated if the PaymentSecret matches a payment secret fetched via this method or create_inbound_payment, and which is at least the min_value_msat provided here, if one is provided.

The PaymentHash (and corresponding PaymentPreimage) should be globally unique, though note that LDK will not stop you from registering duplicate payment hashes for inbound payments.

min_value_msat should be set if the invoice being generated contains a value. Any payment received for the returned PaymentHash will be required to be at least min_value_msat before a PaymentClaimable event will be generated, ensuring that we do not provide the sender “proof-of-payment” unless they have paid the required amount.

invoice_expiry_delta_secs describes the number of seconds that the invoice is valid for in excess of the current time. This should roughly match the expiry time set in the invoice. After this many seconds, we will remove the inbound payment, resulting in any attempts to pay the invoice failing. The BOLT spec suggests 3,600 secs as a default validity time for invoices when no timeout is set.

Note that we use block header time to time-out pending inbound payments (with some margin to compensate for the inaccuracy of block header timestamps). Thus, in practice we will accept a payment and generate a PaymentClaimable event for some time after the expiry. If you need exact expiry semantics, you should enforce them upon receipt of PaymentClaimable.

Note that invoices generated for inbound payments should have their min_final_cltv_expiry_delta set to at least MIN_FINAL_CLTV_EXPIRY_DELTA.

Note that a malicious eavesdropper can intuit whether an inbound payment was created by create_inbound_payment or create_inbound_payment_for_hash based on runtime.

§Note

If you register an inbound payment with this method, then serialize the ChannelManager, then deserialize it with a node running 0.0.103 and earlier, the payment will fail to be received.

Errors if min_value_msat is greater than total bitcoin supply.

If min_final_cltv_expiry_delta is set to some value, then the payment will not be receivable on versions of LDK prior to 0.0.114.

source

pub fn get_payment_preimage( &self, payment_hash: PaymentHash, payment_secret: PaymentSecret ) -> Result<PaymentPreimage, APIError>

Gets an LDK-generated payment preimage from a payment hash and payment secret that were previously returned from create_inbound_payment.

source

pub fn get_phantom_scid(&self) -> u64

Gets a fake short channel id for use in receiving phantom node payments. These fake scids are used when constructing the phantom invoice’s route hints.

source

pub fn get_phantom_route_hints(&self) -> PhantomRouteHints

Gets route hints for use in receiving phantom node payments.

source

pub fn get_intercept_scid(&self) -> u64

Gets a fake short channel id for use in receiving intercepted payments. These fake scids are used when constructing the route hints for HTLCs intended to be intercepted. See ChannelManager::forward_intercepted_htlc.

Note that this method is not guaranteed to return unique values, you may need to call it a few times to get a unique scid.

source

pub fn compute_inflight_htlcs(&self) -> InFlightHtlcs

Gets inflight HTLC information by processing pending outbound payments that are in our channels. May be used during pathfinding to account for in-use channel liquidity.

source

pub async fn process_pending_events_async<Future: Future, H: Fn(Event) -> Future>( &self, handler: H )

Processes any events asynchronously in the order they were generated since the last call using the given event handler.

See the trait-level documentation of EventsProvider for requirements.

source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> ChannelManager<M, T, ES, NS, SP, F, R, L>

source

pub fn get_event_or_persistence_needed_future(&self) -> Future

Gets a Future that completes when this ChannelManager may need to be persisted or may have events that need processing.

In order to check if this ChannelManager needs persisting, call Self::get_and_clear_needs_persistence.

Note that callbacks registered on the Future MUST NOT call back into this ChannelManager and should instead register actions to be taken later.

source

pub fn get_and_clear_needs_persistence(&self) -> bool

Returns true if this ChannelManager needs to be persisted.

source

pub fn current_best_block(&self) -> BestBlock

Gets the latest best block which was connected either via the chain::Listen or chain::Confirm interfaces.

source

pub fn node_features(&self) -> NodeFeatures

Fetches the set of NodeFeatures flags that are provided by or required by ChannelManager.

source

pub fn channel_features(&self) -> ChannelFeatures

Fetches the set of ChannelFeatures flags that are provided by or required by ChannelManager.

source

pub fn channel_type_features(&self) -> ChannelTypeFeatures

Fetches the set of ChannelTypeFeatures flags that are provided by or required by ChannelManager.

source

pub fn init_features(&self) -> InitFeatures

Fetches the set of InitFeatures flags that are provided by or required by ChannelManager.

Trait Implementations§

source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> AChannelManager for ChannelManager<M, T, ES, NS, SP, F, R, L>

§

type Watch = <M as Deref>::Target

A type implementing chain::Watch.
§

type M = M

A type that may be dereferenced to Self::Watch.
§

type Broadcaster = <T as Deref>::Target

A type implementing BroadcasterInterface.
§

type T = T

A type that may be dereferenced to Self::Broadcaster.
§

type EntropySource = <ES as Deref>::Target

A type implementing EntropySource.
§

type ES = ES

A type that may be dereferenced to Self::EntropySource.
§

type NodeSigner = <NS as Deref>::Target

A type implementing NodeSigner.
§

type NS = NS

A type that may be dereferenced to Self::NodeSigner.
§

type Signer = <<SP as Deref>::Target as SignerProvider>::EcdsaSigner

A type implementing WriteableEcdsaChannelSigner.
§

type SignerProvider = <SP as Deref>::Target

A type implementing SignerProvider for Self::Signer.
§

type SP = SP

A type that may be dereferenced to Self::SignerProvider.
§

type FeeEstimator = <F as Deref>::Target

A type implementing FeeEstimator.
§

type F = F

A type that may be dereferenced to Self::FeeEstimator.
§

type Router = <R as Deref>::Target

A type implementing Router.
§

type R = R

A type that may be dereferenced to Self::Router.
§

type Logger = <L as Deref>::Target

A type implementing Logger.
§

type L = L

A type that may be dereferenced to Self::Logger.
source§

fn get_cm(&self) -> &ChannelManager<M, T, ES, NS, SP, F, R, L>

Returns a reference to the actual ChannelManager object.
source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> ChannelMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, L>

source§

fn handle_open_channel( &self, counterparty_node_id: &PublicKey, msg: &OpenChannel )

Handle an incoming open_channel message from the given peer.
source§

fn handle_open_channel_v2( &self, counterparty_node_id: &PublicKey, msg: &OpenChannelV2 )

Handle an incoming open_channel2 message from the given peer.
source§

fn handle_accept_channel( &self, counterparty_node_id: &PublicKey, msg: &AcceptChannel )

Handle an incoming accept_channel message from the given peer.
source§

fn handle_accept_channel_v2( &self, counterparty_node_id: &PublicKey, msg: &AcceptChannelV2 )

Handle an incoming accept_channel2 message from the given peer.
source§

fn handle_funding_created( &self, counterparty_node_id: &PublicKey, msg: &FundingCreated )

Handle an incoming funding_created message from the given peer.
source§

fn handle_funding_signed( &self, counterparty_node_id: &PublicKey, msg: &FundingSigned )

Handle an incoming funding_signed message from the given peer.
source§

fn handle_channel_ready( &self, counterparty_node_id: &PublicKey, msg: &ChannelReady )

Handle an incoming channel_ready message from the given peer.
source§

fn handle_stfu(&self, counterparty_node_id: &PublicKey, msg: &Stfu)

Handle an incoming stfu message from the given peer.
source§

fn handle_splice(&self, counterparty_node_id: &PublicKey, msg: &Splice)

Handle an incoming splice message from the given peer.
source§

fn handle_splice_ack(&self, counterparty_node_id: &PublicKey, msg: &SpliceAck)

Handle an incoming splice_ack message from the given peer.
source§

fn handle_splice_locked( &self, counterparty_node_id: &PublicKey, msg: &SpliceLocked )

Handle an incoming splice_locked message from the given peer.
source§

fn handle_shutdown(&self, counterparty_node_id: &PublicKey, msg: &Shutdown)

Handle an incoming shutdown message from the given peer.
source§

fn handle_closing_signed( &self, counterparty_node_id: &PublicKey, msg: &ClosingSigned )

Handle an incoming closing_signed message from the given peer.
source§

fn handle_update_add_htlc( &self, counterparty_node_id: &PublicKey, msg: &UpdateAddHTLC )

Handle an incoming update_add_htlc message from the given peer.
source§

fn handle_update_fulfill_htlc( &self, counterparty_node_id: &PublicKey, msg: &UpdateFulfillHTLC )

Handle an incoming update_fulfill_htlc message from the given peer.
source§

fn handle_update_fail_htlc( &self, counterparty_node_id: &PublicKey, msg: &UpdateFailHTLC )

Handle an incoming update_fail_htlc message from the given peer.
source§

fn handle_update_fail_malformed_htlc( &self, counterparty_node_id: &PublicKey, msg: &UpdateFailMalformedHTLC )

Handle an incoming update_fail_malformed_htlc message from the given peer.
source§

fn handle_commitment_signed( &self, counterparty_node_id: &PublicKey, msg: &CommitmentSigned )

Handle an incoming commitment_signed message from the given peer.
source§

fn handle_revoke_and_ack( &self, counterparty_node_id: &PublicKey, msg: &RevokeAndACK )

Handle an incoming revoke_and_ack message from the given peer.
source§

fn handle_update_fee(&self, counterparty_node_id: &PublicKey, msg: &UpdateFee)

Handle an incoming update_fee message from the given peer.
source§

fn handle_announcement_signatures( &self, counterparty_node_id: &PublicKey, msg: &AnnouncementSignatures )

Handle an incoming announcement_signatures message from the given peer.
source§

fn handle_channel_update( &self, counterparty_node_id: &PublicKey, msg: &ChannelUpdate )

Handle an incoming channel_update message from the given peer.
source§

fn handle_channel_reestablish( &self, counterparty_node_id: &PublicKey, msg: &ChannelReestablish )

Handle an incoming channel_reestablish message from the given peer.
source§

fn peer_disconnected(&self, counterparty_node_id: &PublicKey)

Indicates a connection to the peer failed/an existing connection was lost.
source§

fn peer_connected( &self, counterparty_node_id: &PublicKey, init_msg: &Init, inbound: bool ) -> Result<(), ()>

Handle a peer reconnecting, possibly generating channel_reestablish message(s). Read more
source§

fn handle_error(&self, counterparty_node_id: &PublicKey, msg: &ErrorMessage)

Handle an incoming error message from the given peer.
source§

fn provided_node_features(&self) -> NodeFeatures

Gets the node feature flags which this handler itself supports. All available handlers are queried similarly and their feature flags are OR’d together to form the NodeFeatures which are broadcasted in our NodeAnnouncement message.
source§

fn provided_init_features( &self, _their_init_features: &PublicKey ) -> InitFeatures

Gets the init feature flags which should be sent to the given peer. All available handlers are queried similarly and their feature flags are OR’d together to form the InitFeatures which are sent in our Init message. Read more
source§

fn get_chain_hashes(&self) -> Option<Vec<ChainHash>>

Gets the chain hashes for this ChannelMessageHandler indicating which chains it supports. Read more
source§

fn handle_tx_add_input( &self, counterparty_node_id: &PublicKey, msg: &TxAddInput )

Handle an incoming tx_add_input message from the given peer.
source§

fn handle_tx_add_output( &self, counterparty_node_id: &PublicKey, msg: &TxAddOutput )

Handle an incoming tx_add_output message from the given peer.
source§

fn handle_tx_remove_input( &self, counterparty_node_id: &PublicKey, msg: &TxRemoveInput )

Handle an incoming tx_remove_input message from the given peer.
source§

fn handle_tx_remove_output( &self, counterparty_node_id: &PublicKey, msg: &TxRemoveOutput )

Handle an incoming tx_remove_output message from the given peer.
source§

fn handle_tx_complete(&self, counterparty_node_id: &PublicKey, msg: &TxComplete)

Handle an incoming tx_complete message from the given peer.
source§

fn handle_tx_signatures( &self, counterparty_node_id: &PublicKey, msg: &TxSignatures )

Handle an incoming tx_signatures message from the given peer.
source§

fn handle_tx_init_rbf(&self, counterparty_node_id: &PublicKey, msg: &TxInitRbf)

Handle an incoming tx_init_rbf message from the given peer.
source§

fn handle_tx_ack_rbf(&self, counterparty_node_id: &PublicKey, msg: &TxAckRbf)

Handle an incoming tx_ack_rbf message from the given peer.
source§

fn handle_tx_abort(&self, counterparty_node_id: &PublicKey, msg: &TxAbort)

Handle an incoming tx_abort message from the given peer.
source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> Confirm for ChannelManager<M, T, ES, NS, SP, F, R, L>

source§

fn transactions_confirmed( &self, header: &Header, txdata: &TransactionData<'_>, height: u32 )

Notifies LDK of transactions confirmed in a block with a given header and height. Read more
source§

fn best_block_updated(&self, header: &Header, height: u32)

Notifies LDK of an update to the best header connected at the given height. Read more
source§

fn get_relevant_txids(&self) -> Vec<(Txid, u32, Option<BlockHash>)>

Returns transactions that must be monitored for reorganization out of the chain along with the height and the hash of the block as part of which it had been previously confirmed. Read more
source§

fn transaction_unconfirmed(&self, txid: &Txid)

Notifies LDK of a transaction that is no longer confirmed as result of a chain reorganization. Read more
source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> EventsProvider for ChannelManager<M, T, ES, NS, SP, F, R, L>

source§

fn process_pending_events<H: Deref>(&self, handler: H)
where H::Target: EventHandler,

Processes events that must be periodically handled.

An EventHandler may safely call back to the provider in order to handle an event. However, it must not call Writeable::write as doing so would result in a deadlock.

source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> Listen for ChannelManager<M, T, ES, NS, SP, F, R, L>

source§

fn filtered_block_connected( &self, header: &Header, txdata: &TransactionData<'_>, height: u32 )

Notifies the listener that a block was added at the given height, with the transaction data possibly filtered.
source§

fn block_disconnected(&self, header: &Header, height: u32)

Notifies the listener that a block was removed at the given height.
source§

fn block_connected(&self, block: &Block, height: u32)

Notifies the listener that a block was added at the given height.
source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> MessageSendEventsProvider for ChannelManager<M, T, ES, NS, SP, F, R, L>

source§

fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent>

Returns MessageSendEvents strictly ordered per-peer, in the order they were generated. The returned array will contain MessageSendEvents for different peers if MessageSendEvents to more than one peer exists, but MessageSendEvents to the same peer is always placed next to each other.

Note that that while MessageSendEvents are strictly ordered per-peer, the peer order for the chunks of MessageSendEvents for different peers is random. I.e. if the array contains MessageSendEvents for both node_a and node_b, the MessageSendEvents for node_a will randomly be placed first or last in the returned array.

Note that even though BroadcastChannelAnnouncement and BroadcastChannelUpdate MessageSendEvents are intended to be broadcasted to all peers, they will be pleaced among the MessageSendEvents to the specific peer they were generated under.

source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> OffersMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, L>

source§

fn handle_message(&self, message: OffersMessage) -> Option<OffersMessage>

Handles the given message by either responding with an Bolt12Invoice, sending a payment, or replying with an error. Read more
source§

fn release_pending_messages(&self) -> Vec<PendingOnionMessage<OffersMessage>>

Available on non-c_bindings only.
Releases any OffersMessages that need to be sent. Read more
source§

impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> Writeable for ChannelManager<M, T, ES, NS, SP, F, R, L>

source§

fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error>

Writes self out to the given Writer.
source§

fn encode(&self) -> Vec<u8>

Writes self out to a Vec<u8>.
source§

fn serialized_length(&self) -> usize

Gets the length of this object after it has been serialized. This can be overridden to optimize cases where we prepend an object with its length.

Auto Trait Implementations§

§

impl<M, T, ES, NS, SP, F, R, L> !Freeze for ChannelManager<M, T, ES, NS, SP, F, R, L>

§

impl<M, T, ES, NS, SP, F, R, L> RefUnwindSafe for ChannelManager<M, T, ES, NS, SP, F, R, L>

§

impl<M, T, ES, NS, SP, F, R, L> Send for ChannelManager<M, T, ES, NS, SP, F, R, L>
where <R as Deref>::Target: MessageRouter, M: Send, T: Send, R: Send, ES: Send, NS: Send, SP: Send, L: Send, F: Send, <<SP as Deref>::Target as SignerProvider>::EcdsaSigner: Send,

§

impl<M, T, ES, NS, SP, F, R, L> Sync for ChannelManager<M, T, ES, NS, SP, F, R, L>
where <R as Deref>::Target: MessageRouter, M: Sync, T: Sync, R: Sync, ES: Sync, NS: Sync, SP: Sync, L: Sync, F: Sync, <<SP as Deref>::Target as SignerProvider>::EcdsaSigner: Send,

§

impl<M, T, ES, NS, SP, F, R, L> Unpin for ChannelManager<M, T, ES, NS, SP, F, R, L>
where <R as Deref>::Target: MessageRouter, M: Unpin, T: Unpin, R: Unpin, ES: Unpin, NS: Unpin, SP: Unpin, L: Unpin, F: Unpin, <<SP as Deref>::Target as SignerProvider>::EcdsaSigner: Unpin,

§

impl<M, T, ES, NS, SP, F, R, L> UnwindSafe for ChannelManager<M, T, ES, NS, SP, F, R, L>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.