* or used independently to monitor channels remotely. See the [module-level documentation] for
* details.
*
+ * Note that `ChainMonitor` should regularly trigger rebroadcasts/fee bumps of pending claims from
+ * a force-closed channel. This is crucial in preventing certain classes of pinning attacks,
+ * detecting substantial mempool feerate changes between blocks, and ensuring reliability if
+ * broadcasting fails. We recommend invoking this every 30 seconds, or lower if running in an
+ * environment with spotty connections, like on mobile.
+ *
* [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
* [module-level documentation]: crate::chain::chainmonitor
+ * [`rebroadcast_pending_claims`]: Self::rebroadcast_pending_claims
*/
@SuppressWarnings("unchecked") // We correctly assign various generic arrays
public class ChainMonitor extends CommonBase {
* always need to fetch full blocks absent another means for determining which blocks contain
* transactions relevant to the watched channels.
*/
- public static ChainMonitor of(Option_FilterZ chain_source, BroadcasterInterface broadcaster, Logger logger, FeeEstimator feeest, Persist persister) {
+ public static ChainMonitor of(org.ldk.structs.Option_FilterZ chain_source, org.ldk.structs.BroadcasterInterface broadcaster, org.ldk.structs.Logger logger, org.ldk.structs.FeeEstimator feeest, org.ldk.structs.Persist persister) {
long ret = bindings.ChainMonitor_new(chain_source.ptr, broadcaster == null ? 0 : broadcaster.ptr, logger == null ? 0 : logger.ptr, feeest == null ? 0 : feeest.ptr, persister == null ? 0 : persister.ptr);
Reference.reachabilityFence(chain_source);
Reference.reachabilityFence(broadcaster);
* Note that the result holds a mutex over our monitor set, and should not be held
* indefinitely.
*/
- public Result_LockedChannelMonitorNoneZ get_monitor(OutPoint funding_txo) {
+ public Result_LockedChannelMonitorNoneZ get_monitor(org.ldk.structs.OutPoint funding_txo) {
long ret = bindings.ChainMonitor_get_monitor(this.ptr, funding_txo == null ? 0 : funding_txo.ptr);
Reference.reachabilityFence(this);
Reference.reachabilityFence(funding_txo);
return ret_conv_10_arr;
}
+ /**
+ * Lists the pending updates for each [`ChannelMonitor`] (by `OutPoint` being monitored).
+ */
+ public TwoTuple_OutPointCVec_MonitorUpdateIdZZ[] list_pending_monitor_updates() {
+ long[] ret = bindings.ChainMonitor_list_pending_monitor_updates(this.ptr);
+ Reference.reachabilityFence(this);
+ int ret_conv_41_len = ret.length;
+ TwoTuple_OutPointCVec_MonitorUpdateIdZZ[] ret_conv_41_arr = new TwoTuple_OutPointCVec_MonitorUpdateIdZZ[ret_conv_41_len];
+ for (int p = 0; p < ret_conv_41_len; p++) {
+ long ret_conv_41 = ret[p];
+ TwoTuple_OutPointCVec_MonitorUpdateIdZZ ret_conv_41_hu_conv = new TwoTuple_OutPointCVec_MonitorUpdateIdZZ(null, ret_conv_41);
+ if (ret_conv_41_hu_conv != null) { ret_conv_41_hu_conv.ptrs_to.add(this); };
+ ret_conv_41_arr[p] = ret_conv_41_hu_conv;
+ }
+ return ret_conv_41_arr;
+ }
+
/**
* Indicates the persistence of a [`ChannelMonitor`] has completed after
- * [`ChannelMonitorUpdateErr::TemporaryFailure`] was returned from an update operation.
+ * [`ChannelMonitorUpdateStatus::InProgress`] was returned from an update operation.
*
* Thus, the anticipated use is, at a high level:
* 1) This [`ChainMonitor`] calls [`Persist::update_persisted_channel`] which stores the
* update to disk and begins updating any remote (e.g. watchtower/backup) copies,
- * returning [`ChannelMonitorUpdateErr::TemporaryFailure`],
+ * returning [`ChannelMonitorUpdateStatus::InProgress`],
* 2) once all remote copies are updated, you call this function with the
* `completed_update_id` that completed, and once all pending updates have completed the
* channel will be re-enabled.
* Returns an [`APIError::APIMisuseError`] if `funding_txo` does not match any currently
* registered [`ChannelMonitor`]s.
*/
- public Result_NoneAPIErrorZ channel_monitor_updated(OutPoint funding_txo, MonitorUpdateId completed_update_id) {
+ public Result_NoneAPIErrorZ channel_monitor_updated(org.ldk.structs.OutPoint funding_txo, org.ldk.structs.MonitorUpdateId completed_update_id) {
long ret = bindings.ChainMonitor_channel_monitor_updated(this.ptr, funding_txo == null ? 0 : funding_txo.ptr, completed_update_id == null ? 0 : completed_update_id.ptr);
Reference.reachabilityFence(this);
Reference.reachabilityFence(funding_txo);
return ret_hu_conv;
}
+ /**
+ * Gets a [`Future`] that completes when an event is available either via
+ * [`chain::Watch::release_pending_monitor_events`] or
+ * [`EventsProvider::process_pending_events`].
+ *
+ * Note that callbacks registered on the [`Future`] MUST NOT call back into this
+ * [`ChainMonitor`] and should instead register actions to be taken later.
+ *
+ * [`EventsProvider::process_pending_events`]: crate::events::EventsProvider::process_pending_events
+ */
+ public Future get_update_future() {
+ long ret = bindings.ChainMonitor_get_update_future(this.ptr);
+ Reference.reachabilityFence(this);
+ if (ret >= 0 && ret <= 4096) { return null; }
+ org.ldk.structs.Future ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Future(null, ret); }
+ if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(this); };
+ return ret_hu_conv;
+ }
+
+ /**
+ * Triggers rebroadcasts/fee-bumps of pending claims from a force-closed channel. This is
+ * crucial in preventing certain classes of pinning attacks, detecting substantial mempool
+ * feerate changes between blocks, and ensuring reliability if broadcasting fails. We recommend
+ * invoking this every 30 seconds, or lower if running in an environment with spotty
+ * connections, like on mobile.
+ */
+ public void rebroadcast_pending_claims() {
+ bindings.ChainMonitor_rebroadcast_pending_claims(this.ptr);
+ Reference.reachabilityFence(this);
+ }
+
/**
* Constructs a new Listen which calls the relevant methods on this_arg.
* This copies the `inner` pointer in this_arg and thus the returned Listen must be freed before this_arg is