X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fldk%2Fstructs%2FClosureReason.java;h=7c95760323ef93e4c840981b5ce75e8d4137e9bf;hb=300b54d26fe5ed89f472ef821ebf67d56c917e49;hp=b014fdb55f70561a706400fbbd2e510bb997e32d;hpb=32692e00046b7ec16b6a2e20bd54800b2b48d4c0;p=ldk-java diff --git a/src/main/java/org/ldk/structs/ClosureReason.java b/src/main/java/org/ldk/structs/ClosureReason.java index b014fdb5..7c957603 100644 --- a/src/main/java/org/ldk/structs/ClosureReason.java +++ b/src/main/java/org/ldk/structs/ClosureReason.java @@ -4,6 +4,7 @@ import org.ldk.impl.bindings; import org.ldk.enums.*; import org.ldk.util.*; import java.util.Arrays; +import java.lang.ref.Reference; import javax.annotation.Nullable; @@ -32,6 +33,9 @@ public class ClosureReason extends CommonBase { if (raw_val.getClass() == bindings.LDKClosureReason.CommitmentTxConfirmed.class) { return new CommitmentTxConfirmed(ptr, (bindings.LDKClosureReason.CommitmentTxConfirmed)raw_val); } + if (raw_val.getClass() == bindings.LDKClosureReason.FundingTimedOut.class) { + return new FundingTimedOut(ptr, (bindings.LDKClosureReason.FundingTimedOut)raw_val); + } if (raw_val.getClass() == bindings.LDKClosureReason.ProcessingError.class) { return new ProcessingError(ptr, (bindings.LDKClosureReason.ProcessingError)raw_val); } @@ -44,6 +48,12 @@ public class ClosureReason extends CommonBase { assert false; return null; // Unreachable without extending the (internal) bindings interface } + /** + * Closure generated from receiving a peer error message. + * + * Our counterparty may have broadcasted their latest commitment state, and we have + * as well. + */ public final static class CounterpartyForceClosed extends ClosureReason { /** * The error which the peer sent us. @@ -52,55 +62,106 @@ public class ClosureReason extends CommonBase { * or printed to stdout). Otherwise, a well crafted error message may exploit * a security vulnerability in the terminal emulator or the logging subsystem. */ - public final String peer_msg; + public final java.lang.String peer_msg; private CounterpartyForceClosed(long ptr, bindings.LDKClosureReason.CounterpartyForceClosed obj) { super(null, ptr); this.peer_msg = obj.peer_msg; } } + /** + * Closure generated from [`ChannelManager::force_close_channel`], called by the user. + * + * [`ChannelManager::force_close_channel`]: crate::ln::channelmanager::ChannelManager::force_close_channel. + */ public final static class HolderForceClosed extends ClosureReason { private HolderForceClosed(long ptr, bindings.LDKClosureReason.HolderForceClosed obj) { super(null, ptr); } } + /** + * The channel was closed after negotiating a cooperative close and we've now broadcasted + * the cooperative close transaction. Note the shutdown may have been initiated by us. + */ public final static class CooperativeClosure extends ClosureReason { private CooperativeClosure(long ptr, bindings.LDKClosureReason.CooperativeClosure obj) { super(null, ptr); } } + /** + * A commitment transaction was confirmed on chain, closing the channel. Most likely this + * commitment transaction came from our counterparty, but it may also have come from + * a copy of our own `ChannelMonitor`. + */ public final static class CommitmentTxConfirmed extends ClosureReason { private CommitmentTxConfirmed(long ptr, bindings.LDKClosureReason.CommitmentTxConfirmed obj) { super(null, ptr); } } + /** + * The funding transaction failed to confirm in a timely manner on an inbound channel. + */ + public final static class FundingTimedOut extends ClosureReason { + private FundingTimedOut(long ptr, bindings.LDKClosureReason.FundingTimedOut obj) { + super(null, ptr); + } + } + /** + * Closure generated from processing an event, likely a HTLC forward/relay/reception. + */ public final static class ProcessingError extends ClosureReason { /** * A developer-readable error message which we generated. */ - public final String err; + public final java.lang.String err; private ProcessingError(long ptr, bindings.LDKClosureReason.ProcessingError obj) { super(null, ptr); this.err = obj.err; } } + /** + * The peer disconnected prior to funding completing. In this case the spec mandates that we + * forget the channel entirely - we can attempt again if the peer reconnects. + * + * This includes cases where we restarted prior to funding completion, including prior to the + * initial [`ChannelMonitor`] persistence completing. + * + * In LDK versions prior to 0.0.107 this could also occur if we were unable to connect to the + * peer because of mutual incompatibility between us and our channel counterparty. + * + * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor + */ public final static class DisconnectedPeer extends ClosureReason { private DisconnectedPeer(long ptr, bindings.LDKClosureReason.DisconnectedPeer obj) { super(null, ptr); } } + /** + * Closure generated from `ChannelManager::read` if the [`ChannelMonitor`] is newer than + * the [`ChannelManager`] deserialized. + * + * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor + * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager + */ public final static class OutdatedChannelManager extends ClosureReason { private OutdatedChannelManager(long ptr, bindings.LDKClosureReason.OutdatedChannelManager obj) { super(null, ptr); } } + long clone_ptr() { + long ret = bindings.ClosureReason_clone_ptr(this.ptr); + Reference.reachabilityFence(this); + return ret; + } + /** * Creates a copy of the ClosureReason */ public ClosureReason clone() { long ret = bindings.ClosureReason_clone(this.ptr); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(this); + Reference.reachabilityFence(this); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(this); }; return ret_hu_conv; } @@ -109,9 +170,10 @@ public class ClosureReason extends CommonBase { */ public static ClosureReason counterparty_force_closed(java.lang.String peer_msg) { long ret = bindings.ClosureReason_counterparty_force_closed(peer_msg); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(ret_hu_conv); + Reference.reachabilityFence(peer_msg); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; return ret_hu_conv; } @@ -120,9 +182,9 @@ public class ClosureReason extends CommonBase { */ public static ClosureReason holder_force_closed() { long ret = bindings.ClosureReason_holder_force_closed(); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(ret_hu_conv); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; return ret_hu_conv; } @@ -131,9 +193,9 @@ public class ClosureReason extends CommonBase { */ public static ClosureReason cooperative_closure() { long ret = bindings.ClosureReason_cooperative_closure(); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(ret_hu_conv); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; return ret_hu_conv; } @@ -142,9 +204,20 @@ public class ClosureReason extends CommonBase { */ public static ClosureReason commitment_tx_confirmed() { long ret = bindings.ClosureReason_commitment_tx_confirmed(); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(ret_hu_conv); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; + return ret_hu_conv; + } + + /** + * Utility method to constructs a new FundingTimedOut-variant ClosureReason + */ + public static ClosureReason funding_timed_out() { + long ret = bindings.ClosureReason_funding_timed_out(); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; return ret_hu_conv; } @@ -153,9 +226,10 @@ public class ClosureReason extends CommonBase { */ public static ClosureReason processing_error(java.lang.String err) { long ret = bindings.ClosureReason_processing_error(err); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(ret_hu_conv); + Reference.reachabilityFence(err); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; return ret_hu_conv; } @@ -164,9 +238,9 @@ public class ClosureReason extends CommonBase { */ public static ClosureReason disconnected_peer() { long ret = bindings.ClosureReason_disconnected_peer(); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(ret_hu_conv); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; return ret_hu_conv; } @@ -175,17 +249,33 @@ public class ClosureReason extends CommonBase { */ public static ClosureReason outdated_channel_manager() { long ret = bindings.ClosureReason_outdated_channel_manager(); - if (ret >= 0 && ret < 1024) { return null; } - ClosureReason ret_hu_conv = ClosureReason.constr_from_ptr(ret); - ret_hu_conv.ptrs_to.add(ret_hu_conv); + if (ret >= 0 && ret <= 4096) { return null; } + org.ldk.structs.ClosureReason ret_hu_conv = org.ldk.structs.ClosureReason.constr_from_ptr(ret); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(ret_hu_conv); }; return ret_hu_conv; } + /** + * Checks if two ClosureReasons contain equal inner contents. + * This ignores pointers and is_owned flags and looks at the values in fields. + */ + public boolean eq(ClosureReason b) { + boolean ret = bindings.ClosureReason_eq(this.ptr, b == null ? 0 : b.ptr); + Reference.reachabilityFence(this); + Reference.reachabilityFence(b); + return ret; + } + + @Override public boolean equals(Object o) { + if (!(o instanceof ClosureReason)) return false; + return this.eq((ClosureReason)o); + } /** * Serialize the ClosureReason object into a byte array which can be read by ClosureReason_read */ public byte[] write() { byte[] ret = bindings.ClosureReason_write(this.ptr); + Reference.reachabilityFence(this); return ret; }