Merge pull request #69 from TheBlueMatt/main
[ldk-java] / src / main / java / org / ldk / structs / Event.java
1 package org.ldk.structs;
2
3 import org.ldk.impl.bindings;
4 import org.ldk.enums.*;
5 import org.ldk.util.*;
6 import java.util.Arrays;
7 import java.lang.ref.Reference;
8 import javax.annotation.Nullable;
9
10
11 /**
12  * An Event which you should probably take some action in response to.
13  * 
14  * Note that while Writeable and Readable are implemented for Event, you probably shouldn't use
15  * them directly as they don't round-trip exactly (for example FundingGenerationReady is never
16  * written as it makes no sense to respond to it after reconnecting to peers).
17  */
18 @SuppressWarnings("unchecked") // We correctly assign various generic arrays
19 public class Event extends CommonBase {
20         private Event(Object _dummy, long ptr) { super(ptr); }
21         @Override @SuppressWarnings("deprecation")
22         protected void finalize() throws Throwable {
23                 super.finalize();
24                 if (ptr != 0) { bindings.Event_free(ptr); }
25         }
26         static Event constr_from_ptr(long ptr) {
27                 bindings.LDKEvent raw_val = bindings.LDKEvent_ref_from_ptr(ptr);
28                 if (raw_val.getClass() == bindings.LDKEvent.FundingGenerationReady.class) {
29                         return new FundingGenerationReady(ptr, (bindings.LDKEvent.FundingGenerationReady)raw_val);
30                 }
31                 if (raw_val.getClass() == bindings.LDKEvent.PaymentReceived.class) {
32                         return new PaymentReceived(ptr, (bindings.LDKEvent.PaymentReceived)raw_val);
33                 }
34                 if (raw_val.getClass() == bindings.LDKEvent.PaymentSent.class) {
35                         return new PaymentSent(ptr, (bindings.LDKEvent.PaymentSent)raw_val);
36                 }
37                 if (raw_val.getClass() == bindings.LDKEvent.PaymentPathFailed.class) {
38                         return new PaymentPathFailed(ptr, (bindings.LDKEvent.PaymentPathFailed)raw_val);
39                 }
40                 if (raw_val.getClass() == bindings.LDKEvent.PaymentFailed.class) {
41                         return new PaymentFailed(ptr, (bindings.LDKEvent.PaymentFailed)raw_val);
42                 }
43                 if (raw_val.getClass() == bindings.LDKEvent.PendingHTLCsForwardable.class) {
44                         return new PendingHTLCsForwardable(ptr, (bindings.LDKEvent.PendingHTLCsForwardable)raw_val);
45                 }
46                 if (raw_val.getClass() == bindings.LDKEvent.SpendableOutputs.class) {
47                         return new SpendableOutputs(ptr, (bindings.LDKEvent.SpendableOutputs)raw_val);
48                 }
49                 if (raw_val.getClass() == bindings.LDKEvent.PaymentForwarded.class) {
50                         return new PaymentForwarded(ptr, (bindings.LDKEvent.PaymentForwarded)raw_val);
51                 }
52                 if (raw_val.getClass() == bindings.LDKEvent.ChannelClosed.class) {
53                         return new ChannelClosed(ptr, (bindings.LDKEvent.ChannelClosed)raw_val);
54                 }
55                 if (raw_val.getClass() == bindings.LDKEvent.DiscardFunding.class) {
56                         return new DiscardFunding(ptr, (bindings.LDKEvent.DiscardFunding)raw_val);
57                 }
58                 if (raw_val.getClass() == bindings.LDKEvent.PaymentPathSuccessful.class) {
59                         return new PaymentPathSuccessful(ptr, (bindings.LDKEvent.PaymentPathSuccessful)raw_val);
60                 }
61                 assert false; return null; // Unreachable without extending the (internal) bindings interface
62         }
63
64         /**
65          * Used to indicate that the client should generate a funding transaction with the given
66          * parameters and then call [`ChannelManager::funding_transaction_generated`].
67          * Generated in [`ChannelManager`] message handling.
68          * Note that *all inputs* in the funding transaction must spend SegWit outputs or your
69          * counterparty can steal your funds!
70          * 
71          * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
72          * [`ChannelManager::funding_transaction_generated`]: crate::ln::channelmanager::ChannelManager::funding_transaction_generated
73          */
74         public final static class FundingGenerationReady extends Event {
75                 /**
76                  * The random channel_id we picked which you'll need to pass into
77                  * ChannelManager::funding_transaction_generated.
78                 */
79                 public final byte[] temporary_channel_id;
80                 /**
81                  * The value, in satoshis, that the output should have.
82                 */
83                 public final long channel_value_satoshis;
84                 /**
85                  * The script which should be used in the transaction output.
86                 */
87                 public final byte[] output_script;
88                 /**
89                  * The `user_channel_id` value passed in to [`ChannelManager::create_channel`], or 0 for
90                  * an inbound channel.
91                  * 
92                  * [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
93                 */
94                 public final long user_channel_id;
95                 private FundingGenerationReady(long ptr, bindings.LDKEvent.FundingGenerationReady obj) {
96                         super(null, ptr);
97                         this.temporary_channel_id = obj.temporary_channel_id;
98                         this.channel_value_satoshis = obj.channel_value_satoshis;
99                         this.output_script = obj.output_script;
100                         this.user_channel_id = obj.user_channel_id;
101                 }
102         }
103         /**
104          * Indicates we've received money! Just gotta dig out that payment preimage and feed it to
105          * [`ChannelManager::claim_funds`] to get it....
106          * Note that if the preimage is not known, you should call
107          * [`ChannelManager::fail_htlc_backwards`] to free up resources for this HTLC and avoid
108          * network congestion.
109          * If you fail to call either [`ChannelManager::claim_funds`] or
110          * [`ChannelManager::fail_htlc_backwards`] within the HTLC's timeout, the HTLC will be
111          * automatically failed.
112          * 
113          * # Note
114          * LDK will not stop an inbound payment from being paid multiple times, so multiple
115          * `PaymentReceived` events may be generated for the same payment.
116          * 
117          * [`ChannelManager::claim_funds`]: crate::ln::channelmanager::ChannelManager::claim_funds
118          * [`ChannelManager::fail_htlc_backwards`]: crate::ln::channelmanager::ChannelManager::fail_htlc_backwards
119          */
120         public final static class PaymentReceived extends Event {
121                 /**
122                  * The hash for which the preimage should be handed to the ChannelManager. Note that LDK will
123                  * not stop you from registering duplicate payment hashes for inbound payments.
124                 */
125                 public final byte[] payment_hash;
126                 /**
127                  * The value, in thousandths of a satoshi, that this payment is for.
128                 */
129                 public final long amt;
130                 /**
131                  * Information for claiming this received payment, based on whether the purpose of the
132                  * payment is to pay an invoice or to send a spontaneous payment.
133                 */
134                 public final PaymentPurpose purpose;
135                 private PaymentReceived(long ptr, bindings.LDKEvent.PaymentReceived obj) {
136                         super(null, ptr);
137                         this.payment_hash = obj.payment_hash;
138                         this.amt = obj.amt;
139                         long purpose = obj.purpose;
140                         PaymentPurpose purpose_hu_conv = PaymentPurpose.constr_from_ptr(purpose);
141                         purpose_hu_conv.ptrs_to.add(this);
142                         this.purpose = purpose_hu_conv;
143                 }
144         }
145         /**
146          * Indicates an outbound payment we made succeeded (i.e. it made it all the way to its target
147          * and we got back the payment preimage for it).
148          * 
149          * Note for MPP payments: in rare cases, this event may be preceded by a `PaymentPathFailed`
150          * event. In this situation, you SHOULD treat this payment as having succeeded.
151          */
152         public final static class PaymentSent extends Event {
153                 /**
154                  * The id returned by [`ChannelManager::send_payment`] and used with
155                  * [`ChannelManager::retry_payment`].
156                  * 
157                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
158                  * [`ChannelManager::retry_payment`]: crate::ln::channelmanager::ChannelManager::retry_payment
159                  * 
160                  * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
161                 */
162                 @Nullable public final byte[] payment_id;
163                 /**
164                  * The preimage to the hash given to ChannelManager::send_payment.
165                  * Note that this serves as a payment receipt, if you wish to have such a thing, you must
166                  * store it somehow!
167                 */
168                 public final byte[] payment_preimage;
169                 /**
170                  * The hash that was given to [`ChannelManager::send_payment`].
171                  * 
172                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
173                 */
174                 public final byte[] payment_hash;
175                 /**
176                  * The total fee which was spent at intermediate hops in this payment, across all paths.
177                  * 
178                  * Note that, like [`Route::get_total_fees`] this does *not* include any potential
179                  * overpayment to the recipient node.
180                  * 
181                  * If the recipient or an intermediate node misbehaves and gives us free money, this may
182                  * overstate the amount paid, though this is unlikely.
183                  * 
184                  * [`Route::get_total_fees`]: crate::routing::router::Route::get_total_fees
185                 */
186                 public final Option_u64Z fee_paid_msat;
187                 private PaymentSent(long ptr, bindings.LDKEvent.PaymentSent obj) {
188                         super(null, ptr);
189                         this.payment_id = obj.payment_id;
190                         this.payment_preimage = obj.payment_preimage;
191                         this.payment_hash = obj.payment_hash;
192                         long fee_paid_msat = obj.fee_paid_msat;
193                         Option_u64Z fee_paid_msat_hu_conv = Option_u64Z.constr_from_ptr(fee_paid_msat);
194                         fee_paid_msat_hu_conv.ptrs_to.add(this);
195                         this.fee_paid_msat = fee_paid_msat_hu_conv;
196                 }
197         }
198         /**
199          * Indicates an outbound HTLC we sent failed. Probably some intermediary node dropped
200          * something. You may wish to retry with a different route.
201          * 
202          * Note that this does *not* indicate that all paths for an MPP payment have failed, see
203          * [`Event::PaymentFailed`] and [`all_paths_failed`].
204          * 
205          * [`all_paths_failed`]: Self::all_paths_failed
206          */
207         public final static class PaymentPathFailed extends Event {
208                 /**
209                  * The id returned by [`ChannelManager::send_payment`] and used with
210                  * [`ChannelManager::retry_payment`] and [`ChannelManager::abandon_payment`].
211                  * 
212                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
213                  * [`ChannelManager::retry_payment`]: crate::ln::channelmanager::ChannelManager::retry_payment
214                  * [`ChannelManager::abandon_payment`]: crate::ln::channelmanager::ChannelManager::abandon_payment
215                  * 
216                  * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
217                 */
218                 @Nullable public final byte[] payment_id;
219                 /**
220                  * The hash that was given to [`ChannelManager::send_payment`].
221                  * 
222                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
223                 */
224                 public final byte[] payment_hash;
225                 /**
226                  * Indicates the payment was rejected for some reason by the recipient. This implies that
227                  * the payment has failed, not just the route in question. If this is not set, you may
228                  * retry the payment via a different route.
229                 */
230                 public final boolean rejected_by_dest;
231                 /**
232                  * Any failure information conveyed via the Onion return packet by a node along the failed
233                  * payment route.
234                  * 
235                  * Should be applied to the [`NetworkGraph`] so that routing decisions can take into
236                  * account the update. [`NetGraphMsgHandler`] is capable of doing this.
237                  * 
238                  * [`NetworkGraph`]: crate::routing::network_graph::NetworkGraph
239                  * [`NetGraphMsgHandler`]: crate::routing::network_graph::NetGraphMsgHandler
240                 */
241                 public final Option_NetworkUpdateZ network_update;
242                 /**
243                  * For both single-path and multi-path payments, this is set if all paths of the payment have
244                  * failed. This will be set to false if (1) this is an MPP payment and (2) other parts of the
245                  * larger MPP payment were still in flight when this event was generated.
246                  * 
247                  * Note that if you are retrying individual MPP parts, using this value to determine if a
248                  * payment has fully failed is race-y. Because multiple failures can happen prior to events
249                  * being processed, you may retry in response to a first failure, with a second failure
250                  * (with `all_paths_failed` set) still pending. Then, when the second failure is processed
251                  * you will see `all_paths_failed` set even though the retry of the first failure still
252                  * has an associated in-flight HTLC. See (1) for an example of such a failure.
253                  * 
254                  * If you wish to retry individual MPP parts and learn when a payment has failed, you must
255                  * call [`ChannelManager::abandon_payment`] and wait for a [`Event::PaymentFailed`] event.
256                  * 
257                  * (1) <https://github.com/lightningdevkit/rust-lightning/issues/1164>
258                  * 
259                  * [`ChannelManager::abandon_payment`]: crate::ln::channelmanager::ChannelManager::abandon_payment
260                 */
261                 public final boolean all_paths_failed;
262                 /**
263                  * The payment path that failed.
264                 */
265                 public final RouteHop[] path;
266                 /**
267                  * The channel responsible for the failed payment path.
268                  * 
269                  * If this is `Some`, then the corresponding channel should be avoided when the payment is
270                  * retried. May be `None` for older [`Event`] serializations.
271                 */
272                 public final Option_u64Z short_channel_id;
273                 /**
274                  * Parameters needed to compute a new [`Route`] when retrying the failed payment path.
275                  * 
276                  * See [`find_route`] for details.
277                  * 
278                  * [`Route`]: crate::routing::router::Route
279                  * [`find_route`]: crate::routing::router::find_route
280                  * 
281                  * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
282                 */
283                 @Nullable public final RouteParameters retry;
284                 private PaymentPathFailed(long ptr, bindings.LDKEvent.PaymentPathFailed obj) {
285                         super(null, ptr);
286                         this.payment_id = obj.payment_id;
287                         this.payment_hash = obj.payment_hash;
288                         this.rejected_by_dest = obj.rejected_by_dest;
289                         long network_update = obj.network_update;
290                         Option_NetworkUpdateZ network_update_hu_conv = Option_NetworkUpdateZ.constr_from_ptr(network_update);
291                         network_update_hu_conv.ptrs_to.add(this);
292                         this.network_update = network_update_hu_conv;
293                         this.all_paths_failed = obj.all_paths_failed;
294                         long[] path = obj.path;
295                         RouteHop[] path_conv_10_arr = new RouteHop[path.length];
296                         for (int k = 0; k < path.length; k++) {
297                                 long path_conv_10 = path[k];
298                                 RouteHop path_conv_10_hu_conv = null; if (path_conv_10 < 0 || path_conv_10 > 4096) { path_conv_10_hu_conv = new RouteHop(null, path_conv_10); }
299                                 path_conv_10_hu_conv.ptrs_to.add(this);
300                                 path_conv_10_arr[k] = path_conv_10_hu_conv;
301                         }
302                         this.path = path_conv_10_arr;
303                         long short_channel_id = obj.short_channel_id;
304                         Option_u64Z short_channel_id_hu_conv = Option_u64Z.constr_from_ptr(short_channel_id);
305                         short_channel_id_hu_conv.ptrs_to.add(this);
306                         this.short_channel_id = short_channel_id_hu_conv;
307                         long retry = obj.retry;
308                         RouteParameters retry_hu_conv = null; if (retry < 0 || retry > 4096) { retry_hu_conv = new RouteParameters(null, retry); }
309                         retry_hu_conv.ptrs_to.add(this);
310                         this.retry = retry_hu_conv;
311                 }
312         }
313         /**
314          * Indicates an outbound payment failed. Individual [`Event::PaymentPathFailed`] events
315          * provide failure information for each MPP part in the payment.
316          * 
317          * This event is provided once there are no further pending HTLCs for the payment and the
318          * payment is no longer retryable, either due to a several-block timeout or because
319          * [`ChannelManager::abandon_payment`] was previously called for the corresponding payment.
320          * 
321          * [`ChannelManager::abandon_payment`]: crate::ln::channelmanager::ChannelManager::abandon_payment
322          */
323         public final static class PaymentFailed extends Event {
324                 /**
325                  * The id returned by [`ChannelManager::send_payment`] and used with
326                  * [`ChannelManager::retry_payment`] and [`ChannelManager::abandon_payment`].
327                  * 
328                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
329                  * [`ChannelManager::retry_payment`]: crate::ln::channelmanager::ChannelManager::retry_payment
330                  * [`ChannelManager::abandon_payment`]: crate::ln::channelmanager::ChannelManager::abandon_payment
331                 */
332                 public final byte[] payment_id;
333                 /**
334                  * The hash that was given to [`ChannelManager::send_payment`].
335                  * 
336                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
337                 */
338                 public final byte[] payment_hash;
339                 private PaymentFailed(long ptr, bindings.LDKEvent.PaymentFailed obj) {
340                         super(null, ptr);
341                         this.payment_id = obj.payment_id;
342                         this.payment_hash = obj.payment_hash;
343                 }
344         }
345         /**
346          * Used to indicate that [`ChannelManager::process_pending_htlc_forwards`] should be called at
347          * a time in the future.
348          * 
349          * [`ChannelManager::process_pending_htlc_forwards`]: crate::ln::channelmanager::ChannelManager::process_pending_htlc_forwards
350          */
351         public final static class PendingHTLCsForwardable extends Event {
352                 /**
353                  * The minimum amount of time that should be waited prior to calling
354                  * process_pending_htlc_forwards. To increase the effort required to correlate payments,
355                  * you should wait a random amount of time in roughly the range (now + time_forwardable,
356                  * now + 5*time_forwardable).
357                 */
358                 public final long time_forwardable;
359                 private PendingHTLCsForwardable(long ptr, bindings.LDKEvent.PendingHTLCsForwardable obj) {
360                         super(null, ptr);
361                         this.time_forwardable = obj.time_forwardable;
362                 }
363         }
364         /**
365          * Used to indicate that an output which you should know how to spend was confirmed on chain
366          * and is now spendable.
367          * Such an output will *not* ever be spent by rust-lightning, and are not at risk of your
368          * counterparty spending them due to some kind of timeout. Thus, you need to store them
369          * somewhere and spend them when you create on-chain transactions.
370          */
371         public final static class SpendableOutputs extends Event {
372                 /**
373                  * The outputs which you should store as spendable by you.
374                 */
375                 public final SpendableOutputDescriptor[] outputs;
376                 private SpendableOutputs(long ptr, bindings.LDKEvent.SpendableOutputs obj) {
377                         super(null, ptr);
378                         long[] outputs = obj.outputs;
379                         SpendableOutputDescriptor[] outputs_conv_27_arr = new SpendableOutputDescriptor[outputs.length];
380                         for (int b = 0; b < outputs.length; b++) {
381                                 long outputs_conv_27 = outputs[b];
382                                 SpendableOutputDescriptor outputs_conv_27_hu_conv = SpendableOutputDescriptor.constr_from_ptr(outputs_conv_27);
383                                 outputs_conv_27_hu_conv.ptrs_to.add(this);
384                                 outputs_conv_27_arr[b] = outputs_conv_27_hu_conv;
385                         }
386                         this.outputs = outputs_conv_27_arr;
387                 }
388         }
389         /**
390          * This event is generated when a payment has been successfully forwarded through us and a
391          * forwarding fee earned.
392          */
393         public final static class PaymentForwarded extends Event {
394                 /**
395                  * The fee, in milli-satoshis, which was earned as a result of the payment.
396                  * 
397                  * Note that if we force-closed the channel over which we forwarded an HTLC while the HTLC
398                  * was pending, the amount the next hop claimed will have been rounded down to the nearest
399                  * whole satoshi. Thus, the fee calculated here may be higher than expected as we still
400                  * claimed the full value in millisatoshis from the source. In this case,
401                  * `claim_from_onchain_tx` will be set.
402                  * 
403                  * If the channel which sent us the payment has been force-closed, we will claim the funds
404                  * via an on-chain transaction. In that case we do not yet know the on-chain transaction
405                  * fees which we will spend and will instead set this to `None`. It is possible duplicate
406                  * `PaymentForwarded` events are generated for the same payment iff `fee_earned_msat` is
407                  * `None`.
408                 */
409                 public final Option_u64Z fee_earned_msat;
410                 /**
411                  * If this is `true`, the forwarded HTLC was claimed by our counterparty via an on-chain
412                  * transaction.
413                 */
414                 public final boolean claim_from_onchain_tx;
415                 private PaymentForwarded(long ptr, bindings.LDKEvent.PaymentForwarded obj) {
416                         super(null, ptr);
417                         long fee_earned_msat = obj.fee_earned_msat;
418                         Option_u64Z fee_earned_msat_hu_conv = Option_u64Z.constr_from_ptr(fee_earned_msat);
419                         fee_earned_msat_hu_conv.ptrs_to.add(this);
420                         this.fee_earned_msat = fee_earned_msat_hu_conv;
421                         this.claim_from_onchain_tx = obj.claim_from_onchain_tx;
422                 }
423         }
424         /**
425          * Used to indicate that a channel with the given `channel_id` is in the process of closure.
426          */
427         public final static class ChannelClosed extends Event {
428                 /**
429                  * The channel_id of the channel which has been closed. Note that on-chain transactions
430                  * resolving the channel are likely still awaiting confirmation.
431                 */
432                 public final byte[] channel_id;
433                 /**
434                  * The `user_channel_id` value passed in to [`ChannelManager::create_channel`], or 0 for
435                  * an inbound channel. This will always be zero for objects serialized with LDK versions
436                  * prior to 0.0.102.
437                  * 
438                  * [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
439                 */
440                 public final long user_channel_id;
441                 /**
442                  * The reason the channel was closed.
443                 */
444                 public final ClosureReason reason;
445                 private ChannelClosed(long ptr, bindings.LDKEvent.ChannelClosed obj) {
446                         super(null, ptr);
447                         this.channel_id = obj.channel_id;
448                         this.user_channel_id = obj.user_channel_id;
449                         long reason = obj.reason;
450                         ClosureReason reason_hu_conv = ClosureReason.constr_from_ptr(reason);
451                         reason_hu_conv.ptrs_to.add(this);
452                         this.reason = reason_hu_conv;
453                 }
454         }
455         /**
456          * Used to indicate to the user that they can abandon the funding transaction and recycle the
457          * inputs for another purpose.
458          */
459         public final static class DiscardFunding extends Event {
460                 /**
461                  * The channel_id of the channel which has been closed.
462                 */
463                 public final byte[] channel_id;
464                 /**
465                  * The full transaction received from the user
466                 */
467                 public final byte[] transaction;
468                 private DiscardFunding(long ptr, bindings.LDKEvent.DiscardFunding obj) {
469                         super(null, ptr);
470                         this.channel_id = obj.channel_id;
471                         this.transaction = obj.transaction;
472                 }
473         }
474         /**
475          * Indicates that a path for an outbound payment was successful.
476          * 
477          * Always generated after [`Event::PaymentSent`] and thus useful for scoring channels. See
478          * [`Event::PaymentSent`] for obtaining the payment preimage.
479          */
480         public final static class PaymentPathSuccessful extends Event {
481                 /**
482                  * The id returned by [`ChannelManager::send_payment`] and used with
483                  * [`ChannelManager::retry_payment`].
484                  * 
485                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
486                  * [`ChannelManager::retry_payment`]: crate::ln::channelmanager::ChannelManager::retry_payment
487                 */
488                 public final byte[] payment_id;
489                 /**
490                  * The hash that was given to [`ChannelManager::send_payment`].
491                  * 
492                  * [`ChannelManager::send_payment`]: crate::ln::channelmanager::ChannelManager::send_payment
493                  * 
494                  * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
495                 */
496                 @Nullable public final byte[] payment_hash;
497                 /**
498                  * The payment path that was successful.
499                  * 
500                  * May contain a closed channel if the HTLC sent along the path was fulfilled on chain.
501                 */
502                 public final RouteHop[] path;
503                 private PaymentPathSuccessful(long ptr, bindings.LDKEvent.PaymentPathSuccessful obj) {
504                         super(null, ptr);
505                         this.payment_id = obj.payment_id;
506                         this.payment_hash = obj.payment_hash;
507                         long[] path = obj.path;
508                         RouteHop[] path_conv_10_arr = new RouteHop[path.length];
509                         for (int k = 0; k < path.length; k++) {
510                                 long path_conv_10 = path[k];
511                                 RouteHop path_conv_10_hu_conv = null; if (path_conv_10 < 0 || path_conv_10 > 4096) { path_conv_10_hu_conv = new RouteHop(null, path_conv_10); }
512                                 path_conv_10_hu_conv.ptrs_to.add(this);
513                                 path_conv_10_arr[k] = path_conv_10_hu_conv;
514                         }
515                         this.path = path_conv_10_arr;
516                 }
517         }
518         long clone_ptr() {
519                 long ret = bindings.Event_clone_ptr(this.ptr);
520                 Reference.reachabilityFence(this);
521                 return ret;
522         }
523
524         /**
525          * Creates a copy of the Event
526          */
527         public Event clone() {
528                 long ret = bindings.Event_clone(this.ptr);
529                 Reference.reachabilityFence(this);
530                 if (ret >= 0 && ret <= 4096) { return null; }
531                 Event ret_hu_conv = Event.constr_from_ptr(ret);
532                 ret_hu_conv.ptrs_to.add(this);
533                 return ret_hu_conv;
534         }
535
536         /**
537          * Utility method to constructs a new FundingGenerationReady-variant Event
538          */
539         public static Event funding_generation_ready(byte[] temporary_channel_id, long channel_value_satoshis, byte[] output_script, long user_channel_id) {
540                 long ret = bindings.Event_funding_generation_ready(InternalUtils.check_arr_len(temporary_channel_id, 32), channel_value_satoshis, output_script, user_channel_id);
541                 Reference.reachabilityFence(temporary_channel_id);
542                 Reference.reachabilityFence(channel_value_satoshis);
543                 Reference.reachabilityFence(output_script);
544                 Reference.reachabilityFence(user_channel_id);
545                 if (ret >= 0 && ret <= 4096) { return null; }
546                 Event ret_hu_conv = Event.constr_from_ptr(ret);
547                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
548                 return ret_hu_conv;
549         }
550
551         /**
552          * Utility method to constructs a new PaymentReceived-variant Event
553          */
554         public static Event payment_received(byte[] payment_hash, long amt, PaymentPurpose purpose) {
555                 long ret = bindings.Event_payment_received(InternalUtils.check_arr_len(payment_hash, 32), amt, purpose.ptr);
556                 Reference.reachabilityFence(payment_hash);
557                 Reference.reachabilityFence(amt);
558                 Reference.reachabilityFence(purpose);
559                 if (ret >= 0 && ret <= 4096) { return null; }
560                 Event ret_hu_conv = Event.constr_from_ptr(ret);
561                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
562                 return ret_hu_conv;
563         }
564
565         /**
566          * Utility method to constructs a new PaymentSent-variant Event
567          */
568         public static Event payment_sent(byte[] payment_id, byte[] payment_preimage, byte[] payment_hash, Option_u64Z fee_paid_msat) {
569                 long ret = bindings.Event_payment_sent(InternalUtils.check_arr_len(payment_id, 32), InternalUtils.check_arr_len(payment_preimage, 32), InternalUtils.check_arr_len(payment_hash, 32), fee_paid_msat.ptr);
570                 Reference.reachabilityFence(payment_id);
571                 Reference.reachabilityFence(payment_preimage);
572                 Reference.reachabilityFence(payment_hash);
573                 Reference.reachabilityFence(fee_paid_msat);
574                 if (ret >= 0 && ret <= 4096) { return null; }
575                 Event ret_hu_conv = Event.constr_from_ptr(ret);
576                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
577                 return ret_hu_conv;
578         }
579
580         /**
581          * Utility method to constructs a new PaymentPathFailed-variant Event
582          */
583         public static Event payment_path_failed(byte[] payment_id, byte[] payment_hash, boolean rejected_by_dest, Option_NetworkUpdateZ network_update, boolean all_paths_failed, RouteHop[] path, Option_u64Z short_channel_id, RouteParameters retry) {
584                 long ret = bindings.Event_payment_path_failed(InternalUtils.check_arr_len(payment_id, 32), InternalUtils.check_arr_len(payment_hash, 32), rejected_by_dest, network_update.ptr, all_paths_failed, path != null ? Arrays.stream(path).mapToLong(path_conv_10 -> path_conv_10 == null ? 0 : path_conv_10.ptr & ~1).toArray() : null, short_channel_id.ptr, retry == null ? 0 : retry.ptr & ~1);
585                 Reference.reachabilityFence(payment_id);
586                 Reference.reachabilityFence(payment_hash);
587                 Reference.reachabilityFence(rejected_by_dest);
588                 Reference.reachabilityFence(network_update);
589                 Reference.reachabilityFence(all_paths_failed);
590                 Reference.reachabilityFence(path);
591                 Reference.reachabilityFence(short_channel_id);
592                 Reference.reachabilityFence(retry);
593                 if (ret >= 0 && ret <= 4096) { return null; }
594                 Event ret_hu_conv = Event.constr_from_ptr(ret);
595                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
596                 return ret_hu_conv;
597         }
598
599         /**
600          * Utility method to constructs a new PaymentFailed-variant Event
601          */
602         public static Event payment_failed(byte[] payment_id, byte[] payment_hash) {
603                 long ret = bindings.Event_payment_failed(InternalUtils.check_arr_len(payment_id, 32), InternalUtils.check_arr_len(payment_hash, 32));
604                 Reference.reachabilityFence(payment_id);
605                 Reference.reachabilityFence(payment_hash);
606                 if (ret >= 0 && ret <= 4096) { return null; }
607                 Event ret_hu_conv = Event.constr_from_ptr(ret);
608                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
609                 return ret_hu_conv;
610         }
611
612         /**
613          * Utility method to constructs a new PendingHTLCsForwardable-variant Event
614          */
615         public static Event pending_htlcs_forwardable(long time_forwardable) {
616                 long ret = bindings.Event_pending_htlcs_forwardable(time_forwardable);
617                 Reference.reachabilityFence(time_forwardable);
618                 if (ret >= 0 && ret <= 4096) { return null; }
619                 Event ret_hu_conv = Event.constr_from_ptr(ret);
620                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
621                 return ret_hu_conv;
622         }
623
624         /**
625          * Utility method to constructs a new SpendableOutputs-variant Event
626          */
627         public static Event spendable_outputs(SpendableOutputDescriptor[] outputs) {
628                 long ret = bindings.Event_spendable_outputs(outputs != null ? Arrays.stream(outputs).mapToLong(outputs_conv_27 -> outputs_conv_27.ptr).toArray() : null);
629                 Reference.reachabilityFence(outputs);
630                 if (ret >= 0 && ret <= 4096) { return null; }
631                 Event ret_hu_conv = Event.constr_from_ptr(ret);
632                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
633                 return ret_hu_conv;
634         }
635
636         /**
637          * Utility method to constructs a new PaymentForwarded-variant Event
638          */
639         public static Event payment_forwarded(Option_u64Z fee_earned_msat, boolean claim_from_onchain_tx) {
640                 long ret = bindings.Event_payment_forwarded(fee_earned_msat.ptr, claim_from_onchain_tx);
641                 Reference.reachabilityFence(fee_earned_msat);
642                 Reference.reachabilityFence(claim_from_onchain_tx);
643                 if (ret >= 0 && ret <= 4096) { return null; }
644                 Event ret_hu_conv = Event.constr_from_ptr(ret);
645                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
646                 return ret_hu_conv;
647         }
648
649         /**
650          * Utility method to constructs a new ChannelClosed-variant Event
651          */
652         public static Event channel_closed(byte[] channel_id, long user_channel_id, ClosureReason reason) {
653                 long ret = bindings.Event_channel_closed(InternalUtils.check_arr_len(channel_id, 32), user_channel_id, reason.ptr);
654                 Reference.reachabilityFence(channel_id);
655                 Reference.reachabilityFence(user_channel_id);
656                 Reference.reachabilityFence(reason);
657                 if (ret >= 0 && ret <= 4096) { return null; }
658                 Event ret_hu_conv = Event.constr_from_ptr(ret);
659                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
660                 return ret_hu_conv;
661         }
662
663         /**
664          * Utility method to constructs a new DiscardFunding-variant Event
665          */
666         public static Event discard_funding(byte[] channel_id, byte[] transaction) {
667                 long ret = bindings.Event_discard_funding(InternalUtils.check_arr_len(channel_id, 32), transaction);
668                 Reference.reachabilityFence(channel_id);
669                 Reference.reachabilityFence(transaction);
670                 if (ret >= 0 && ret <= 4096) { return null; }
671                 Event ret_hu_conv = Event.constr_from_ptr(ret);
672                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
673                 return ret_hu_conv;
674         }
675
676         /**
677          * Utility method to constructs a new PaymentPathSuccessful-variant Event
678          */
679         public static Event payment_path_successful(byte[] payment_id, byte[] payment_hash, RouteHop[] path) {
680                 long ret = bindings.Event_payment_path_successful(InternalUtils.check_arr_len(payment_id, 32), InternalUtils.check_arr_len(payment_hash, 32), path != null ? Arrays.stream(path).mapToLong(path_conv_10 -> path_conv_10 == null ? 0 : path_conv_10.ptr & ~1).toArray() : null);
681                 Reference.reachabilityFence(payment_id);
682                 Reference.reachabilityFence(payment_hash);
683                 Reference.reachabilityFence(path);
684                 if (ret >= 0 && ret <= 4096) { return null; }
685                 Event ret_hu_conv = Event.constr_from_ptr(ret);
686                 ret_hu_conv.ptrs_to.add(ret_hu_conv);
687                 return ret_hu_conv;
688         }
689
690         /**
691          * Serialize the Event object into a byte array which can be read by Event_read
692          */
693         public byte[] write() {
694                 byte[] ret = bindings.Event_write(this.ptr);
695                 Reference.reachabilityFence(this);
696                 return ret;
697         }
698
699 }