]> git.bitcoin.ninja Git - ldk-java/commitdiff
Bindings updates
authorMatt Corallo <git@bluematt.me>
Sat, 30 Jan 2021 04:25:00 +0000 (23:25 -0500)
committerMatt Corallo <git@bluematt.me>
Mon, 1 Feb 2021 21:23:33 +0000 (16:23 -0500)
252 files changed:
src/main/java/org/ldk/impl/bindings.java
src/main/java/org/ldk/structs/AcceptChannel.java
src/main/java/org/ldk/structs/AnnouncementSignatures.java
src/main/java/org/ldk/structs/BuiltCommitmentTransaction.java
src/main/java/org/ldk/structs/ChainMonitor.java
src/main/java/org/ldk/structs/ChannelAnnouncement.java
src/main/java/org/ldk/structs/ChannelConfig.java
src/main/java/org/ldk/structs/ChannelDetails.java
src/main/java/org/ldk/structs/ChannelHandshakeConfig.java
src/main/java/org/ldk/structs/ChannelHandshakeLimits.java
src/main/java/org/ldk/structs/ChannelInfo.java
src/main/java/org/ldk/structs/ChannelKeys.java
src/main/java/org/ldk/structs/ChannelManager.java
src/main/java/org/ldk/structs/ChannelManagerReadArgs.java
src/main/java/org/ldk/structs/ChannelMessageHandler.java
src/main/java/org/ldk/structs/ChannelMonitor.java
src/main/java/org/ldk/structs/ChannelMonitorUpdate.java
src/main/java/org/ldk/structs/ChannelPublicKeys.java
src/main/java/org/ldk/structs/ChannelReestablish.java
src/main/java/org/ldk/structs/ChannelTransactionParameters.java
src/main/java/org/ldk/structs/ChannelUpdate.java
src/main/java/org/ldk/structs/ClosingSigned.java
src/main/java/org/ldk/structs/CommitmentSigned.java
src/main/java/org/ldk/structs/CommitmentTransaction.java
src/main/java/org/ldk/structs/CommitmentUpdate.java
src/main/java/org/ldk/structs/CommonBase.java
src/main/java/org/ldk/structs/CounterpartyChannelTransactionParameters.java
src/main/java/org/ldk/structs/DataLossProtect.java
src/main/java/org/ldk/structs/DecodeError.java
src/main/java/org/ldk/structs/DirectedChannelTransactionParameters.java
src/main/java/org/ldk/structs/DirectionalChannelInfo.java
src/main/java/org/ldk/structs/ErrorAction.java
src/main/java/org/ldk/structs/ErrorMessage.java
src/main/java/org/ldk/structs/Event.java
src/main/java/org/ldk/structs/FundingCreated.java
src/main/java/org/ldk/structs/FundingLocked.java
src/main/java/org/ldk/structs/FundingSigned.java
src/main/java/org/ldk/structs/GossipTimestampFilter.java
src/main/java/org/ldk/structs/HTLCFailChannelUpdate.java
src/main/java/org/ldk/structs/HTLCOutputInCommitment.java
src/main/java/org/ldk/structs/HTLCUpdate.java
src/main/java/org/ldk/structs/HolderCommitmentTransaction.java
src/main/java/org/ldk/structs/InMemoryChannelKeys.java
src/main/java/org/ldk/structs/Init.java
src/main/java/org/ldk/structs/KeysManager.java
src/main/java/org/ldk/structs/LightningError.java
src/main/java/org/ldk/structs/LockedNetworkGraph.java
src/main/java/org/ldk/structs/MessageHandler.java
src/main/java/org/ldk/structs/MessageSendEvent.java
src/main/java/org/ldk/structs/MonitorEvent.java
src/main/java/org/ldk/structs/MonitorUpdateError.java
src/main/java/org/ldk/structs/NetGraphMsgHandler.java
src/main/java/org/ldk/structs/NetworkGraph.java
src/main/java/org/ldk/structs/NodeAnnouncement.java
src/main/java/org/ldk/structs/NodeAnnouncementInfo.java
src/main/java/org/ldk/structs/NodeInfo.java
src/main/java/org/ldk/structs/OpenChannel.java
src/main/java/org/ldk/structs/OutPoint.java
src/main/java/org/ldk/structs/PaymentSendFailure.java
src/main/java/org/ldk/structs/PeerHandleError.java
src/main/java/org/ldk/structs/PeerManager.java
src/main/java/org/ldk/structs/Persist.java
src/main/java/org/ldk/structs/Ping.java
src/main/java/org/ldk/structs/Pong.java
src/main/java/org/ldk/structs/QueryChannelRange.java
src/main/java/org/ldk/structs/QueryShortChannelIds.java
src/main/java/org/ldk/structs/ReplyChannelRange.java
src/main/java/org/ldk/structs/ReplyShortChannelIdsEnd.java
src/main/java/org/ldk/structs/Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_CResult_NetAddressu8ZDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_CVec_u8ZPeerHandleErrorZ.java
src/main/java/org/ldk/structs/Result_ChanKeySignerDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_ChannelMonitorUpdateDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_ChannelReestablishDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_ErrorMessageDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_GossipTimestampFilterDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_InMemoryChannelKeysDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_InitDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_NetworkGraphDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_NodeAnnouncementInfoDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_NodeInfoDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_NoneLightningErrorZ.java
src/main/java/org/ldk/structs/Result_NoneMonitorUpdateErrorZ.java
src/main/java/org/ldk/structs/Result_NonePaymentSendFailureZ.java
src/main/java/org/ldk/structs/Result_NonePeerHandleErrorZ.java
src/main/java/org/ldk/structs/Result_PingDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_PongDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_QueryChannelRangeDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_QueryShortChannelIdsDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_ReplyChannelRangeDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_ReplyShortChannelIdsEndDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_RouteDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_RouteLightningErrorZ.java
src/main/java/org/ldk/structs/Result_RoutingFeesDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_SpendableOutputDescriptorDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_TrustedCommitmentTransactionNoneZ.java
src/main/java/org/ldk/structs/Result_TxCreationKeysSecpErrorZ.java
src/main/java/org/ldk/structs/Result_UnsignedChannelAnnouncementDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_UnsignedChannelUpdateDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_UnsignedNodeAnnouncementDecodeErrorZ.java
src/main/java/org/ldk/structs/Result_boolLightningErrorZ.java
src/main/java/org/ldk/structs/Result_boolPeerHandleErrorZ.java
src/main/java/org/ldk/structs/RevokeAndACK.java
src/main/java/org/ldk/structs/Route.java
src/main/java/org/ldk/structs/RouteHint.java
src/main/java/org/ldk/structs/RouteHop.java
src/main/java/org/ldk/structs/RoutingFees.java
src/main/java/org/ldk/structs/RoutingMessageHandler.java
src/main/java/org/ldk/structs/Shutdown.java
src/main/java/org/ldk/structs/SpendableOutputDescriptor.java
src/main/java/org/ldk/structs/TrustedCommitmentTransaction.java
src/main/java/org/ldk/structs/TxCreationKeys.java
src/main/java/org/ldk/structs/UnsignedChannelAnnouncement.java
src/main/java/org/ldk/structs/UnsignedChannelUpdate.java
src/main/java/org/ldk/structs/UnsignedNodeAnnouncement.java
src/main/java/org/ldk/structs/UpdateAddHTLC.java
src/main/java/org/ldk/structs/UpdateFailHTLC.java
src/main/java/org/ldk/structs/UpdateFailMalformedHTLC.java
src/main/java/org/ldk/structs/UpdateFee.java
src/main/java/org/ldk/structs/UpdateFulfillHTLC.java
src/main/java/org/ldk/structs/UserConfig.java
src/main/java/org/ldk/structs/UtilMethods.java [new file with mode: 0644]
src/main/java/org/ldk/structs/Watch.java
src/main/jni/bindings.c
src/main/jni/org_ldk_impl_bindings.h
ts/bindings.c
ts/bindings.ts
ts/structs/AcceptChannel.ts
ts/structs/AnnouncementSignatures.ts
ts/structs/BuiltCommitmentTransaction.ts
ts/structs/ChainMonitor.ts
ts/structs/ChannelAnnouncement.ts
ts/structs/ChannelConfig.ts
ts/structs/ChannelDetails.ts
ts/structs/ChannelHandshakeConfig.ts
ts/structs/ChannelHandshakeLimits.ts
ts/structs/ChannelInfo.ts
ts/structs/ChannelKeys.ts
ts/structs/ChannelManager.ts
ts/structs/ChannelManagerReadArgs.ts
ts/structs/ChannelMessageHandler.ts
ts/structs/ChannelMonitor.ts
ts/structs/ChannelMonitorUpdate.ts
ts/structs/ChannelPublicKeys.ts
ts/structs/ChannelReestablish.ts
ts/structs/ChannelTransactionParameters.ts
ts/structs/ChannelUpdate.ts
ts/structs/ClosingSigned.ts
ts/structs/CommitmentSigned.ts
ts/structs/CommitmentTransaction.ts
ts/structs/CommitmentUpdate.ts
ts/structs/CounterpartyChannelTransactionParameters.ts
ts/structs/DataLossProtect.ts
ts/structs/DecodeError.ts
ts/structs/DirectedChannelTransactionParameters.ts
ts/structs/DirectionalChannelInfo.ts
ts/structs/ErrorAction.ts
ts/structs/ErrorMessage.ts
ts/structs/Event.ts
ts/structs/FundingCreated.ts
ts/structs/FundingLocked.ts
ts/structs/FundingSigned.ts
ts/structs/GossipTimestampFilter.ts
ts/structs/HTLCFailChannelUpdate.ts
ts/structs/HTLCOutputInCommitment.ts
ts/structs/HTLCUpdate.ts
ts/structs/HolderCommitmentTransaction.ts
ts/structs/InMemoryChannelKeys.ts
ts/structs/Init.ts
ts/structs/KeysManager.ts
ts/structs/LightningError.ts
ts/structs/LockedNetworkGraph.ts
ts/structs/MessageHandler.ts
ts/structs/MessageSendEvent.ts
ts/structs/MonitorEvent.ts
ts/structs/MonitorUpdateError.ts
ts/structs/NetGraphMsgHandler.ts
ts/structs/NetworkGraph.ts
ts/structs/NodeAnnouncement.ts
ts/structs/NodeAnnouncementInfo.ts
ts/structs/NodeInfo.ts
ts/structs/OpenChannel.ts
ts/structs/OutPoint.ts
ts/structs/PaymentSendFailure.ts
ts/structs/PeerHandleError.ts
ts/structs/PeerManager.ts
ts/structs/Persist.ts
ts/structs/Ping.ts
ts/structs/Pong.ts
ts/structs/QueryChannelRange.ts
ts/structs/QueryShortChannelIds.ts
ts/structs/ReplyChannelRange.ts
ts/structs/ReplyShortChannelIdsEnd.ts
ts/structs/Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.ts
ts/structs/Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.ts
ts/structs/Result_CResult_NetAddressu8ZDecodeErrorZ.ts
ts/structs/Result_CVec_u8ZPeerHandleErrorZ.ts
ts/structs/Result_ChanKeySignerDecodeErrorZ.ts
ts/structs/Result_ChannelMonitorUpdateDecodeErrorZ.ts
ts/structs/Result_ChannelReestablishDecodeErrorZ.ts
ts/structs/Result_ErrorMessageDecodeErrorZ.ts
ts/structs/Result_GossipTimestampFilterDecodeErrorZ.ts
ts/structs/Result_InMemoryChannelKeysDecodeErrorZ.ts
ts/structs/Result_InitDecodeErrorZ.ts
ts/structs/Result_NetworkGraphDecodeErrorZ.ts
ts/structs/Result_NodeAnnouncementInfoDecodeErrorZ.ts
ts/structs/Result_NodeInfoDecodeErrorZ.ts
ts/structs/Result_NoneLightningErrorZ.ts
ts/structs/Result_NoneMonitorUpdateErrorZ.ts
ts/structs/Result_NonePaymentSendFailureZ.ts
ts/structs/Result_NonePeerHandleErrorZ.ts
ts/structs/Result_PingDecodeErrorZ.ts
ts/structs/Result_PongDecodeErrorZ.ts
ts/structs/Result_QueryChannelRangeDecodeErrorZ.ts
ts/structs/Result_QueryShortChannelIdsDecodeErrorZ.ts
ts/structs/Result_ReplyChannelRangeDecodeErrorZ.ts
ts/structs/Result_ReplyShortChannelIdsEndDecodeErrorZ.ts
ts/structs/Result_RouteDecodeErrorZ.ts
ts/structs/Result_RouteLightningErrorZ.ts
ts/structs/Result_RoutingFeesDecodeErrorZ.ts
ts/structs/Result_SpendableOutputDescriptorDecodeErrorZ.ts
ts/structs/Result_TrustedCommitmentTransactionNoneZ.ts
ts/structs/Result_TxCreationKeysSecpErrorZ.ts
ts/structs/Result_UnsignedChannelAnnouncementDecodeErrorZ.ts
ts/structs/Result_UnsignedChannelUpdateDecodeErrorZ.ts
ts/structs/Result_UnsignedNodeAnnouncementDecodeErrorZ.ts
ts/structs/Result_boolLightningErrorZ.ts
ts/structs/Result_boolPeerHandleErrorZ.ts
ts/structs/RevokeAndACK.ts
ts/structs/Route.ts
ts/structs/RouteHint.ts
ts/structs/RouteHop.ts
ts/structs/RoutingFees.ts
ts/structs/RoutingMessageHandler.ts
ts/structs/Shutdown.ts
ts/structs/SpendableOutputDescriptor.ts
ts/structs/TrustedCommitmentTransaction.ts
ts/structs/TxCreationKeys.ts
ts/structs/UnsignedChannelAnnouncement.ts
ts/structs/UnsignedChannelUpdate.ts
ts/structs/UnsignedNodeAnnouncement.ts
ts/structs/UpdateAddHTLC.ts
ts/structs/UpdateFailHTLC.ts
ts/structs/UpdateFailMalformedHTLC.ts
ts/structs/UpdateFee.ts
ts/structs/UpdateFulfillHTLC.ts
ts/structs/UserConfig.ts
ts/structs/UtilMethods.ts [new file with mode: 0644]
ts/structs/Watch.ts
ts/util/UtilMethods.ts [new file with mode: 0644]
ts/util/functions.ts [new file with mode: 0644]

index f3b8dfd7b2016888630ec4fa82c8eb888a0140c0..52da72db7bfce51e8c930e1480582ebbf696e147 100644 (file)
@@ -274,16 +274,12 @@ public class bindings {
        public static native boolean LDKCResult_SignatureNoneZ_result_ok(long arg);
        public static native byte[] LDKCResult_SignatureNoneZ_get_ok(long arg);
        public static native void LDKCResult_SignatureNoneZ_get_err(long arg);
-       public static native boolean LDKCResult_CVec_SignatureZNoneZ_result_ok(long arg);
-       public static native byte[][] LDKCResult_CVec_SignatureZNoneZ_get_ok(long arg);
-       public static native void LDKCResult_CVec_SignatureZNoneZ_get_err(long arg);
        public interface LDKChannelKeys {
                 byte[] get_per_commitment_point(long idx);
                 byte[] release_commitment_secret(long idx);
                 long key_derivation_params();
                 long sign_counterparty_commitment(long commitment_tx);
-                long sign_holder_commitment(long commitment_tx);
-                long sign_holder_commitment_htlc_transactions(long commitment_tx);
+                long sign_holder_commitment_and_htlcs(long commitment_tx);
                 long sign_justice_transaction(byte[] justice_tx, long input, long amount, byte[] per_commitment_key, long htlc);
                 long sign_counterparty_htlc_transaction(byte[] htlc_tx, long input, long amount, byte[] per_commitment_point, long htlc);
                 long sign_closing_transaction(byte[] closing_tx);
@@ -300,10 +296,8 @@ public class bindings {
        public static native long ChannelKeys_key_derivation_params(long this_arg);
        // LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ChannelKeys_sign_counterparty_commitment LDKChannelKeys* this_arg, const struct LDKCommitmentTransaction *NONNULL_PTR commitment_tx
        public static native long ChannelKeys_sign_counterparty_commitment(long this_arg, long commitment_tx);
-       // LDKCResult_SignatureNoneZ ChannelKeys_sign_holder_commitment LDKChannelKeys* this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
-       public static native long ChannelKeys_sign_holder_commitment(long this_arg, long commitment_tx);
-       // LDKCResult_CVec_SignatureZNoneZ ChannelKeys_sign_holder_commitment_htlc_transactions LDKChannelKeys* this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
-       public static native long ChannelKeys_sign_holder_commitment_htlc_transactions(long this_arg, long commitment_tx);
+       // LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ChannelKeys_sign_holder_commitment_and_htlcs LDKChannelKeys* this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
+       public static native long ChannelKeys_sign_holder_commitment_and_htlcs(long this_arg, long commitment_tx);
        // LDKCResult_SignatureNoneZ ChannelKeys_sign_justice_transaction LDKChannelKeys* this_arg, struct LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (*per_commitment_key)[32], const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc
        public static native long ChannelKeys_sign_justice_transaction(long this_arg, byte[] justice_tx, long input, long amount, byte[] per_commitment_key, long htlc);
        // LDKCResult_SignatureNoneZ ChannelKeys_sign_counterparty_htlc_transaction LDKChannelKeys* this_arg, struct LDKTransaction htlc_tx, uintptr_t input, uint64_t amount, struct LDKPublicKey per_commitment_point, const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc
@@ -537,6 +531,9 @@ public class bindings {
        public static native boolean LDKCResult_TrustedCommitmentTransactionNoneZ_result_ok(long arg);
        public static native long LDKCResult_TrustedCommitmentTransactionNoneZ_get_ok(long arg);
        public static native void LDKCResult_TrustedCommitmentTransactionNoneZ_get_err(long arg);
+       public static native boolean LDKCResult_CVec_SignatureZNoneZ_result_ok(long arg);
+       public static native byte[][] LDKCResult_CVec_SignatureZNoneZ_get_ok(long arg);
+       public static native void LDKCResult_CVec_SignatureZNoneZ_get_err(long arg);
        public static native long LDKCVec_RouteHopZ_new(long[] elems);
        public static native boolean LDKCResult_RouteDecodeErrorZ_result_ok(long arg);
        public static native long LDKCResult_RouteDecodeErrorZ_get_ok(long arg);
@@ -726,6 +723,8 @@ public class bindings {
        public static native long CResult_NoneChannelMonitorUpdateErrZ_err(LDKChannelMonitorUpdateErr e);
        // void CResult_NoneChannelMonitorUpdateErrZ_free(struct LDKCResult_NoneChannelMonitorUpdateErrZ _res);
        public static native void CResult_NoneChannelMonitorUpdateErrZ_free(long _res);
+       // struct LDKCResult_NoneChannelMonitorUpdateErrZ CResult_NoneChannelMonitorUpdateErrZ_clone(const struct LDKCResult_NoneChannelMonitorUpdateErrZ *NONNULL_PTR orig);
+       public static native long CResult_NoneChannelMonitorUpdateErrZ_clone(long orig);
        // void CVec_MonitorEventZ_free(struct LDKCVec_MonitorEventZ _res);
        public static native void CVec_MonitorEventZ_free(long[] _res);
        // struct LDKCResult_ChannelMonitorUpdateDecodeErrorZ CResult_ChannelMonitorUpdateDecodeErrorZ_ok(struct LDKChannelMonitorUpdate o);
@@ -740,12 +739,16 @@ public class bindings {
        public static native long CResult_NoneMonitorUpdateErrorZ_err(long e);
        // void CResult_NoneMonitorUpdateErrorZ_free(struct LDKCResult_NoneMonitorUpdateErrorZ _res);
        public static native void CResult_NoneMonitorUpdateErrorZ_free(long _res);
+       // struct LDKCResult_NoneMonitorUpdateErrorZ CResult_NoneMonitorUpdateErrorZ_clone(const struct LDKCResult_NoneMonitorUpdateErrorZ *NONNULL_PTR orig);
+       public static native long CResult_NoneMonitorUpdateErrorZ_clone(long orig);
        // void C2Tuple_OutPointScriptZ_free(struct LDKC2Tuple_OutPointScriptZ _res);
        public static native void C2Tuple_OutPointScriptZ_free(long _res);
        // struct LDKC2Tuple_OutPointScriptZ C2Tuple_OutPointScriptZ_new(struct LDKOutPoint a, struct LDKCVec_u8Z b);
        public static native long C2Tuple_OutPointScriptZ_new(long a, byte[] b);
        // void CVec_TransactionZ_free(struct LDKCVec_TransactionZ _res);
        public static native void CVec_TransactionZ_free(byte[][] _res);
+       // struct LDKC2Tuple_u32TxOutZ C2Tuple_u32TxOutZ_clone(const struct LDKC2Tuple_u32TxOutZ *NONNULL_PTR orig);
+       public static native long C2Tuple_u32TxOutZ_clone(long orig);
        // void C2Tuple_u32TxOutZ_free(struct LDKC2Tuple_u32TxOutZ _res);
        public static native void C2Tuple_u32TxOutZ_free(long _res);
        // struct LDKC2Tuple_u32TxOutZ C2Tuple_u32TxOutZ_new(uint32_t a, struct LDKTxOut b);
@@ -768,6 +771,8 @@ public class bindings {
        public static native long CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_err(long e);
        // void CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(struct LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ _res);
        public static native void CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(long _res);
+       // struct LDKC2Tuple_u64u64Z C2Tuple_u64u64Z_clone(const struct LDKC2Tuple_u64u64Z *NONNULL_PTR orig);
+       public static native long C2Tuple_u64u64Z_clone(long orig);
        // void C2Tuple_u64u64Z_free(struct LDKC2Tuple_u64u64Z _res);
        public static native void C2Tuple_u64u64Z_free(long _res);
        // struct LDKC2Tuple_u64u64Z C2Tuple_u64u64Z_new(uint64_t a, uint64_t b);
@@ -778,8 +783,12 @@ public class bindings {
        public static native long CResult_SpendableOutputDescriptorDecodeErrorZ_err(long e);
        // void CResult_SpendableOutputDescriptorDecodeErrorZ_free(struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ _res);
        public static native void CResult_SpendableOutputDescriptorDecodeErrorZ_free(long _res);
+       // struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ CResult_SpendableOutputDescriptorDecodeErrorZ_clone(const struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR orig);
+       public static native long CResult_SpendableOutputDescriptorDecodeErrorZ_clone(long orig);
        // void CVec_SignatureZ_free(struct LDKCVec_SignatureZ _res);
        public static native void CVec_SignatureZ_free(byte[][] _res);
+       // struct LDKC2Tuple_SignatureCVec_SignatureZZ C2Tuple_SignatureCVec_SignatureZZ_clone(const struct LDKC2Tuple_SignatureCVec_SignatureZZ *NONNULL_PTR orig);
+       public static native long C2Tuple_SignatureCVec_SignatureZZ_clone(long orig);
        // void C2Tuple_SignatureCVec_SignatureZZ_free(struct LDKC2Tuple_SignatureCVec_SignatureZZ _res);
        public static native void C2Tuple_SignatureCVec_SignatureZZ_free(long _res);
        // struct LDKC2Tuple_SignatureCVec_SignatureZZ C2Tuple_SignatureCVec_SignatureZZ_new(struct LDKSignature a, struct LDKCVec_SignatureZ b);
@@ -800,20 +809,14 @@ public class bindings {
        public static native void CResult_SignatureNoneZ_free(long _res);
        // struct LDKCResult_SignatureNoneZ CResult_SignatureNoneZ_clone(const struct LDKCResult_SignatureNoneZ *NONNULL_PTR orig);
        public static native long CResult_SignatureNoneZ_clone(long orig);
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_ok(struct LDKCVec_SignatureZ o);
-       public static native long CResult_CVec_SignatureZNoneZ_ok(byte[][] o);
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_err(void);
-       public static native long CResult_CVec_SignatureZNoneZ_err();
-       // void CResult_CVec_SignatureZNoneZ_free(struct LDKCResult_CVec_SignatureZNoneZ _res);
-       public static native void CResult_CVec_SignatureZNoneZ_free(long _res);
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_clone(const struct LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR orig);
-       public static native long CResult_CVec_SignatureZNoneZ_clone(long orig);
        // struct LDKCResult_ChanKeySignerDecodeErrorZ CResult_ChanKeySignerDecodeErrorZ_ok(struct LDKChannelKeys o);
        public static native long CResult_ChanKeySignerDecodeErrorZ_ok(long o);
        // struct LDKCResult_ChanKeySignerDecodeErrorZ CResult_ChanKeySignerDecodeErrorZ_err(struct LDKDecodeError e);
        public static native long CResult_ChanKeySignerDecodeErrorZ_err(long e);
        // void CResult_ChanKeySignerDecodeErrorZ_free(struct LDKCResult_ChanKeySignerDecodeErrorZ _res);
        public static native void CResult_ChanKeySignerDecodeErrorZ_free(long _res);
+       // struct LDKCResult_ChanKeySignerDecodeErrorZ CResult_ChanKeySignerDecodeErrorZ_clone(const struct LDKCResult_ChanKeySignerDecodeErrorZ *NONNULL_PTR orig);
+       public static native long CResult_ChanKeySignerDecodeErrorZ_clone(long orig);
        // struct LDKCResult_InMemoryChannelKeysDecodeErrorZ CResult_InMemoryChannelKeysDecodeErrorZ_ok(struct LDKInMemoryChannelKeys o);
        public static native long CResult_InMemoryChannelKeysDecodeErrorZ_ok(long o);
        // struct LDKCResult_InMemoryChannelKeysDecodeErrorZ CResult_InMemoryChannelKeysDecodeErrorZ_err(struct LDKDecodeError e);
@@ -826,6 +829,8 @@ public class bindings {
        public static native long CResult_TxOutAccessErrorZ_err(LDKAccessError e);
        // void CResult_TxOutAccessErrorZ_free(struct LDKCResult_TxOutAccessErrorZ _res);
        public static native void CResult_TxOutAccessErrorZ_free(long _res);
+       // struct LDKCResult_TxOutAccessErrorZ CResult_TxOutAccessErrorZ_clone(const struct LDKCResult_TxOutAccessErrorZ *NONNULL_PTR orig);
+       public static native long CResult_TxOutAccessErrorZ_clone(long orig);
        // struct LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_ok(void);
        public static native long CResult_NoneAPIErrorZ_ok();
        // struct LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_err(struct LDKAPIError e);
@@ -840,6 +845,8 @@ public class bindings {
        public static native long CResult_NonePaymentSendFailureZ_err(long e);
        // void CResult_NonePaymentSendFailureZ_free(struct LDKCResult_NonePaymentSendFailureZ _res);
        public static native void CResult_NonePaymentSendFailureZ_free(long _res);
+       // struct LDKCResult_NonePaymentSendFailureZ CResult_NonePaymentSendFailureZ_clone(const struct LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR orig);
+       public static native long CResult_NonePaymentSendFailureZ_clone(long orig);
        // void CVec_NetAddressZ_free(struct LDKCVec_NetAddressZ _res);
        public static native void CVec_NetAddressZ_free(long[] _res);
        // void CVec_ChannelMonitorZ_free(struct LDKCVec_ChannelMonitorZ _res);
@@ -860,6 +867,8 @@ public class bindings {
        public static native long CResult_NetAddressu8Z_err(byte e);
        // void CResult_NetAddressu8Z_free(struct LDKCResult_NetAddressu8Z _res);
        public static native void CResult_NetAddressu8Z_free(long _res);
+       // struct LDKCResult_NetAddressu8Z CResult_NetAddressu8Z_clone(const struct LDKCResult_NetAddressu8Z *NONNULL_PTR orig);
+       public static native long CResult_NetAddressu8Z_clone(long orig);
        // struct LDKCResult_CResult_NetAddressu8ZDecodeErrorZ CResult_CResult_NetAddressu8ZDecodeErrorZ_ok(struct LDKCResult_NetAddressu8Z o);
        public static native long CResult_CResult_NetAddressu8ZDecodeErrorZ_ok(long o);
        // struct LDKCResult_CResult_NetAddressu8ZDecodeErrorZ CResult_CResult_NetAddressu8ZDecodeErrorZ_err(struct LDKDecodeError e);
@@ -882,6 +891,8 @@ public class bindings {
        public static native long CResult_boolLightningErrorZ_err(long e);
        // void CResult_boolLightningErrorZ_free(struct LDKCResult_boolLightningErrorZ _res);
        public static native void CResult_boolLightningErrorZ_free(long _res);
+       // struct LDKCResult_boolLightningErrorZ CResult_boolLightningErrorZ_clone(const struct LDKCResult_boolLightningErrorZ *NONNULL_PTR orig);
+       public static native long CResult_boolLightningErrorZ_clone(long orig);
        // void C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(struct LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res);
        public static native void C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(long _res);
        // struct LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(struct LDKChannelAnnouncement a, struct LDKChannelUpdate b, struct LDKChannelUpdate c);
@@ -896,6 +907,8 @@ public class bindings {
        public static native long CResult_NoneLightningErrorZ_err(long e);
        // void CResult_NoneLightningErrorZ_free(struct LDKCResult_NoneLightningErrorZ _res);
        public static native void CResult_NoneLightningErrorZ_free(long _res);
+       // struct LDKCResult_NoneLightningErrorZ CResult_NoneLightningErrorZ_clone(const struct LDKCResult_NoneLightningErrorZ *NONNULL_PTR orig);
+       public static native long CResult_NoneLightningErrorZ_clone(long orig);
        // struct LDKCResult_ChannelReestablishDecodeErrorZ CResult_ChannelReestablishDecodeErrorZ_ok(struct LDKChannelReestablish o);
        public static native long CResult_ChannelReestablishDecodeErrorZ_ok(long o);
        // struct LDKCResult_ChannelReestablishDecodeErrorZ CResult_ChannelReestablishDecodeErrorZ_err(struct LDKDecodeError e);
@@ -984,18 +997,24 @@ public class bindings {
        public static native long CResult_CVec_u8ZPeerHandleErrorZ_err(long e);
        // void CResult_CVec_u8ZPeerHandleErrorZ_free(struct LDKCResult_CVec_u8ZPeerHandleErrorZ _res);
        public static native void CResult_CVec_u8ZPeerHandleErrorZ_free(long _res);
+       // struct LDKCResult_CVec_u8ZPeerHandleErrorZ CResult_CVec_u8ZPeerHandleErrorZ_clone(const struct LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR orig);
+       public static native long CResult_CVec_u8ZPeerHandleErrorZ_clone(long orig);
        // struct LDKCResult_NonePeerHandleErrorZ CResult_NonePeerHandleErrorZ_ok(void);
        public static native long CResult_NonePeerHandleErrorZ_ok();
        // struct LDKCResult_NonePeerHandleErrorZ CResult_NonePeerHandleErrorZ_err(struct LDKPeerHandleError e);
        public static native long CResult_NonePeerHandleErrorZ_err(long e);
        // void CResult_NonePeerHandleErrorZ_free(struct LDKCResult_NonePeerHandleErrorZ _res);
        public static native void CResult_NonePeerHandleErrorZ_free(long _res);
+       // struct LDKCResult_NonePeerHandleErrorZ CResult_NonePeerHandleErrorZ_clone(const struct LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR orig);
+       public static native long CResult_NonePeerHandleErrorZ_clone(long orig);
        // struct LDKCResult_boolPeerHandleErrorZ CResult_boolPeerHandleErrorZ_ok(bool o);
        public static native long CResult_boolPeerHandleErrorZ_ok(boolean o);
        // struct LDKCResult_boolPeerHandleErrorZ CResult_boolPeerHandleErrorZ_err(struct LDKPeerHandleError e);
        public static native long CResult_boolPeerHandleErrorZ_err(long e);
        // void CResult_boolPeerHandleErrorZ_free(struct LDKCResult_boolPeerHandleErrorZ _res);
        public static native void CResult_boolPeerHandleErrorZ_free(long _res);
+       // struct LDKCResult_boolPeerHandleErrorZ CResult_boolPeerHandleErrorZ_clone(const struct LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR orig);
+       public static native long CResult_boolPeerHandleErrorZ_clone(long orig);
        // struct LDKCResult_SecretKeySecpErrorZ CResult_SecretKeySecpErrorZ_ok(struct LDKSecretKey o);
        public static native long CResult_SecretKeySecpErrorZ_ok(byte[] o);
        // struct LDKCResult_SecretKeySecpErrorZ CResult_SecretKeySecpErrorZ_err(enum LDKSecp256k1Error e);
@@ -1020,6 +1039,14 @@ public class bindings {
        public static native long CResult_TrustedCommitmentTransactionNoneZ_err();
        // void CResult_TrustedCommitmentTransactionNoneZ_free(struct LDKCResult_TrustedCommitmentTransactionNoneZ _res);
        public static native void CResult_TrustedCommitmentTransactionNoneZ_free(long _res);
+       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_ok(struct LDKCVec_SignatureZ o);
+       public static native long CResult_CVec_SignatureZNoneZ_ok(byte[][] o);
+       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_err(void);
+       public static native long CResult_CVec_SignatureZNoneZ_err();
+       // void CResult_CVec_SignatureZNoneZ_free(struct LDKCResult_CVec_SignatureZNoneZ _res);
+       public static native void CResult_CVec_SignatureZNoneZ_free(long _res);
+       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_clone(const struct LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR orig);
+       public static native long CResult_CVec_SignatureZNoneZ_clone(long orig);
        // void CVec_RouteHopZ_free(struct LDKCVec_RouteHopZ _res);
        public static native void CVec_RouteHopZ_free(long[] _res);
        // void CVec_CVec_RouteHopZZ_free(struct LDKCVec_CVec_RouteHopZZ _res);
@@ -1050,12 +1077,16 @@ public class bindings {
        public static native long CResult_NodeAnnouncementInfoDecodeErrorZ_err(long e);
        // void CResult_NodeAnnouncementInfoDecodeErrorZ_free(struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ _res);
        public static native void CResult_NodeAnnouncementInfoDecodeErrorZ_free(long _res);
+       // struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ CResult_NodeAnnouncementInfoDecodeErrorZ_clone(const struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR orig);
+       public static native long CResult_NodeAnnouncementInfoDecodeErrorZ_clone(long orig);
        // struct LDKCResult_NodeInfoDecodeErrorZ CResult_NodeInfoDecodeErrorZ_ok(struct LDKNodeInfo o);
        public static native long CResult_NodeInfoDecodeErrorZ_ok(long o);
        // struct LDKCResult_NodeInfoDecodeErrorZ CResult_NodeInfoDecodeErrorZ_err(struct LDKDecodeError e);
        public static native long CResult_NodeInfoDecodeErrorZ_err(long e);
        // void CResult_NodeInfoDecodeErrorZ_free(struct LDKCResult_NodeInfoDecodeErrorZ _res);
        public static native void CResult_NodeInfoDecodeErrorZ_free(long _res);
+       // struct LDKCResult_NodeInfoDecodeErrorZ CResult_NodeInfoDecodeErrorZ_clone(const struct LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR orig);
+       public static native long CResult_NodeInfoDecodeErrorZ_clone(long orig);
        // struct LDKCResult_NetworkGraphDecodeErrorZ CResult_NetworkGraphDecodeErrorZ_ok(struct LDKNetworkGraph o);
        public static native long CResult_NetworkGraphDecodeErrorZ_ok(long o);
        // struct LDKCResult_NetworkGraphDecodeErrorZ CResult_NetworkGraphDecodeErrorZ_err(struct LDKDecodeError e);
@@ -1240,6 +1271,8 @@ public class bindings {
        public static native LDKChannelMonitorUpdateErr ChannelMonitorUpdateErr_clone(long orig);
        // void MonitorUpdateError_free(struct LDKMonitorUpdateError this_ptr);
        public static native void MonitorUpdateError_free(long this_ptr);
+       // struct LDKMonitorUpdateError MonitorUpdateError_clone(const struct LDKMonitorUpdateError *NONNULL_PTR orig);
+       public static native long MonitorUpdateError_clone(long orig);
        // void MonitorEvent_free(struct LDKMonitorEvent this_ptr);
        public static native void MonitorEvent_free(long this_ptr);
        // struct LDKMonitorEvent MonitorEvent_clone(const struct LDKMonitorEvent *NONNULL_PTR orig);
@@ -1254,6 +1287,8 @@ public class bindings {
        public static native long HTLCUpdate_read(byte[] ser);
        // void ChannelMonitor_free(struct LDKChannelMonitor this_ptr);
        public static native void ChannelMonitor_free(long this_ptr);
+       // struct LDKChannelMonitor ChannelMonitor_clone(const struct LDKChannelMonitor *NONNULL_PTR orig);
+       public static native long ChannelMonitor_clone(long orig);
        // struct LDKCVec_u8Z ChannelMonitor_write(const struct LDKChannelMonitor *NONNULL_PTR obj);
        public static native byte[] ChannelMonitor_write(long obj);
        // MUST_USE_RES struct LDKCResult_NoneMonitorUpdateErrorZ ChannelMonitor_update_monitor(struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKChannelMonitorUpdate *NONNULL_PTR updates, const struct LDKBroadcasterInterface *NONNULL_PTR broadcaster, const struct LDKFeeEstimator *NONNULL_PTR fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
@@ -1406,6 +1441,8 @@ public class bindings {
        public static native void ChannelDetails_set_is_live(long this_ptr, boolean val);
        // void PaymentSendFailure_free(struct LDKPaymentSendFailure this_ptr);
        public static native void PaymentSendFailure_free(long this_ptr);
+       // struct LDKPaymentSendFailure PaymentSendFailure_clone(const struct LDKPaymentSendFailure *NONNULL_PTR orig);
+       public static native long PaymentSendFailure_clone(long orig);
        // MUST_USE_RES struct LDKChannelManager ChannelManager_new(enum LDKNetwork network, struct LDKFeeEstimator fee_est, struct LDKWatch chain_monitor, struct LDKBroadcasterInterface tx_broadcaster, struct LDKLogger logger, struct LDKKeysInterface keys_manager, struct LDKUserConfig config, uintptr_t current_blockchain_height);
        public static native long ChannelManager_new(LDKNetwork network, long fee_est, long chain_monitor, long tx_broadcaster, long logger, long keys_manager, long config, long current_blockchain_height);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_create_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPublicKey their_network_key, uint64_t channel_value_satoshis, uint64_t push_msat, uint64_t user_id, struct LDKUserConfig override_config);
@@ -1416,8 +1453,8 @@ public class bindings {
        public static native long[] ChannelManager_list_usable_channels(long this_arg);
        // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_close_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32]);
        public static native long ChannelManager_close_channel(long this_arg, byte[] channel_id);
-       // void ChannelManager_force_close_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32]);
-       public static native void ChannelManager_force_close_channel(long this_arg, byte[] channel_id);
+       // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_force_close_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32]);
+       public static native long ChannelManager_force_close_channel(long this_arg, byte[] channel_id);
        // void ChannelManager_force_close_all_channels(const struct LDKChannelManager *NONNULL_PTR this_arg);
        public static native void ChannelManager_force_close_all_channels(long this_arg);
        // MUST_USE_RES struct LDKCResult_NonePaymentSendFailureZ ChannelManager_send_payment(const struct LDKChannelManager *NONNULL_PTR this_arg, const struct LDKRoute *NONNULL_PTR route, struct LDKThirtyTwoBytes payment_hash, struct LDKThirtyTwoBytes payment_secret);
@@ -1482,6 +1519,8 @@ public class bindings {
        public static native long C2Tuple_BlockHashChannelManagerZ_read(byte[] ser, long arg);
        // void DecodeError_free(struct LDKDecodeError this_ptr);
        public static native void DecodeError_free(long this_ptr);
+       // struct LDKDecodeError DecodeError_clone(const struct LDKDecodeError *NONNULL_PTR orig);
+       public static native long DecodeError_clone(long orig);
        // void Init_free(struct LDKInit this_ptr);
        public static native void Init_free(long this_ptr);
        // struct LDKInit Init_clone(const struct LDKInit *NONNULL_PTR orig);
@@ -2160,6 +2199,8 @@ public class bindings {
        public static native long ErrorAction_clone(long orig);
        // void LightningError_free(struct LDKLightningError this_ptr);
        public static native void LightningError_free(long this_ptr);
+       // struct LDKLightningError LightningError_clone(const struct LDKLightningError *NONNULL_PTR orig);
+       public static native long LightningError_clone(long orig);
        // struct LDKStr LightningError_get_err(const struct LDKLightningError *NONNULL_PTR this_ptr);
        public static native String LightningError_get_err(long this_ptr);
        // void LightningError_set_err(struct LDKLightningError *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
@@ -2342,6 +2383,8 @@ public class bindings {
        public static native void SocketDescriptor_free(long this_ptr);
        // void PeerHandleError_free(struct LDKPeerHandleError this_ptr);
        public static native void PeerHandleError_free(long this_ptr);
+       // struct LDKPeerHandleError PeerHandleError_clone(const struct LDKPeerHandleError *NONNULL_PTR orig);
+       public static native long PeerHandleError_clone(long orig);
        // bool PeerHandleError_get_no_connection_possible(const struct LDKPeerHandleError *NONNULL_PTR this_ptr);
        public static native boolean PeerHandleError_get_no_connection_possible(long this_ptr);
        // void PeerHandleError_set_no_connection_possible(struct LDKPeerHandleError *NONNULL_PTR this_ptr, bool val);
@@ -2706,6 +2749,8 @@ public class bindings {
        public static native long NetGraphMsgHandler_as_MessageSendEventsProvider(long this_arg);
        // void DirectionalChannelInfo_free(struct LDKDirectionalChannelInfo this_ptr);
        public static native void DirectionalChannelInfo_free(long this_ptr);
+       // struct LDKDirectionalChannelInfo DirectionalChannelInfo_clone(const struct LDKDirectionalChannelInfo *NONNULL_PTR orig);
+       public static native long DirectionalChannelInfo_clone(long orig);
        // uint32_t DirectionalChannelInfo_get_last_update(const struct LDKDirectionalChannelInfo *NONNULL_PTR this_ptr);
        public static native int DirectionalChannelInfo_get_last_update(long this_ptr);
        // void DirectionalChannelInfo_set_last_update(struct LDKDirectionalChannelInfo *NONNULL_PTR this_ptr, uint32_t val);
@@ -2784,6 +2829,8 @@ public class bindings {
        public static native byte[] RoutingFees_write(long obj);
        // void NodeAnnouncementInfo_free(struct LDKNodeAnnouncementInfo this_ptr);
        public static native void NodeAnnouncementInfo_free(long this_ptr);
+       // struct LDKNodeAnnouncementInfo NodeAnnouncementInfo_clone(const struct LDKNodeAnnouncementInfo *NONNULL_PTR orig);
+       public static native long NodeAnnouncementInfo_clone(long orig);
        // struct LDKNodeFeatures NodeAnnouncementInfo_get_features(const struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr);
        public static native long NodeAnnouncementInfo_get_features(long this_ptr);
        // void NodeAnnouncementInfo_set_features(struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr, struct LDKNodeFeatures val);
@@ -2814,6 +2861,8 @@ public class bindings {
        public static native long NodeAnnouncementInfo_read(byte[] ser);
        // void NodeInfo_free(struct LDKNodeInfo this_ptr);
        public static native void NodeInfo_free(long this_ptr);
+       // struct LDKNodeInfo NodeInfo_clone(const struct LDKNodeInfo *NONNULL_PTR orig);
+       public static native long NodeInfo_clone(long orig);
        // void NodeInfo_set_channels(struct LDKNodeInfo *NONNULL_PTR this_ptr, struct LDKCVec_u64Z val);
        public static native void NodeInfo_set_channels(long this_ptr, long[] val);
        // struct LDKRoutingFees NodeInfo_get_lowest_inbound_channel_fees(const struct LDKNodeInfo *NONNULL_PTR this_ptr);
index 718b73c6a76584e5c39a80f4fffd673ff0f57967..f6ba8ed457b83893af5ae4cc558417c428433f47 100644 (file)
@@ -17,6 +17,7 @@ public class AcceptChannel extends CommonBase {
        public AcceptChannel clone() {
                long ret = bindings.AcceptChannel_clone(this.ptr);
                AcceptChannel ret_hu_conv = new AcceptChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -154,6 +155,7 @@ public class AcceptChannel extends CommonBase {
        public static AcceptChannel constructor_read(byte[] ser) {
                long ret = bindings.AcceptChannel_read(ser);
                AcceptChannel ret_hu_conv = new AcceptChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 5bc4dfaee4022f9197cb519e5c28fae5f0438985..23de5a0fd25c6f05f7a5485c638a95cfb9cc5a5e 100644 (file)
@@ -17,6 +17,7 @@ public class AnnouncementSignatures extends CommonBase {
        public AnnouncementSignatures clone() {
                long ret = bindings.AnnouncementSignatures_clone(this.ptr);
                AnnouncementSignatures ret_hu_conv = new AnnouncementSignatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -59,6 +60,7 @@ public class AnnouncementSignatures extends CommonBase {
        public static AnnouncementSignatures constructor_new(byte[] channel_id_arg, long short_channel_id_arg, byte[] node_signature_arg, byte[] bitcoin_signature_arg) {
                long ret = bindings.AnnouncementSignatures_new(channel_id_arg, short_channel_id_arg, node_signature_arg, bitcoin_signature_arg);
                AnnouncementSignatures ret_hu_conv = new AnnouncementSignatures(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -70,6 +72,7 @@ public class AnnouncementSignatures extends CommonBase {
        public static AnnouncementSignatures constructor_read(byte[] ser) {
                long ret = bindings.AnnouncementSignatures_read(ser);
                AnnouncementSignatures ret_hu_conv = new AnnouncementSignatures(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 97e5481b86c8453bbc3e1c20070bba60675656bc..5626c66d8bc185b01d1d52f1aadbfdd6d0b0de15 100644 (file)
@@ -17,6 +17,7 @@ public class BuiltCommitmentTransaction extends CommonBase {
        public BuiltCommitmentTransaction clone() {
                long ret = bindings.BuiltCommitmentTransaction_clone(this.ptr);
                BuiltCommitmentTransaction ret_hu_conv = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class BuiltCommitmentTransaction extends CommonBase {
        public static BuiltCommitmentTransaction constructor_new(byte[] transaction_arg, byte[] txid_arg) {
                long ret = bindings.BuiltCommitmentTransaction_new(transaction_arg, txid_arg);
                BuiltCommitmentTransaction ret_hu_conv = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -52,6 +54,7 @@ public class BuiltCommitmentTransaction extends CommonBase {
        public static BuiltCommitmentTransaction constructor_read(byte[] ser) {
                long ret = bindings.BuiltCommitmentTransaction_read(ser);
                BuiltCommitmentTransaction ret_hu_conv = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 9864acdadcd9e2e8be56242f35f7055a64a3922c..951ca5df751defe7bff0ff003b265e4605de162e 100644 (file)
@@ -26,6 +26,7 @@ public class ChainMonitor extends CommonBase {
        public static ChainMonitor constructor_new(Filter chain_source, BroadcasterInterface broadcaster, Logger logger, FeeEstimator feeest, Persist persister) {
                long ret = bindings.ChainMonitor_new(chain_source == null ? 0 : chain_source.ptr, broadcaster == null ? 0 : broadcaster.ptr, logger == null ? 0 : logger.ptr, feeest == null ? 0 : feeest.ptr, persister == null ? 0 : persister.ptr);
                ChainMonitor ret_hu_conv = new ChainMonitor(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chain_source);
                ret_hu_conv.ptrs_to.add(broadcaster);
                ret_hu_conv.ptrs_to.add(logger);
index 995ca9aec6aef9bdfadb3dd51ee06e6e88d0eddb..a49a163b771d3c9438d9cdc10577b72a671af637 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelAnnouncement extends CommonBase {
        public ChannelAnnouncement clone() {
                long ret = bindings.ChannelAnnouncement_clone(this.ptr);
                ChannelAnnouncement ret_hu_conv = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -59,6 +60,7 @@ public class ChannelAnnouncement extends CommonBase {
        public UnsignedChannelAnnouncement get_contents() {
                long ret = bindings.ChannelAnnouncement_get_contents(this.ptr);
                UnsignedChannelAnnouncement ret_hu_conv = new UnsignedChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -70,6 +72,7 @@ public class ChannelAnnouncement extends CommonBase {
        public static ChannelAnnouncement constructor_new(byte[] node_signature_1_arg, byte[] node_signature_2_arg, byte[] bitcoin_signature_1_arg, byte[] bitcoin_signature_2_arg, UnsignedChannelAnnouncement contents_arg) {
                long ret = bindings.ChannelAnnouncement_new(node_signature_1_arg, node_signature_2_arg, bitcoin_signature_1_arg, bitcoin_signature_2_arg, contents_arg == null ? 0 : contents_arg.ptr & ~1);
                ChannelAnnouncement ret_hu_conv = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(contents_arg);
                return ret_hu_conv;
        }
@@ -82,6 +85,7 @@ public class ChannelAnnouncement extends CommonBase {
        public static ChannelAnnouncement constructor_read(byte[] ser) {
                long ret = bindings.ChannelAnnouncement_read(ser);
                ChannelAnnouncement ret_hu_conv = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 9cc8ff3fe2d641924d01401adc5034a45a9271d3..869ca5729206060e56fd713f8e8c066375d9492e 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelConfig extends CommonBase {
        public ChannelConfig clone() {
                long ret = bindings.ChannelConfig_clone(this.ptr);
                ChannelConfig ret_hu_conv = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,12 +51,14 @@ public class ChannelConfig extends CommonBase {
        public static ChannelConfig constructor_new(int fee_proportional_millionths_arg, boolean announced_channel_arg, boolean commit_upfront_shutdown_pubkey_arg) {
                long ret = bindings.ChannelConfig_new(fee_proportional_millionths_arg, announced_channel_arg, commit_upfront_shutdown_pubkey_arg);
                ChannelConfig ret_hu_conv = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static ChannelConfig constructor_default() {
                long ret = bindings.ChannelConfig_default();
                ChannelConfig ret_hu_conv = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -67,6 +70,7 @@ public class ChannelConfig extends CommonBase {
        public static ChannelConfig constructor_read(byte[] ser) {
                long ret = bindings.ChannelConfig_read(ser);
                ChannelConfig ret_hu_conv = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 09221b0d21175104caf7684bf368b3507295069f..4c690d2d67f876adfcb4af2dc113a5c3932fe343 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelDetails extends CommonBase {
        public ChannelDetails clone() {
                long ret = bindings.ChannelDetails_clone(this.ptr);
                ChannelDetails ret_hu_conv = new ChannelDetails(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,12 +42,21 @@ public class ChannelDetails extends CommonBase {
        public InitFeatures get_counterparty_features() {
                long ret = bindings.ChannelDetails_get_counterparty_features(this.ptr);
                InitFeatures ret_hu_conv = new InitFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_counterparty_features(InitFeatures val) {
                bindings.ChannelDetails_set_counterparty_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public long get_channel_value_satoshis() {
index 850eff7e9e0f648038f1b0c7f2990c3d82508ae4..a07f2e2afb86bc0b03c45905f1bd22c5800e1db8 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelHandshakeConfig extends CommonBase {
        public ChannelHandshakeConfig clone() {
                long ret = bindings.ChannelHandshakeConfig_clone(this.ptr);
                ChannelHandshakeConfig ret_hu_conv = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,12 +51,14 @@ public class ChannelHandshakeConfig extends CommonBase {
        public static ChannelHandshakeConfig constructor_new(int minimum_depth_arg, short our_to_self_delay_arg, long our_htlc_minimum_msat_arg) {
                long ret = bindings.ChannelHandshakeConfig_new(minimum_depth_arg, our_to_self_delay_arg, our_htlc_minimum_msat_arg);
                ChannelHandshakeConfig ret_hu_conv = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static ChannelHandshakeConfig constructor_default() {
                long ret = bindings.ChannelHandshakeConfig_default();
                ChannelHandshakeConfig ret_hu_conv = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index a940852449e94692db78d5b2524cb3e9464b3a80..e108446ee1f65d1a21dd944eccbd76ecff617398 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelHandshakeLimits extends CommonBase {
        public ChannelHandshakeLimits clone() {
                long ret = bindings.ChannelHandshakeLimits_clone(this.ptr);
                ChannelHandshakeLimits ret_hu_conv = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -113,12 +114,14 @@ public class ChannelHandshakeLimits extends CommonBase {
        public static ChannelHandshakeLimits constructor_new(long min_funding_satoshis_arg, long max_htlc_minimum_msat_arg, long min_max_htlc_value_in_flight_msat_arg, long max_channel_reserve_satoshis_arg, short min_max_accepted_htlcs_arg, long min_dust_limit_satoshis_arg, long max_dust_limit_satoshis_arg, int max_minimum_depth_arg, boolean force_announced_channel_preference_arg, short their_to_self_delay_arg) {
                long ret = bindings.ChannelHandshakeLimits_new(min_funding_satoshis_arg, max_htlc_minimum_msat_arg, min_max_htlc_value_in_flight_msat_arg, max_channel_reserve_satoshis_arg, min_max_accepted_htlcs_arg, min_dust_limit_satoshis_arg, max_dust_limit_satoshis_arg, max_minimum_depth_arg, force_announced_channel_preference_arg, their_to_self_delay_arg);
                ChannelHandshakeLimits ret_hu_conv = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static ChannelHandshakeLimits constructor_default() {
                long ret = bindings.ChannelHandshakeLimits_default();
                ChannelHandshakeLimits ret_hu_conv = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index fdcba395d968d19debb505aad88c75b33f276da7..8c9e5727d8c2ad96cd5f4460cee79dd8f6831c9b 100644 (file)
@@ -17,12 +17,21 @@ public class ChannelInfo extends CommonBase {
        public ChannelFeatures get_features() {
                long ret = bindings.ChannelInfo_get_features(this.ptr);
                ChannelFeatures ret_hu_conv = new ChannelFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(ChannelFeatures val) {
                bindings.ChannelInfo_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public byte[] get_node_one() {
@@ -37,6 +46,7 @@ public class ChannelInfo extends CommonBase {
        public DirectionalChannelInfo get_one_to_two() {
                long ret = bindings.ChannelInfo_get_one_to_two(this.ptr);
                DirectionalChannelInfo ret_hu_conv = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -57,6 +67,7 @@ public class ChannelInfo extends CommonBase {
        public DirectionalChannelInfo get_two_to_one() {
                long ret = bindings.ChannelInfo_get_two_to_one(this.ptr);
                DirectionalChannelInfo ret_hu_conv = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -68,6 +79,7 @@ public class ChannelInfo extends CommonBase {
        public ChannelAnnouncement get_announcement_message() {
                long ret = bindings.ChannelInfo_get_announcement_message(this.ptr);
                ChannelAnnouncement ret_hu_conv = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -84,6 +96,7 @@ public class ChannelInfo extends CommonBase {
        public static ChannelInfo constructor_read(byte[] ser) {
                long ret = bindings.ChannelInfo_read(ser);
                ChannelInfo ret_hu_conv = new ChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index b4b9b87b986be2188f50f3c61f61ee444cbdf52c..dbad7616ffb351c7a0d417f29ab50aa5c7e5e278 100644 (file)
@@ -25,8 +25,7 @@ public class ChannelKeys extends CommonBase {
                byte[] release_commitment_secret(long idx);
                TwoTuple<Long, Long> key_derivation_params();
                Result_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_counterparty_commitment(CommitmentTransaction commitment_tx);
-               Result_SignatureNoneZ sign_holder_commitment(HolderCommitmentTransaction commitment_tx);
-               Result_CVec_SignatureZNoneZ sign_holder_commitment_htlc_transactions(HolderCommitmentTransaction commitment_tx);
+               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_holder_commitment_and_htlcs(HolderCommitmentTransaction commitment_tx);
                Result_SignatureNoneZ sign_justice_transaction(byte[] justice_tx, long input, long amount, byte[] per_commitment_key, HTLCOutputInCommitment htlc);
                Result_SignatureNoneZ sign_counterparty_htlc_transaction(byte[] htlc_tx, long input, long amount, byte[] per_commitment_point, HTLCOutputInCommitment htlc);
                Result_SignatureNoneZ sign_closing_transaction(byte[] closing_tx);
@@ -57,15 +56,9 @@ public class ChannelKeys extends CommonBase {
                                long result = ret != null ? ret.ptr : 0;
                                return result;
                        }
-                       @Override public long sign_holder_commitment(long commitment_tx) {
+                       @Override public long sign_holder_commitment_and_htlcs(long commitment_tx) {
                                HolderCommitmentTransaction commitment_tx_hu_conv = new HolderCommitmentTransaction(null, commitment_tx);
-                               Result_SignatureNoneZ ret = arg.sign_holder_commitment(commitment_tx_hu_conv);
-                               long result = ret != null ? ret.ptr : 0;
-                               return result;
-                       }
-                       @Override public long sign_holder_commitment_htlc_transactions(long commitment_tx) {
-                               HolderCommitmentTransaction commitment_tx_hu_conv = new HolderCommitmentTransaction(null, commitment_tx);
-                               Result_CVec_SignatureZNoneZ ret = arg.sign_holder_commitment_htlc_transactions(commitment_tx_hu_conv);
+                               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret = arg.sign_holder_commitment_and_htlcs(commitment_tx_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
                                return result;
                        }
@@ -128,16 +121,9 @@ public class ChannelKeys extends CommonBase {
                return ret_hu_conv;
        }
 
-       public Result_SignatureNoneZ sign_holder_commitment(HolderCommitmentTransaction commitment_tx) {
-               long ret = bindings.ChannelKeys_sign_holder_commitment(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr & ~1);
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
-               this.ptrs_to.add(commitment_tx);
-               return ret_hu_conv;
-       }
-
-       public Result_CVec_SignatureZNoneZ sign_holder_commitment_htlc_transactions(HolderCommitmentTransaction commitment_tx) {
-               long ret = bindings.ChannelKeys_sign_holder_commitment_htlc_transactions(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr & ~1);
-               Result_CVec_SignatureZNoneZ ret_hu_conv = Result_CVec_SignatureZNoneZ.constr_from_ptr(ret);
+       public Result_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_holder_commitment_and_htlcs(HolderCommitmentTransaction commitment_tx) {
+               long ret = bindings.ChannelKeys_sign_holder_commitment_and_htlcs(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr & ~1);
+               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_hu_conv = Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.constr_from_ptr(ret);
                this.ptrs_to.add(commitment_tx);
                return ret_hu_conv;
        }
@@ -182,6 +168,7 @@ public class ChannelKeys extends CommonBase {
        public ChannelPublicKeys get_pubkeys() {
                long ret = bindings.ChannelKeys_get_pubkeys(this.ptr);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 4f22bd22014966de55af44d1103fe52efa016fc6..b89636f69541e399beb5e4b3078e0f7e6b77da80 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelManager extends CommonBase {
        public static ChannelManager constructor_new(LDKNetwork network, FeeEstimator fee_est, Watch chain_monitor, BroadcasterInterface tx_broadcaster, Logger logger, KeysInterface keys_manager, UserConfig config, long current_blockchain_height) {
                long ret = bindings.ChannelManager_new(network, fee_est == null ? 0 : fee_est.ptr, chain_monitor == null ? 0 : chain_monitor.ptr, tx_broadcaster == null ? 0 : tx_broadcaster.ptr, logger == null ? 0 : logger.ptr, keys_manager == null ? 0 : keys_manager.ptr, config == null ? 0 : config.ptr & ~1, current_blockchain_height);
                ChannelManager ret_hu_conv = new ChannelManager(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(fee_est);
                ret_hu_conv.ptrs_to.add(chain_monitor);
                ret_hu_conv.ptrs_to.add(tx_broadcaster);
@@ -39,6 +40,7 @@ public class ChannelManager extends CommonBase {
                for (int q = 0; q < ret.length; q++) {
                        long arr_conv_16 = ret[q];
                        ChannelDetails arr_conv_16_hu_conv = new ChannelDetails(null, arr_conv_16);
+                       arr_conv_16_hu_conv.ptrs_to.add(this);
                        arr_conv_16_arr[q] = arr_conv_16_hu_conv;
                }
                return arr_conv_16_arr;
@@ -50,6 +52,7 @@ public class ChannelManager extends CommonBase {
                for (int q = 0; q < ret.length; q++) {
                        long arr_conv_16 = ret[q];
                        ChannelDetails arr_conv_16_hu_conv = new ChannelDetails(null, arr_conv_16);
+                       arr_conv_16_hu_conv.ptrs_to.add(this);
                        arr_conv_16_arr[q] = arr_conv_16_hu_conv;
                }
                return arr_conv_16_arr;
@@ -61,8 +64,10 @@ public class ChannelManager extends CommonBase {
                return ret_hu_conv;
        }
 
-       public void force_close_channel(byte[] channel_id) {
-               bindings.ChannelManager_force_close_channel(this.ptr, channel_id);
+       public Result_NoneAPIErrorZ force_close_channel(byte[] channel_id) {
+               long ret = bindings.ChannelManager_force_close_channel(this.ptr, channel_id);
+               Result_NoneAPIErrorZ ret_hu_conv = Result_NoneAPIErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
        }
 
        public void force_close_all_channels() {
index 2affeefe1a66930a01065cd57084b8d6e4a9bea5..96b198da425191f94beca178698a712b2b670ecf 100644 (file)
@@ -77,6 +77,7 @@ public class ChannelManagerReadArgs extends CommonBase {
        public UserConfig get_default_config() {
                long ret = bindings.ChannelManagerReadArgs_get_default_config(this.ptr);
                UserConfig ret_hu_conv = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -88,6 +89,7 @@ public class ChannelManagerReadArgs extends CommonBase {
        public static ChannelManagerReadArgs constructor_new(KeysInterface keys_manager, FeeEstimator fee_estimator, Watch chain_monitor, BroadcasterInterface tx_broadcaster, Logger logger, UserConfig default_config, ChannelMonitor[] channel_monitors) {
                long ret = bindings.ChannelManagerReadArgs_new(keys_manager == null ? 0 : keys_manager.ptr, fee_estimator == null ? 0 : fee_estimator.ptr, chain_monitor == null ? 0 : chain_monitor.ptr, tx_broadcaster == null ? 0 : tx_broadcaster.ptr, logger == null ? 0 : logger.ptr, default_config == null ? 0 : default_config.ptr & ~1, Arrays.stream(channel_monitors).mapToLong(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray());
                ChannelManagerReadArgs ret_hu_conv = new ChannelManagerReadArgs(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(keys_manager);
                ret_hu_conv.ptrs_to.add(fee_estimator);
                ret_hu_conv.ptrs_to.add(chain_monitor);
index ac0e308e5e53a823193ed8243709b1166459f86a..060133855ae1117c56add57e5cf0a659e0bf9cdf 100644 (file)
@@ -47,11 +47,13 @@ public class ChannelMessageHandler extends CommonBase {
                impl_holder.held = new ChannelMessageHandler(new bindings.LDKChannelMessageHandler() {
                        @Override public void handle_open_channel(byte[] their_node_id, long their_features, long msg) {
                                InitFeatures their_features_hu_conv = new InitFeatures(null, their_features);
+                               their_features_hu_conv.ptrs_to.add(this);
                                OpenChannel msg_hu_conv = new OpenChannel(null, msg);
                                arg.handle_open_channel(their_node_id, their_features_hu_conv, msg_hu_conv);
                        }
                        @Override public void handle_accept_channel(byte[] their_node_id, long their_features, long msg) {
                                InitFeatures their_features_hu_conv = new InitFeatures(null, their_features);
+                               their_features_hu_conv.ptrs_to.add(this);
                                AcceptChannel msg_hu_conv = new AcceptChannel(null, msg);
                                arg.handle_accept_channel(their_node_id, their_features_hu_conv, msg_hu_conv);
                        }
@@ -128,12 +130,28 @@ public class ChannelMessageHandler extends CommonBase {
        public void handle_open_channel(byte[] their_node_id, InitFeatures their_features, OpenChannel msg) {
                bindings.ChannelMessageHandler_handle_open_channel(this.ptr, their_node_id, their_features == null ? 0 : their_features.ptr & ~1, msg == null ? 0 : msg.ptr & ~1);
                this.ptrs_to.add(their_features);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, their_features is reset to null and is now a dummy object.
+               their_features.ptr = 0;
                this.ptrs_to.add(msg);
        }
 
        public void handle_accept_channel(byte[] their_node_id, InitFeatures their_features, AcceptChannel msg) {
                bindings.ChannelMessageHandler_handle_accept_channel(this.ptr, their_node_id, their_features == null ? 0 : their_features.ptr & ~1, msg == null ? 0 : msg.ptr & ~1);
                this.ptrs_to.add(their_features);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, their_features is reset to null and is now a dummy object.
+               their_features.ptr = 0;
                this.ptrs_to.add(msg);
        }
 
index 22011661185b0b080faa70e067bd9fc25ab92635..2b102329166d4139948ec0f927ce49a4efb2c370 100644 (file)
@@ -14,6 +14,13 @@ public class ChannelMonitor extends CommonBase {
                if (ptr != 0) { bindings.ChannelMonitor_free(ptr); }
        }
 
+       public ChannelMonitor clone() {
+               long ret = bindings.ChannelMonitor_clone(this.ptr);
+               ChannelMonitor ret_hu_conv = new ChannelMonitor(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public byte[] write() {
                byte[] ret = bindings.ChannelMonitor_write(this.ptr);
                return ret;
@@ -37,7 +44,8 @@ public class ChannelMonitor extends CommonBase {
        public TwoTuple<OutPoint, byte[]> get_funding_txo() {
                long ret = bindings.ChannelMonitor_get_funding_txo(this.ptr);
                long ret_a = bindings.LDKC2Tuple_OutPointScriptZ_get_a(ret);
-               OutPoint ret_a_hu_conv = new OutPoint(null, ret_a);;
+               OutPoint ret_a_hu_conv = new OutPoint(null, ret_a);
+               ret_a_hu_conv.ptrs_to.add(this);;
                byte[] ret_b = bindings.LDKC2Tuple_OutPointScriptZ_get_b(ret);
                TwoTuple<OutPoint, byte[]> ret_conv = new TwoTuple<OutPoint, byte[]>(ret_a_hu_conv, ret_b);
                return ret_conv;
@@ -49,6 +57,7 @@ public class ChannelMonitor extends CommonBase {
                for (int o = 0; o < ret.length; o++) {
                        long arr_conv_14 = ret[o];
                        MonitorEvent arr_conv_14_hu_conv = new MonitorEvent(null, arr_conv_14);
+                       arr_conv_14_hu_conv.ptrs_to.add(this);
                        arr_conv_14_arr[o] = arr_conv_14_hu_conv;
                }
                return arr_conv_14_arr;
index 92d58952e38ab04d0e5147553f13439d905b6879..739965b177dca5cac3c32d3545e167f36d1ac9d4 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelMonitorUpdate extends CommonBase {
        public ChannelMonitorUpdate clone() {
                long ret = bindings.ChannelMonitorUpdate_clone(this.ptr);
                ChannelMonitorUpdate ret_hu_conv = new ChannelMonitorUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 29c745d8356cb3ae01f713a38a3bc3b82f65daa8..91102b530ff675b21015619526fad8b5b4af462b 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelPublicKeys extends CommonBase {
        public ChannelPublicKeys clone() {
                long ret = bindings.ChannelPublicKeys_clone(this.ptr);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -68,6 +69,7 @@ public class ChannelPublicKeys extends CommonBase {
        public static ChannelPublicKeys constructor_new(byte[] funding_pubkey_arg, byte[] revocation_basepoint_arg, byte[] payment_point_arg, byte[] delayed_payment_basepoint_arg, byte[] htlc_basepoint_arg) {
                long ret = bindings.ChannelPublicKeys_new(funding_pubkey_arg, revocation_basepoint_arg, payment_point_arg, delayed_payment_basepoint_arg, htlc_basepoint_arg);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -79,6 +81,7 @@ public class ChannelPublicKeys extends CommonBase {
        public static ChannelPublicKeys constructor_read(byte[] ser) {
                long ret = bindings.ChannelPublicKeys_read(ser);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index ad00ac0e68f85bafc2283a23bb7cee7ede920230..9df4872905c1fa8da029b53524f79e22149b8948 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelReestablish extends CommonBase {
        public ChannelReestablish clone() {
                long ret = bindings.ChannelReestablish_clone(this.ptr);
                ChannelReestablish ret_hu_conv = new ChannelReestablish(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 9a8899d00e2794f039af70e973eabbbcb70f01f9..1740e54c3b8107bbc3e8684f5a2350e0ff86259d 100644 (file)
@@ -17,12 +17,14 @@ public class ChannelTransactionParameters extends CommonBase {
        public ChannelTransactionParameters clone() {
                long ret = bindings.ChannelTransactionParameters_clone(this.ptr);
                ChannelTransactionParameters ret_hu_conv = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys get_holder_pubkeys() {
                long ret = bindings.ChannelTransactionParameters_get_holder_pubkeys(this.ptr);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -52,6 +54,7 @@ public class ChannelTransactionParameters extends CommonBase {
        public CounterpartyChannelTransactionParameters get_counterparty_parameters() {
                long ret = bindings.ChannelTransactionParameters_get_counterparty_parameters(this.ptr);
                CounterpartyChannelTransactionParameters ret_hu_conv = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -63,6 +66,7 @@ public class ChannelTransactionParameters extends CommonBase {
        public OutPoint get_funding_outpoint() {
                long ret = bindings.ChannelTransactionParameters_get_funding_outpoint(this.ptr);
                OutPoint ret_hu_conv = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -74,6 +78,7 @@ public class ChannelTransactionParameters extends CommonBase {
        public static ChannelTransactionParameters constructor_new(ChannelPublicKeys holder_pubkeys_arg, short holder_selected_contest_delay_arg, boolean is_outbound_from_holder_arg, CounterpartyChannelTransactionParameters counterparty_parameters_arg, OutPoint funding_outpoint_arg) {
                long ret = bindings.ChannelTransactionParameters_new(holder_pubkeys_arg == null ? 0 : holder_pubkeys_arg.ptr & ~1, holder_selected_contest_delay_arg, is_outbound_from_holder_arg, counterparty_parameters_arg == null ? 0 : counterparty_parameters_arg.ptr & ~1, funding_outpoint_arg == null ? 0 : funding_outpoint_arg.ptr & ~1);
                ChannelTransactionParameters ret_hu_conv = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(holder_pubkeys_arg);
                ret_hu_conv.ptrs_to.add(counterparty_parameters_arg);
                ret_hu_conv.ptrs_to.add(funding_outpoint_arg);
@@ -88,12 +93,14 @@ public class ChannelTransactionParameters extends CommonBase {
        public DirectedChannelTransactionParameters as_holder_broadcastable() {
                long ret = bindings.ChannelTransactionParameters_as_holder_broadcastable(this.ptr);
                DirectedChannelTransactionParameters ret_hu_conv = new DirectedChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public DirectedChannelTransactionParameters as_counterparty_broadcastable() {
                long ret = bindings.ChannelTransactionParameters_as_counterparty_broadcastable(this.ptr);
                DirectedChannelTransactionParameters ret_hu_conv = new DirectedChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -105,6 +112,7 @@ public class ChannelTransactionParameters extends CommonBase {
        public static ChannelTransactionParameters constructor_read(byte[] ser) {
                long ret = bindings.ChannelTransactionParameters_read(ser);
                ChannelTransactionParameters ret_hu_conv = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 8baf1cee251a0ed010c47b71c4337735721a3fa3..cb055f37c92018fa3283968b387c825753672d70 100644 (file)
@@ -17,6 +17,7 @@ public class ChannelUpdate extends CommonBase {
        public ChannelUpdate clone() {
                long ret = bindings.ChannelUpdate_clone(this.ptr);
                ChannelUpdate ret_hu_conv = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,6 +33,7 @@ public class ChannelUpdate extends CommonBase {
        public UnsignedChannelUpdate get_contents() {
                long ret = bindings.ChannelUpdate_get_contents(this.ptr);
                UnsignedChannelUpdate ret_hu_conv = new UnsignedChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -43,6 +45,7 @@ public class ChannelUpdate extends CommonBase {
        public static ChannelUpdate constructor_new(byte[] signature_arg, UnsignedChannelUpdate contents_arg) {
                long ret = bindings.ChannelUpdate_new(signature_arg, contents_arg == null ? 0 : contents_arg.ptr & ~1);
                ChannelUpdate ret_hu_conv = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(contents_arg);
                return ret_hu_conv;
        }
@@ -55,6 +58,7 @@ public class ChannelUpdate extends CommonBase {
        public static ChannelUpdate constructor_read(byte[] ser) {
                long ret = bindings.ChannelUpdate_read(ser);
                ChannelUpdate ret_hu_conv = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 0a78ac03e99833db19ca32d90d9a16d5e5a397b9..fbd0f3305b89641e5d924e8751447739427fff36 100644 (file)
@@ -17,6 +17,7 @@ public class ClosingSigned extends CommonBase {
        public ClosingSigned clone() {
                long ret = bindings.ClosingSigned_clone(this.ptr);
                ClosingSigned ret_hu_conv = new ClosingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,6 +51,7 @@ public class ClosingSigned extends CommonBase {
        public static ClosingSigned constructor_new(byte[] channel_id_arg, long fee_satoshis_arg, byte[] signature_arg) {
                long ret = bindings.ClosingSigned_new(channel_id_arg, fee_satoshis_arg, signature_arg);
                ClosingSigned ret_hu_conv = new ClosingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -61,6 +63,7 @@ public class ClosingSigned extends CommonBase {
        public static ClosingSigned constructor_read(byte[] ser) {
                long ret = bindings.ClosingSigned_read(ser);
                ClosingSigned ret_hu_conv = new ClosingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index ba5157674e861bf1fb7aef6a66a9f529db47b92e..e6a76bcf4f779fb732e07f2dad2ca96337153aba 100644 (file)
@@ -17,6 +17,7 @@ public class CommitmentSigned extends CommonBase {
        public CommitmentSigned clone() {
                long ret = bindings.CommitmentSigned_clone(this.ptr);
                CommitmentSigned ret_hu_conv = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ public class CommitmentSigned extends CommonBase {
        public static CommitmentSigned constructor_new(byte[] channel_id_arg, byte[] signature_arg, byte[][] htlc_signatures_arg) {
                long ret = bindings.CommitmentSigned_new(channel_id_arg, signature_arg, htlc_signatures_arg);
                CommitmentSigned ret_hu_conv = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -56,6 +58,7 @@ public class CommitmentSigned extends CommonBase {
        public static CommitmentSigned constructor_read(byte[] ser) {
                long ret = bindings.CommitmentSigned_read(ser);
                CommitmentSigned ret_hu_conv = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 31fd014fc48a3a3db55ac3bdcd40cbb65ecd9fd3..bb38be53660229ac2a186bf5a361c5e0a57a0ccb 100644 (file)
@@ -17,6 +17,7 @@ public class CommitmentTransaction extends CommonBase {
        public CommitmentTransaction clone() {
                long ret = bindings.CommitmentTransaction_clone(this.ptr);
                CommitmentTransaction ret_hu_conv = new CommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -28,6 +29,7 @@ public class CommitmentTransaction extends CommonBase {
        public static CommitmentTransaction constructor_read(byte[] ser) {
                long ret = bindings.CommitmentTransaction_read(ser);
                CommitmentTransaction ret_hu_conv = new CommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -54,6 +56,7 @@ public class CommitmentTransaction extends CommonBase {
        public TrustedCommitmentTransaction trust() {
                long ret = bindings.CommitmentTransaction_trust(this.ptr);
                TrustedCommitmentTransaction ret_hu_conv = new TrustedCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 4b9d1535c12b81452d5da331783038ec5bbd3f93..c53eb4ebf3dcd2c29cf02de588287fded7058dd1 100644 (file)
@@ -17,6 +17,7 @@ public class CommitmentUpdate extends CommonBase {
        public CommitmentUpdate clone() {
                long ret = bindings.CommitmentUpdate_clone(this.ptr);
                CommitmentUpdate ret_hu_conv = new CommitmentUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -43,6 +44,7 @@ public class CommitmentUpdate extends CommonBase {
        public UpdateFee get_update_fee() {
                long ret = bindings.CommitmentUpdate_get_update_fee(this.ptr);
                UpdateFee ret_hu_conv = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,6 +56,7 @@ public class CommitmentUpdate extends CommonBase {
        public CommitmentSigned get_commitment_signed() {
                long ret = bindings.CommitmentUpdate_get_commitment_signed(this.ptr);
                CommitmentSigned ret_hu_conv = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -65,6 +68,7 @@ public class CommitmentUpdate extends CommonBase {
        public static CommitmentUpdate constructor_new(UpdateAddHTLC[] update_add_htlcs_arg, UpdateFulfillHTLC[] update_fulfill_htlcs_arg, UpdateFailHTLC[] update_fail_htlcs_arg, UpdateFailMalformedHTLC[] update_fail_malformed_htlcs_arg, UpdateFee update_fee_arg, CommitmentSigned commitment_signed_arg) {
                long ret = bindings.CommitmentUpdate_new(Arrays.stream(update_add_htlcs_arg).mapToLong(arr_conv_15 -> arr_conv_15 == null ? 0 : arr_conv_15.ptr & ~1).toArray(), Arrays.stream(update_fulfill_htlcs_arg).mapToLong(arr_conv_19 -> arr_conv_19 == null ? 0 : arr_conv_19.ptr & ~1).toArray(), Arrays.stream(update_fail_htlcs_arg).mapToLong(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray(), Arrays.stream(update_fail_malformed_htlcs_arg).mapToLong(arr_conv_25 -> arr_conv_25 == null ? 0 : arr_conv_25.ptr & ~1).toArray(), update_fee_arg == null ? 0 : update_fee_arg.ptr & ~1, commitment_signed_arg == null ? 0 : commitment_signed_arg.ptr & ~1);
                CommitmentUpdate ret_hu_conv = new CommitmentUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                /* TODO 2 UpdateAddHTLC  */;
                /* TODO 2 UpdateFulfillHTLC  */;
                /* TODO 2 UpdateFailHTLC  */;
index 42971b3f35b3e36f04d0946f96cf47921c4b5af7..acff6661da49875fe3379c8c4dab9052827246ab 100644 (file)
@@ -1,7 +1,7 @@
 package org.ldk.structs;
 import java.util.LinkedList;
 class CommonBase {
-       final long ptr;
+       long ptr;
        LinkedList<Object> ptrs_to = new LinkedList();
        protected CommonBase(long ptr) { this.ptr = ptr; }
        public long _test_only_get_ptr() { return this.ptr; }
index 49d27132724d3d73cfc2a3a783ccd066a764917f..5cabe932481a4cfcdd1fc535d66e243bf8bdd055 100644 (file)
@@ -17,12 +17,14 @@ public class CounterpartyChannelTransactionParameters extends CommonBase {
        public CounterpartyChannelTransactionParameters clone() {
                long ret = bindings.CounterpartyChannelTransactionParameters_clone(this.ptr);
                CounterpartyChannelTransactionParameters ret_hu_conv = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys get_pubkeys() {
                long ret = bindings.CounterpartyChannelTransactionParameters_get_pubkeys(this.ptr);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -43,6 +45,7 @@ public class CounterpartyChannelTransactionParameters extends CommonBase {
        public static CounterpartyChannelTransactionParameters constructor_new(ChannelPublicKeys pubkeys_arg, short selected_contest_delay_arg) {
                long ret = bindings.CounterpartyChannelTransactionParameters_new(pubkeys_arg == null ? 0 : pubkeys_arg.ptr & ~1, selected_contest_delay_arg);
                CounterpartyChannelTransactionParameters ret_hu_conv = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(pubkeys_arg);
                return ret_hu_conv;
        }
@@ -55,6 +58,7 @@ public class CounterpartyChannelTransactionParameters extends CommonBase {
        public static CounterpartyChannelTransactionParameters constructor_read(byte[] ser) {
                long ret = bindings.CounterpartyChannelTransactionParameters_read(ser);
                CounterpartyChannelTransactionParameters ret_hu_conv = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 7fecd2174e4a26224373f0835ef21a5581a108bb..63db5eef41e4c627b6438f7d2efca0dfecd1ba6e 100644 (file)
@@ -17,6 +17,7 @@ public class DataLossProtect extends CommonBase {
        public DataLossProtect clone() {
                long ret = bindings.DataLossProtect_clone(this.ptr);
                DataLossProtect ret_hu_conv = new DataLossProtect(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class DataLossProtect extends CommonBase {
        public static DataLossProtect constructor_new(byte[] your_last_per_commitment_secret_arg, byte[] my_current_per_commitment_point_arg) {
                long ret = bindings.DataLossProtect_new(your_last_per_commitment_secret_arg, my_current_per_commitment_point_arg);
                DataLossProtect ret_hu_conv = new DataLossProtect(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index e8cec47071df259dcd5318d91d8e9bd1392502f7..d39265af082e897be8681e33db684daddf64c080 100644 (file)
@@ -14,4 +14,11 @@ public class DecodeError extends CommonBase {
                if (ptr != 0) { bindings.DecodeError_free(ptr); }
        }
 
+       public DecodeError clone() {
+               long ret = bindings.DecodeError_clone(this.ptr);
+               DecodeError ret_hu_conv = new DecodeError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
 }
index 4d2e621dc467bbccf45a58fb3140e6125c849597..2358c61524b4d5b2bf594e6648ba5811cf721dd7 100644 (file)
@@ -17,12 +17,14 @@ public class DirectedChannelTransactionParameters extends CommonBase {
        public ChannelPublicKeys broadcaster_pubkeys() {
                long ret = bindings.DirectedChannelTransactionParameters_broadcaster_pubkeys(this.ptr);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys countersignatory_pubkeys() {
                long ret = bindings.DirectedChannelTransactionParameters_countersignatory_pubkeys(this.ptr);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -39,6 +41,7 @@ public class DirectedChannelTransactionParameters extends CommonBase {
        public OutPoint funding_outpoint() {
                long ret = bindings.DirectedChannelTransactionParameters_funding_outpoint(this.ptr);
                OutPoint ret_hu_conv = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index eaef870597aa25423de9e95181aaf6d5cb07da2a..82ec50918f8eda135cfc04f5237de4d8dfdb11b1 100644 (file)
@@ -14,6 +14,13 @@ public class DirectionalChannelInfo extends CommonBase {
                if (ptr != 0) { bindings.DirectionalChannelInfo_free(ptr); }
        }
 
+       public DirectionalChannelInfo clone() {
+               long ret = bindings.DirectionalChannelInfo_clone(this.ptr);
+               DirectionalChannelInfo ret_hu_conv = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public int get_last_update() {
                int ret = bindings.DirectionalChannelInfo_get_last_update(this.ptr);
                return ret;
@@ -53,6 +60,7 @@ public class DirectionalChannelInfo extends CommonBase {
        public RoutingFees get_fees() {
                long ret = bindings.DirectionalChannelInfo_get_fees(this.ptr);
                RoutingFees ret_hu_conv = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -64,6 +72,7 @@ public class DirectionalChannelInfo extends CommonBase {
        public ChannelUpdate get_last_update_message() {
                long ret = bindings.DirectionalChannelInfo_get_last_update_message(this.ptr);
                ChannelUpdate ret_hu_conv = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -80,6 +89,7 @@ public class DirectionalChannelInfo extends CommonBase {
        public static DirectionalChannelInfo constructor_read(byte[] ser) {
                long ret = bindings.DirectionalChannelInfo_read(ser);
                DirectionalChannelInfo ret_hu_conv = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index efe34dd55c7401786611254727266e07f6265807..f5d1f0fb8949f9865bfb5f68039d7116f6d8de4b 100644 (file)
@@ -33,6 +33,7 @@ public class ErrorAction extends CommonBase {
                        super(null, ptr);
                        long msg = obj.msg;
                        ErrorMessage msg_hu_conv = new ErrorMessage(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -47,6 +48,7 @@ public class ErrorAction extends CommonBase {
                        super(null, ptr);
                        long msg = obj.msg;
                        ErrorMessage msg_hu_conv = new ErrorMessage(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
index c6758fdf8b67dac15ac8843adee6f4965e1a74ec..a90b207bd5ec08597d6b85b9cca7e1fe14d8111b 100644 (file)
@@ -17,6 +17,7 @@ public class ErrorMessage extends CommonBase {
        public ErrorMessage clone() {
                long ret = bindings.ErrorMessage_clone(this.ptr);
                ErrorMessage ret_hu_conv = new ErrorMessage(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class ErrorMessage extends CommonBase {
        public static ErrorMessage constructor_new(byte[] channel_id_arg, byte[] data_arg) {
                long ret = bindings.ErrorMessage_new(channel_id_arg, data_arg);
                ErrorMessage ret_hu_conv = new ErrorMessage(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index bbba62d7b8c4917a99e5e479836243fd49278619..83ffeb55913addf4f0024969ee1bab816ea9d59a 100644 (file)
@@ -59,6 +59,7 @@ public class Event extends CommonBase {
                        super(null, ptr);
                        long funding_txo = obj.funding_txo;
                        OutPoint funding_txo_hu_conv = new OutPoint(null, funding_txo);
+                       funding_txo_hu_conv.ptrs_to.add(this);
                        this.funding_txo = funding_txo_hu_conv;
                        this.user_channel_id = obj.user_channel_id;
                }
index 42be833beea1b9bb662378aaba27aedbc5291625..7687561d5f65f9520e1ed54d4505783825e4ef8e 100644 (file)
@@ -17,6 +17,7 @@ public class FundingCreated extends CommonBase {
        public FundingCreated clone() {
                long ret = bindings.FundingCreated_clone(this.ptr);
                FundingCreated ret_hu_conv = new FundingCreated(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -59,6 +60,7 @@ public class FundingCreated extends CommonBase {
        public static FundingCreated constructor_new(byte[] temporary_channel_id_arg, byte[] funding_txid_arg, short funding_output_index_arg, byte[] signature_arg) {
                long ret = bindings.FundingCreated_new(temporary_channel_id_arg, funding_txid_arg, funding_output_index_arg, signature_arg);
                FundingCreated ret_hu_conv = new FundingCreated(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -70,6 +72,7 @@ public class FundingCreated extends CommonBase {
        public static FundingCreated constructor_read(byte[] ser) {
                long ret = bindings.FundingCreated_read(ser);
                FundingCreated ret_hu_conv = new FundingCreated(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index c46b3183ebe8ff0604255ddd6194119fdd85acd9..4439697f84b16da44478418bea75ed77a341dc09 100644 (file)
@@ -17,6 +17,7 @@ public class FundingLocked extends CommonBase {
        public FundingLocked clone() {
                long ret = bindings.FundingLocked_clone(this.ptr);
                FundingLocked ret_hu_conv = new FundingLocked(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class FundingLocked extends CommonBase {
        public static FundingLocked constructor_new(byte[] channel_id_arg, byte[] next_per_commitment_point_arg) {
                long ret = bindings.FundingLocked_new(channel_id_arg, next_per_commitment_point_arg);
                FundingLocked ret_hu_conv = new FundingLocked(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -52,6 +54,7 @@ public class FundingLocked extends CommonBase {
        public static FundingLocked constructor_read(byte[] ser) {
                long ret = bindings.FundingLocked_read(ser);
                FundingLocked ret_hu_conv = new FundingLocked(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 899d17d8bfceaef432bfee241a2aa1e05ba193cc..d8566044d45d6c8815e0591456a2766802f5476a 100644 (file)
@@ -17,6 +17,7 @@ public class FundingSigned extends CommonBase {
        public FundingSigned clone() {
                long ret = bindings.FundingSigned_clone(this.ptr);
                FundingSigned ret_hu_conv = new FundingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class FundingSigned extends CommonBase {
        public static FundingSigned constructor_new(byte[] channel_id_arg, byte[] signature_arg) {
                long ret = bindings.FundingSigned_new(channel_id_arg, signature_arg);
                FundingSigned ret_hu_conv = new FundingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -52,6 +54,7 @@ public class FundingSigned extends CommonBase {
        public static FundingSigned constructor_read(byte[] ser) {
                long ret = bindings.FundingSigned_read(ser);
                FundingSigned ret_hu_conv = new FundingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 6443e4099175f61565e0b9bc7825391b5545afa8..55458e73140263db4c879fe9852f42bb4a3977f0 100644 (file)
@@ -17,6 +17,7 @@ public class GossipTimestampFilter extends CommonBase {
        public GossipTimestampFilter clone() {
                long ret = bindings.GossipTimestampFilter_clone(this.ptr);
                GossipTimestampFilter ret_hu_conv = new GossipTimestampFilter(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,6 +51,7 @@ public class GossipTimestampFilter extends CommonBase {
        public static GossipTimestampFilter constructor_new(byte[] chain_hash_arg, int first_timestamp_arg, int timestamp_range_arg) {
                long ret = bindings.GossipTimestampFilter_new(chain_hash_arg, first_timestamp_arg, timestamp_range_arg);
                GossipTimestampFilter ret_hu_conv = new GossipTimestampFilter(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 92a5c0188bf302edd9dd66b14f677648994b02b7..a935293794e15901ddae3c0f75acce171f1ad38e 100644 (file)
@@ -33,6 +33,7 @@ public class HTLCFailChannelUpdate extends CommonBase {
                        super(null, ptr);
                        long msg = obj.msg;
                        ChannelUpdate msg_hu_conv = new ChannelUpdate(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
index 1697e3016a12d2740ff7ad1f441758b4ad5bb3a1..daa1c42d5d0499044cdda92f5db7d0c6cafebcb2 100644 (file)
@@ -17,6 +17,7 @@ public class HTLCOutputInCommitment extends CommonBase {
        public HTLCOutputInCommitment clone() {
                long ret = bindings.HTLCOutputInCommitment_clone(this.ptr);
                HTLCOutputInCommitment ret_hu_conv = new HTLCOutputInCommitment(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -64,6 +65,7 @@ public class HTLCOutputInCommitment extends CommonBase {
        public static HTLCOutputInCommitment constructor_read(byte[] ser) {
                long ret = bindings.HTLCOutputInCommitment_read(ser);
                HTLCOutputInCommitment ret_hu_conv = new HTLCOutputInCommitment(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 7313e8670beab947a40f4b66ff1a182559aa5536..f860f5dd8d464efbb8c23af4ee182f3a0d4d12ae 100644 (file)
@@ -17,6 +17,7 @@ public class HTLCUpdate extends CommonBase {
        public HTLCUpdate clone() {
                long ret = bindings.HTLCUpdate_clone(this.ptr);
                HTLCUpdate ret_hu_conv = new HTLCUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -28,6 +29,7 @@ public class HTLCUpdate extends CommonBase {
        public static HTLCUpdate constructor_read(byte[] ser) {
                long ret = bindings.HTLCUpdate_read(ser);
                HTLCUpdate ret_hu_conv = new HTLCUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index fd95bef23cbe7938acb24758e76cf352b17605e7..584c9b7612e6e032f813180bb47be0fec77545db 100644 (file)
@@ -17,6 +17,7 @@ public class HolderCommitmentTransaction extends CommonBase {
        public HolderCommitmentTransaction clone() {
                long ret = bindings.HolderCommitmentTransaction_clone(this.ptr);
                HolderCommitmentTransaction ret_hu_conv = new HolderCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,12 +42,14 @@ public class HolderCommitmentTransaction extends CommonBase {
        public static HolderCommitmentTransaction constructor_read(byte[] ser) {
                long ret = bindings.HolderCommitmentTransaction_read(ser);
                HolderCommitmentTransaction ret_hu_conv = new HolderCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static HolderCommitmentTransaction constructor_new(CommitmentTransaction commitment_tx, byte[] counterparty_sig, byte[][] counterparty_htlc_sigs, byte[] holder_funding_key, byte[] counterparty_funding_key) {
                long ret = bindings.HolderCommitmentTransaction_new(commitment_tx == null ? 0 : commitment_tx.ptr & ~1, counterparty_sig, counterparty_htlc_sigs, holder_funding_key, counterparty_funding_key);
                HolderCommitmentTransaction ret_hu_conv = new HolderCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(commitment_tx);
                return ret_hu_conv;
        }
index 01e2d48447994aecafe601b644b29231b0f827d0..45345a40844b69f91d05d896af1c88e6de696cc9 100644 (file)
@@ -17,6 +17,7 @@ public class InMemoryChannelKeys extends CommonBase {
        public InMemoryChannelKeys clone() {
                long ret = bindings.InMemoryChannelKeys_clone(this.ptr);
                InMemoryChannelKeys ret_hu_conv = new InMemoryChannelKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -77,12 +78,14 @@ public class InMemoryChannelKeys extends CommonBase {
        public static InMemoryChannelKeys constructor_new(byte[] funding_key, byte[] revocation_base_key, byte[] payment_key, byte[] delayed_payment_base_key, byte[] htlc_base_key, byte[] commitment_seed, long channel_value_satoshis, TwoTuple<Long, Long> key_derivation_params) {
                long ret = bindings.InMemoryChannelKeys_new(funding_key, revocation_base_key, payment_key, delayed_payment_base_key, htlc_base_key, commitment_seed, channel_value_satoshis, bindings.C2Tuple_u64u64Z_new(key_derivation_params.a, key_derivation_params.b));
                InMemoryChannelKeys ret_hu_conv = new InMemoryChannelKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys counterparty_pubkeys() {
                long ret = bindings.InMemoryChannelKeys_counterparty_pubkeys(this.ptr);
                ChannelPublicKeys ret_hu_conv = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -104,12 +107,14 @@ public class InMemoryChannelKeys extends CommonBase {
        public OutPoint funding_outpoint() {
                long ret = bindings.InMemoryChannelKeys_funding_outpoint(this.ptr);
                OutPoint ret_hu_conv = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelTransactionParameters get_channel_parameters() {
                long ret = bindings.InMemoryChannelKeys_get_channel_parameters(this.ptr);
                ChannelTransactionParameters ret_hu_conv = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 7da0c6c1d7a293f951acbb81898d81ab59e4cc40..cadc4f31331372ce79ba138ae202d5ae9afda0b8 100644 (file)
@@ -17,6 +17,7 @@ public class Init extends CommonBase {
        public Init clone() {
                long ret = bindings.Init_clone(this.ptr);
                Init ret_hu_conv = new Init(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index a208bfeae48c03d361a4ec6c63b57e73a188fd72..16a4a87312f9ae6c98eebf168037c7622930fe49 100644 (file)
@@ -17,12 +17,14 @@ public class KeysManager extends CommonBase {
        public static KeysManager constructor_new(byte[] seed, LDKNetwork network, long starting_time_secs, int starting_time_nanos) {
                long ret = bindings.KeysManager_new(seed, network, starting_time_secs, starting_time_nanos);
                KeysManager ret_hu_conv = new KeysManager(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public InMemoryChannelKeys derive_channel_keys(long channel_value_satoshis, long params_1, long params_2) {
                long ret = bindings.KeysManager_derive_channel_keys(this.ptr, channel_value_satoshis, params_1, params_2);
                InMemoryChannelKeys ret_hu_conv = new InMemoryChannelKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index d5490f2bc567683412e919ec73a294746f958955..b1793b3202bbfe1743ee6bfdd1245612a255de4f 100644 (file)
@@ -14,6 +14,13 @@ public class LightningError extends CommonBase {
                if (ptr != 0) { bindings.LightningError_free(ptr); }
        }
 
+       public LightningError clone() {
+               long ret = bindings.LightningError_clone(this.ptr);
+               LightningError ret_hu_conv = new LightningError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public String get_err() {
                String ret = bindings.LightningError_get_err(this.ptr);
                return ret;
@@ -37,6 +44,7 @@ public class LightningError extends CommonBase {
        public static LightningError constructor_new(byte[] err_arg, ErrorAction action_arg) {
                long ret = bindings.LightningError_new(err_arg, action_arg.ptr);
                LightningError ret_hu_conv = new LightningError(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 2313ec9a1b4477009ffd5495a0c107cb020f5a4b..62647c2650be9f925647187e5bad047069b42d37 100644 (file)
@@ -15,6 +15,7 @@ public class LockedNetworkGraph extends CommonBase implements AutoCloseable {
        public NetworkGraph graph() {
                long ret = bindings.LockedNetworkGraph_graph(this.ptr);
                NetworkGraph ret_hu_conv = new NetworkGraph(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 09578c892cb118f542c07cb73655684145d6f076..389e2a88e1ed032bc3cae30e9bb27adca23724ec 100644 (file)
@@ -41,6 +41,7 @@ public class MessageHandler extends CommonBase {
        public static MessageHandler constructor_new(ChannelMessageHandler chan_handler_arg, RoutingMessageHandler route_handler_arg) {
                long ret = bindings.MessageHandler_new(chan_handler_arg == null ? 0 : chan_handler_arg.ptr, route_handler_arg == null ? 0 : route_handler_arg.ptr);
                MessageHandler ret_hu_conv = new MessageHandler(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chan_handler_arg);
                ret_hu_conv.ptrs_to.add(route_handler_arg);
                return ret_hu_conv;
index 30b7548f2fed04c40930018226c44819cf60bc6b..32be00eaa697737941bbb4d09791108eaabb1f43 100644 (file)
@@ -80,6 +80,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        AcceptChannel msg_hu_conv = new AcceptChannel(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -91,6 +92,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        OpenChannel msg_hu_conv = new OpenChannel(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -102,6 +104,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        FundingCreated msg_hu_conv = new FundingCreated(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -113,6 +116,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        FundingSigned msg_hu_conv = new FundingSigned(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -124,6 +128,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        FundingLocked msg_hu_conv = new FundingLocked(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -135,6 +140,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        AnnouncementSignatures msg_hu_conv = new AnnouncementSignatures(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -146,6 +152,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long updates = obj.updates;
                        CommitmentUpdate updates_hu_conv = new CommitmentUpdate(null, updates);
+                       updates_hu_conv.ptrs_to.add(this);
                        this.updates = updates_hu_conv;
                }
        }
@@ -157,6 +164,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        RevokeAndACK msg_hu_conv = new RevokeAndACK(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -168,6 +176,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        ClosingSigned msg_hu_conv = new ClosingSigned(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -179,6 +188,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        Shutdown msg_hu_conv = new Shutdown(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -190,6 +200,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        ChannelReestablish msg_hu_conv = new ChannelReestablish(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -200,9 +211,11 @@ public class MessageSendEvent extends CommonBase {
                        super(null, ptr);
                        long msg = obj.msg;
                        ChannelAnnouncement msg_hu_conv = new ChannelAnnouncement(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                        long update_msg = obj.update_msg;
                        ChannelUpdate update_msg_hu_conv = new ChannelUpdate(null, update_msg);
+                       update_msg_hu_conv.ptrs_to.add(this);
                        this.update_msg = update_msg_hu_conv;
                }
        }
@@ -212,6 +225,7 @@ public class MessageSendEvent extends CommonBase {
                        super(null, ptr);
                        long msg = obj.msg;
                        NodeAnnouncement msg_hu_conv = new NodeAnnouncement(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -221,6 +235,7 @@ public class MessageSendEvent extends CommonBase {
                        super(null, ptr);
                        long msg = obj.msg;
                        ChannelUpdate msg_hu_conv = new ChannelUpdate(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -254,6 +269,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        QueryChannelRange msg_hu_conv = new QueryChannelRange(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
@@ -265,6 +281,7 @@ public class MessageSendEvent extends CommonBase {
                        this.node_id = obj.node_id;
                        long msg = obj.msg;
                        QueryShortChannelIds msg_hu_conv = new QueryShortChannelIds(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                        this.msg = msg_hu_conv;
                }
        }
index bbe27e368899bd56a3beb0aa9324b8b10a7b685e..68106397b928559bd1f772e3d38b930c8189ded6 100644 (file)
@@ -17,6 +17,7 @@ public class MonitorEvent extends CommonBase {
        public MonitorEvent clone() {
                long ret = bindings.MonitorEvent_clone(this.ptr);
                MonitorEvent ret_hu_conv = new MonitorEvent(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index b6589a9feaf8b32ebe938024c88ad18143a82326..419e0160094086a029e9f887091025d937220761 100644 (file)
@@ -14,4 +14,11 @@ public class MonitorUpdateError extends CommonBase {
                if (ptr != 0) { bindings.MonitorUpdateError_free(ptr); }
        }
 
+       public MonitorUpdateError clone() {
+               long ret = bindings.MonitorUpdateError_clone(this.ptr);
+               MonitorUpdateError ret_hu_conv = new MonitorUpdateError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
 }
index 3fba8fa45bad68139ada87f1fd4c64359aca87ae..2351063e62e0c262c7c52b835d8ef14b2aa32e3e 100644 (file)
@@ -17,6 +17,7 @@ public class NetGraphMsgHandler extends CommonBase {
        public static NetGraphMsgHandler constructor_new(byte[] genesis_hash, Access chain_access, Logger logger) {
                long ret = bindings.NetGraphMsgHandler_new(genesis_hash, chain_access == null ? 0 : chain_access.ptr, logger == null ? 0 : logger.ptr);
                NetGraphMsgHandler ret_hu_conv = new NetGraphMsgHandler(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chain_access);
                ret_hu_conv.ptrs_to.add(logger);
                return ret_hu_conv;
@@ -25,6 +26,7 @@ public class NetGraphMsgHandler extends CommonBase {
        public static NetGraphMsgHandler constructor_from_net_graph(Access chain_access, Logger logger, byte[] network_graph_genesis_hash) {
                long ret = bindings.NetGraphMsgHandler_from_net_graph(chain_access == null ? 0 : chain_access.ptr, logger == null ? 0 : logger.ptr, bindings.NetworkGraph_new(network_graph_genesis_hash));
                NetGraphMsgHandler ret_hu_conv = new NetGraphMsgHandler(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chain_access);
                ret_hu_conv.ptrs_to.add(logger);
                return ret_hu_conv;
@@ -33,6 +35,7 @@ public class NetGraphMsgHandler extends CommonBase {
        public LockedNetworkGraph read_locked_graph() {
                long ret = bindings.NetGraphMsgHandler_read_locked_graph(this.ptr);
                LockedNetworkGraph ret_hu_conv = new LockedNetworkGraph(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 778e475b14677ee43cf367a355966e83ca640f0f..9ed88b6d86e2dec3910a7af9eb11dadfc97a6888 100644 (file)
@@ -28,6 +28,7 @@ public class NetworkGraph extends CommonBase {
        public static NetworkGraph constructor_new(byte[] genesis_hash) {
                long ret = bindings.NetworkGraph_new(genesis_hash);
                NetworkGraph ret_hu_conv = new NetworkGraph(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 4a151d13b1ed55f2dacbfe55c36e9cf609f587b2..26cdd5821d8df4ea04ad86dec33b226d21919154 100644 (file)
@@ -17,6 +17,7 @@ public class NodeAnnouncement extends CommonBase {
        public NodeAnnouncement clone() {
                long ret = bindings.NodeAnnouncement_clone(this.ptr);
                NodeAnnouncement ret_hu_conv = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,6 +33,7 @@ public class NodeAnnouncement extends CommonBase {
        public UnsignedNodeAnnouncement get_contents() {
                long ret = bindings.NodeAnnouncement_get_contents(this.ptr);
                UnsignedNodeAnnouncement ret_hu_conv = new UnsignedNodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -43,6 +45,7 @@ public class NodeAnnouncement extends CommonBase {
        public static NodeAnnouncement constructor_new(byte[] signature_arg, UnsignedNodeAnnouncement contents_arg) {
                long ret = bindings.NodeAnnouncement_new(signature_arg, contents_arg == null ? 0 : contents_arg.ptr & ~1);
                NodeAnnouncement ret_hu_conv = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(contents_arg);
                return ret_hu_conv;
        }
@@ -55,6 +58,7 @@ public class NodeAnnouncement extends CommonBase {
        public static NodeAnnouncement constructor_read(byte[] ser) {
                long ret = bindings.NodeAnnouncement_read(ser);
                NodeAnnouncement ret_hu_conv = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 0ce531e5ca9a003b759b849590110126207901eb..f59c055ef35d2b6a8382a148fec2a0f6f96c727b 100644 (file)
@@ -14,15 +14,31 @@ public class NodeAnnouncementInfo extends CommonBase {
                if (ptr != 0) { bindings.NodeAnnouncementInfo_free(ptr); }
        }
 
+       public NodeAnnouncementInfo clone() {
+               long ret = bindings.NodeAnnouncementInfo_clone(this.ptr);
+               NodeAnnouncementInfo ret_hu_conv = new NodeAnnouncementInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public NodeFeatures get_features() {
                long ret = bindings.NodeAnnouncementInfo_get_features(this.ptr);
                NodeFeatures ret_hu_conv = new NodeFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(NodeFeatures val) {
                bindings.NodeAnnouncementInfo_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public int get_last_update() {
@@ -60,6 +76,7 @@ public class NodeAnnouncementInfo extends CommonBase {
        public NodeAnnouncement get_announcement_message() {
                long ret = bindings.NodeAnnouncementInfo_get_announcement_message(this.ptr);
                NodeAnnouncement ret_hu_conv = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -71,7 +88,16 @@ public class NodeAnnouncementInfo extends CommonBase {
        public static NodeAnnouncementInfo constructor_new(NodeFeatures features_arg, int last_update_arg, byte[] rgb_arg, byte[] alias_arg, NetAddress[] addresses_arg, NodeAnnouncement announcement_message_arg) {
                long ret = bindings.NodeAnnouncementInfo_new(features_arg == null ? 0 : features_arg.ptr & ~1, last_update_arg, rgb_arg, alias_arg, Arrays.stream(addresses_arg).mapToLong(arr_conv_12 -> arr_conv_12.ptr).toArray(), announcement_message_arg == null ? 0 : announcement_message_arg.ptr & ~1);
                NodeAnnouncementInfo ret_hu_conv = new NodeAnnouncementInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(features_arg);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid ret_hu_conv being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after ret_hu_conv call, features_arg is reset to null and is now a dummy object.
+               features_arg.ptr = 0;
                /* TODO 2 NetAddress  */;
                ret_hu_conv.ptrs_to.add(announcement_message_arg);
                return ret_hu_conv;
index 018d5bc4bc83a1660ddb6f561ac2312c592646dd..ba19c79b125763024e397d969758049d143fe4af 100644 (file)
@@ -14,6 +14,13 @@ public class NodeInfo extends CommonBase {
                if (ptr != 0) { bindings.NodeInfo_free(ptr); }
        }
 
+       public NodeInfo clone() {
+               long ret = bindings.NodeInfo_clone(this.ptr);
+               NodeInfo ret_hu_conv = new NodeInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public void set_channels(long[] val) {
                bindings.NodeInfo_set_channels(this.ptr, val);
        }
@@ -21,6 +28,7 @@ public class NodeInfo extends CommonBase {
        public RoutingFees get_lowest_inbound_channel_fees() {
                long ret = bindings.NodeInfo_get_lowest_inbound_channel_fees(this.ptr);
                RoutingFees ret_hu_conv = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,20 +40,21 @@ public class NodeInfo extends CommonBase {
        public NodeAnnouncementInfo get_announcement_info() {
                long ret = bindings.NodeInfo_get_announcement_info(this.ptr);
                NodeAnnouncementInfo ret_hu_conv = new NodeAnnouncementInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
-       public void set_announcement_info(NodeFeatures val_features_arg, int val_last_update_arg, byte[] val_rgb_arg, byte[] val_alias_arg, NetAddress[] val_addresses_arg, NodeAnnouncement val_announcement_message_arg) {
-               bindings.NodeInfo_set_announcement_info(this.ptr, bindings.NodeAnnouncementInfo_new(val_features_arg == null ? 0 : val_features_arg.ptr & ~1, val_last_update_arg, val_rgb_arg, val_alias_arg, Arrays.stream(val_addresses_arg).mapToLong(arr_conv_12 -> arr_conv_12.ptr).toArray(), val_announcement_message_arg == null ? 0 : val_announcement_message_arg.ptr & ~1));
+       public void set_announcement_info(NodeAnnouncementInfo val) {
+               bindings.NodeInfo_set_announcement_info(this.ptr, val == null ? 0 : val.ptr & ~1);
+               this.ptrs_to.add(val);
        }
 
-       public static NodeInfo constructor_new(long[] channels_arg, RoutingFees lowest_inbound_channel_fees_arg, NodeFeatures announcement_info_arg_features_arg, int announcement_info_arg_last_update_arg, byte[] announcement_info_arg_rgb_arg, byte[] announcement_info_arg_alias_arg, NetAddress[] announcement_info_arg_addresses_arg, NodeAnnouncement announcement_info_arg_announcement_message_arg) {
-               long ret = bindings.NodeInfo_new(channels_arg, lowest_inbound_channel_fees_arg == null ? 0 : lowest_inbound_channel_fees_arg.ptr & ~1, bindings.NodeAnnouncementInfo_new(announcement_info_arg_features_arg == null ? 0 : announcement_info_arg_features_arg.ptr & ~1, announcement_info_arg_last_update_arg, announcement_info_arg_rgb_arg, announcement_info_arg_alias_arg, Arrays.stream(announcement_info_arg_addresses_arg).mapToLong(arr_conv_12 -> arr_conv_12.ptr).toArray(), announcement_info_arg_announcement_message_arg == null ? 0 : announcement_info_arg_announcement_message_arg.ptr & ~1));
+       public static NodeInfo constructor_new(long[] channels_arg, RoutingFees lowest_inbound_channel_fees_arg, NodeAnnouncementInfo announcement_info_arg) {
+               long ret = bindings.NodeInfo_new(channels_arg, lowest_inbound_channel_fees_arg == null ? 0 : lowest_inbound_channel_fees_arg.ptr & ~1, announcement_info_arg == null ? 0 : announcement_info_arg.ptr & ~1);
                NodeInfo ret_hu_conv = new NodeInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(lowest_inbound_channel_fees_arg);
-               ret_hu_conv.ptrs_to.add(announcement_info_arg_features_arg);
-               /* TODO 2 NetAddress  */;
-               ret_hu_conv.ptrs_to.add(announcement_info_arg_announcement_message_arg);
+               ret_hu_conv.ptrs_to.add(announcement_info_arg);
                return ret_hu_conv;
        }
 
index 0a99f832162526b23c4008a71446a15719dbf0ba..2de4e031a009fd996e3eb089be29ca21337609f2 100644 (file)
@@ -17,6 +17,7 @@ public class OpenChannel extends CommonBase {
        public OpenChannel clone() {
                long ret = bindings.OpenChannel_clone(this.ptr);
                OpenChannel ret_hu_conv = new OpenChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -190,6 +191,7 @@ public class OpenChannel extends CommonBase {
        public static OpenChannel constructor_read(byte[] ser) {
                long ret = bindings.OpenChannel_read(ser);
                OpenChannel ret_hu_conv = new OpenChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 605d216080c386b8a1241f4cda561913050de61a..edc0a7f3c0a99a12e23d58a2e0ad5feec713ec06 100644 (file)
@@ -17,6 +17,7 @@ public class OutPoint extends CommonBase {
        public OutPoint clone() {
                long ret = bindings.OutPoint_clone(this.ptr);
                OutPoint ret_hu_conv = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class OutPoint extends CommonBase {
        public static OutPoint constructor_new(byte[] txid_arg, short index_arg) {
                long ret = bindings.OutPoint_new(txid_arg, index_arg);
                OutPoint ret_hu_conv = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -57,6 +59,7 @@ public class OutPoint extends CommonBase {
        public static OutPoint constructor_read(byte[] ser) {
                long ret = bindings.OutPoint_read(ser);
                OutPoint ret_hu_conv = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 7b7f363236902d3ef1c746f6e406a3703fe4143f..48fd7a02a4faa9eec37adc2c24e49b4302354d21 100644 (file)
@@ -14,4 +14,11 @@ public class PaymentSendFailure extends CommonBase {
                if (ptr != 0) { bindings.PaymentSendFailure_free(ptr); }
        }
 
+       public PaymentSendFailure clone() {
+               long ret = bindings.PaymentSendFailure_clone(this.ptr);
+               PaymentSendFailure ret_hu_conv = new PaymentSendFailure(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
 }
index 1b7b3987dce97363fb5bb06cc21f92f9775e819d..b24730289942c82b409ec7f46ff61236e2c612fa 100644 (file)
@@ -14,6 +14,13 @@ public class PeerHandleError extends CommonBase {
                if (ptr != 0) { bindings.PeerHandleError_free(ptr); }
        }
 
+       public PeerHandleError clone() {
+               long ret = bindings.PeerHandleError_clone(this.ptr);
+               PeerHandleError ret_hu_conv = new PeerHandleError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public boolean get_no_connection_possible() {
                boolean ret = bindings.PeerHandleError_get_no_connection_possible(this.ptr);
                return ret;
@@ -26,6 +33,7 @@ public class PeerHandleError extends CommonBase {
        public static PeerHandleError constructor_new(boolean no_connection_possible_arg) {
                long ret = bindings.PeerHandleError_new(no_connection_possible_arg);
                PeerHandleError ret_hu_conv = new PeerHandleError(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 22fe597f68f552ace826d06770eb133bb9e9865b..1daf97aeb4a782436db5721613fe6e989cb68c3e 100644 (file)
@@ -17,6 +17,7 @@ public class PeerManager extends CommonBase {
        public static PeerManager constructor_new(ChannelMessageHandler message_handler_chan_handler_arg, RoutingMessageHandler message_handler_route_handler_arg, byte[] our_node_secret, byte[] ephemeral_random_data, Logger logger) {
                long ret = bindings.PeerManager_new(bindings.MessageHandler_new(message_handler_chan_handler_arg == null ? 0 : message_handler_chan_handler_arg.ptr, message_handler_route_handler_arg == null ? 0 : message_handler_route_handler_arg.ptr), our_node_secret, ephemeral_random_data, logger == null ? 0 : logger.ptr);
                PeerManager ret_hu_conv = new PeerManager(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(message_handler_chan_handler_arg);
                ret_hu_conv.ptrs_to.add(message_handler_route_handler_arg);
                ret_hu_conv.ptrs_to.add(logger);
index 754f39115955c0ed313a5814583201c4ee114dce..3e318d81dc977465edb50381d7504b87dea24a3c 100644 (file)
@@ -29,6 +29,7 @@ public class Persist extends CommonBase {
                impl_holder.held = new Persist(new bindings.LDKPersist() {
                        @Override public long persist_new_channel(long id, long data) {
                                OutPoint id_hu_conv = new OutPoint(null, id);
+                               id_hu_conv.ptrs_to.add(this);
                                ChannelMonitor data_hu_conv = new ChannelMonitor(null, data);
                                Result_NoneChannelMonitorUpdateErrZ ret = arg.persist_new_channel(id_hu_conv, data_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
@@ -36,6 +37,7 @@ public class Persist extends CommonBase {
                        }
                        @Override public long update_persisted_channel(long id, long update, long data) {
                                OutPoint id_hu_conv = new OutPoint(null, id);
+                               id_hu_conv.ptrs_to.add(this);
                                ChannelMonitorUpdate update_hu_conv = new ChannelMonitorUpdate(null, update);
                                ChannelMonitor data_hu_conv = new ChannelMonitor(null, data);
                                Result_NoneChannelMonitorUpdateErrZ ret = arg.update_persisted_channel(id_hu_conv, update_hu_conv, data_hu_conv);
index 3630dab0839fbcf943cc98e43702f39f4a7d3058..72815630a7af57f4964d7033f6b47077fc3c6c2e 100644 (file)
@@ -17,6 +17,7 @@ public class Ping extends CommonBase {
        public Ping clone() {
                long ret = bindings.Ping_clone(this.ptr);
                Ping ret_hu_conv = new Ping(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class Ping extends CommonBase {
        public static Ping constructor_new(short ponglen_arg, short byteslen_arg) {
                long ret = bindings.Ping_new(ponglen_arg, byteslen_arg);
                Ping ret_hu_conv = new Ping(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 854ba669f589fcdded39d15cd36ddb0780d89aae..ef636e284961a5c9b7684ddc069c2661061b615e 100644 (file)
@@ -17,6 +17,7 @@ public class Pong extends CommonBase {
        public Pong clone() {
                long ret = bindings.Pong_clone(this.ptr);
                Pong ret_hu_conv = new Pong(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,6 +33,7 @@ public class Pong extends CommonBase {
        public static Pong constructor_new(short byteslen_arg) {
                long ret = bindings.Pong_new(byteslen_arg);
                Pong ret_hu_conv = new Pong(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 53491db5e6c182bd4cada8e643f3a797611b2c11..acacd0537b4ce2980ae47fb86d682d80c93b07ed 100644 (file)
@@ -17,6 +17,7 @@ public class QueryChannelRange extends CommonBase {
        public QueryChannelRange clone() {
                long ret = bindings.QueryChannelRange_clone(this.ptr);
                QueryChannelRange ret_hu_conv = new QueryChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,6 +51,7 @@ public class QueryChannelRange extends CommonBase {
        public static QueryChannelRange constructor_new(byte[] chain_hash_arg, int first_blocknum_arg, int number_of_blocks_arg) {
                long ret = bindings.QueryChannelRange_new(chain_hash_arg, first_blocknum_arg, number_of_blocks_arg);
                QueryChannelRange ret_hu_conv = new QueryChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 1faab93a4bc119155f01b3b033efc8d4381253f8..2c9f57d7569d271ec4587ab7f32fc72484a16ad4 100644 (file)
@@ -17,6 +17,7 @@ public class QueryShortChannelIds extends CommonBase {
        public QueryShortChannelIds clone() {
                long ret = bindings.QueryShortChannelIds_clone(this.ptr);
                QueryShortChannelIds ret_hu_conv = new QueryShortChannelIds(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -36,6 +37,7 @@ public class QueryShortChannelIds extends CommonBase {
        public static QueryShortChannelIds constructor_new(byte[] chain_hash_arg, long[] short_channel_ids_arg) {
                long ret = bindings.QueryShortChannelIds_new(chain_hash_arg, short_channel_ids_arg);
                QueryShortChannelIds ret_hu_conv = new QueryShortChannelIds(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index d49f6a47c1a3db28f2d952e3adf3f68dcbd6ea4f..ca7243da6d12c8dc9b79060a09563fbcc1d9cabd 100644 (file)
@@ -17,6 +17,7 @@ public class ReplyChannelRange extends CommonBase {
        public ReplyChannelRange clone() {
                long ret = bindings.ReplyChannelRange_clone(this.ptr);
                ReplyChannelRange ret_hu_conv = new ReplyChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -63,6 +64,7 @@ public class ReplyChannelRange extends CommonBase {
        public static ReplyChannelRange constructor_new(byte[] chain_hash_arg, int first_blocknum_arg, int number_of_blocks_arg, boolean full_information_arg, long[] short_channel_ids_arg) {
                long ret = bindings.ReplyChannelRange_new(chain_hash_arg, first_blocknum_arg, number_of_blocks_arg, full_information_arg, short_channel_ids_arg);
                ReplyChannelRange ret_hu_conv = new ReplyChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 224cc61b0acc00d87c770e4b5f426921b9c44074..a558d5c90a042a6083149ce3ca4888d69d10aa61 100644 (file)
@@ -17,6 +17,7 @@ public class ReplyShortChannelIdsEnd extends CommonBase {
        public ReplyShortChannelIdsEnd clone() {
                long ret = bindings.ReplyShortChannelIdsEnd_clone(this.ptr);
                ReplyShortChannelIdsEnd ret_hu_conv = new ReplyShortChannelIdsEnd(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class ReplyShortChannelIdsEnd extends CommonBase {
        public static ReplyShortChannelIdsEnd constructor_new(byte[] chain_hash_arg, boolean full_information_arg) {
                long ret = bindings.ReplyShortChannelIdsEnd_new(chain_hash_arg, full_information_arg);
                ReplyShortChannelIdsEnd ret_hu_conv = new ReplyShortChannelIdsEnd(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index fb1b524798e869340d9cfa134b76cb21fb455ed6..70127ff0184e15d07236bb6df300940e9626fe47 100644 (file)
@@ -26,12 +26,22 @@ public class Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ extends CommonB
                        long res = bindings.LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_ok(ptr);
                        byte[] res_a = bindings.LDKC2Tuple_BlockHashChannelManagerZ_get_a(res);
                        long res_b = bindings.LDKC2Tuple_BlockHashChannelManagerZ_get_b(res);
-                       ChannelManager res_b_hu_conv = new ChannelManager(null, res_b);;
+                       ChannelManager res_b_hu_conv = new ChannelManager(null, res_b);
+                       res_b_hu_conv.ptrs_to.add(this);;
                        TwoTuple<byte[], ChannelManager> res_conv = new TwoTuple<byte[], ChannelManager>(res_a, res_b_hu_conv);
                        this.res = res_conv;
                }
                public Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_OK(TwoTuple<byte[], ChannelManager> res) {
-                       this(null, bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelManagerZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1/*XXX: this.ptrs_to.add(res_b)*/)));
+                       this(null, bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelManagerZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1)));
+                       this.ptrs_to.add(res.b);
+                       // Due to rust's strict-ownership memory model, in some cases we need to "move"
+                       // an object to pass exclusive ownership to the function being called.
+                       // In most cases, we avoid this being visible in GC'd languages by cloning the object
+                       // at the FFI layer, creating a new object which Rust can claim ownership of
+                       // However, in some cases (eg here), there is no way to clone an object, and thus
+                       // we actually have to pass full ownership to Rust.
+                       // Thus, after this call, res.b is reset to null and is now a dummy object.
+                       res.b.ptr = 0;
                }
        }
 
@@ -41,6 +51,7 @@ public class Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ extends CommonB
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_Err(DecodeError err) {
index fef8c6323f58d52f030fbb153c6134efc85d7ebe..a3e3d2310383b05ef92cfbf1d3a9711f685d89d6 100644 (file)
@@ -26,12 +26,14 @@ public class Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ extends CommonB
                        long res = bindings.LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_ok(ptr);
                        byte[] res_a = bindings.LDKC2Tuple_BlockHashChannelMonitorZ_get_a(res);
                        long res_b = bindings.LDKC2Tuple_BlockHashChannelMonitorZ_get_b(res);
-                       ChannelMonitor res_b_hu_conv = new ChannelMonitor(null, res_b);;
+                       ChannelMonitor res_b_hu_conv = new ChannelMonitor(null, res_b);
+                       res_b_hu_conv.ptrs_to.add(this);;
                        TwoTuple<byte[], ChannelMonitor> res_conv = new TwoTuple<byte[], ChannelMonitor>(res_a, res_b_hu_conv);
                        this.res = res_conv;
                }
                public Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK(TwoTuple<byte[], ChannelMonitor> res) {
-                       this(null, bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelMonitorZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1/*XXX: this.ptrs_to.add(res_b)*/)));
+                       this(null, bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelMonitorZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1)));
+                       this.ptrs_to.add(res.b);
                }
        }
 
@@ -41,6 +43,7 @@ public class Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ extends CommonB
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_Err(DecodeError err) {
index 0a0cfeb771bfebe66cd598136e3946ae9c057ccd..3bc546ff72350d0470fe04357da9171cf46c7fe4 100644 (file)
@@ -38,6 +38,7 @@ public class Result_CResult_NetAddressu8ZDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_CResult_NetAddressu8ZDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_CResult_NetAddressu8ZDecodeErrorZ_Err(DecodeError err) {
index 3ef723e6c19d4f8e8d0a1f351aa3cfc4c7cb3608..e47dcd4675f26f30961f4b6e2f7737e6188c7fc1 100644 (file)
@@ -36,6 +36,7 @@ public class Result_CVec_u8ZPeerHandleErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_CVec_u8ZPeerHandleErrorZ_get_err(ptr);
                        PeerHandleError err_hu_conv = new PeerHandleError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_CVec_u8ZPeerHandleErrorZ_Err(PeerHandleError err) {
index 1aa74eea86b479d69ef3c40023e3f3d31ec735b0..6b401df82aba7d493d6a1a042f5768ff57b1241c 100644 (file)
@@ -40,6 +40,7 @@ public class Result_ChanKeySignerDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_ChanKeySignerDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ChanKeySignerDecodeErrorZ_Err(DecodeError err) {
index 0b1aa205ba7384998dd364a5e2f1cb0396a17478..9e2211fbc4f1e981d4b0ffab025bb02a9687d4a1 100644 (file)
@@ -25,6 +25,7 @@ public class Result_ChannelMonitorUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_ChannelMonitorUpdateDecodeErrorZ_get_ok(ptr);
                        ChannelMonitorUpdate res_hu_conv = new ChannelMonitorUpdate(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ChannelMonitorUpdateDecodeErrorZ_OK(ChannelMonitorUpdate res) {
@@ -39,6 +40,7 @@ public class Result_ChannelMonitorUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_ChannelMonitorUpdateDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ChannelMonitorUpdateDecodeErrorZ_Err(DecodeError err) {
index e496269f55a281fb7fdff0da764feef2e260098c..d13f65839d104936ba27528d26e5d07fcc02c88d 100644 (file)
@@ -25,6 +25,7 @@ public class Result_ChannelReestablishDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_ChannelReestablishDecodeErrorZ_get_ok(ptr);
                        ChannelReestablish res_hu_conv = new ChannelReestablish(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ChannelReestablishDecodeErrorZ_OK(ChannelReestablish res) {
@@ -39,6 +40,7 @@ public class Result_ChannelReestablishDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_ChannelReestablishDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ChannelReestablishDecodeErrorZ_Err(DecodeError err) {
index c6e2bda96a24df236b10c87cb0b96423a690d2d7..cd2383b494768e3158727df27aeb3af0850b0d0f 100644 (file)
@@ -25,6 +25,7 @@ public class Result_ErrorMessageDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_ErrorMessageDecodeErrorZ_get_ok(ptr);
                        ErrorMessage res_hu_conv = new ErrorMessage(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ErrorMessageDecodeErrorZ_OK(ErrorMessage res) {
@@ -39,6 +40,7 @@ public class Result_ErrorMessageDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_ErrorMessageDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ErrorMessageDecodeErrorZ_Err(DecodeError err) {
index fe376e70688e891395e8c5c1dea3684a4ed413f1..85b872b0bf004ba80036a74ed6c584806639d65e 100644 (file)
@@ -25,6 +25,7 @@ public class Result_GossipTimestampFilterDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_GossipTimestampFilterDecodeErrorZ_get_ok(ptr);
                        GossipTimestampFilter res_hu_conv = new GossipTimestampFilter(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_GossipTimestampFilterDecodeErrorZ_OK(GossipTimestampFilter res) {
@@ -39,6 +40,7 @@ public class Result_GossipTimestampFilterDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_GossipTimestampFilterDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_GossipTimestampFilterDecodeErrorZ_Err(DecodeError err) {
index ea33fa2c3fa8f2a6a593ae987d446b213734302c..a47ae76297d2740dd61eb15cf936d756f5ef5ec0 100644 (file)
@@ -25,6 +25,7 @@ public class Result_InMemoryChannelKeysDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_InMemoryChannelKeysDecodeErrorZ_get_ok(ptr);
                        InMemoryChannelKeys res_hu_conv = new InMemoryChannelKeys(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_InMemoryChannelKeysDecodeErrorZ_OK(InMemoryChannelKeys res) {
@@ -39,6 +40,7 @@ public class Result_InMemoryChannelKeysDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_InMemoryChannelKeysDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_InMemoryChannelKeysDecodeErrorZ_Err(DecodeError err) {
index 8719e28c90f841dad2af978248ca71dc2ed3efcb..d492d9a56f872d9ec621bacc0c9254e6101c09c1 100644 (file)
@@ -25,6 +25,7 @@ public class Result_InitDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_InitDecodeErrorZ_get_ok(ptr);
                        Init res_hu_conv = new Init(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_InitDecodeErrorZ_OK(Init res) {
@@ -39,6 +40,7 @@ public class Result_InitDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_InitDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_InitDecodeErrorZ_Err(DecodeError err) {
index 2d3f603d9c6168cc3ffca6e2e2fc7958c1bd998d..a475625d0c7baea32fce2758727c19c0428d00a9 100644 (file)
@@ -25,11 +25,20 @@ public class Result_NetworkGraphDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_NetworkGraphDecodeErrorZ_get_ok(ptr);
                        NetworkGraph res_hu_conv = new NetworkGraph(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_NetworkGraphDecodeErrorZ_OK(NetworkGraph res) {
                        this(null, bindings.CResult_NetworkGraphDecodeErrorZ_ok(res == null ? 0 : res.ptr & ~1));
                        this.ptrs_to.add(res);
+                       // Due to rust's strict-ownership memory model, in some cases we need to "move"
+                       // an object to pass exclusive ownership to the function being called.
+                       // In most cases, we avoid this being visible in GC'd languages by cloning the object
+                       // at the FFI layer, creating a new object which Rust can claim ownership of
+                       // However, in some cases (eg here), there is no way to clone an object, and thus
+                       // we actually have to pass full ownership to Rust.
+                       // Thus, after this call, res is reset to null and is now a dummy object.
+                       res.ptr = 0;
                }
        }
 
@@ -39,6 +48,7 @@ public class Result_NetworkGraphDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_NetworkGraphDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NetworkGraphDecodeErrorZ_Err(DecodeError err) {
index 3de2c49d6b256a4fba1bdfc1cb0a4bf0970a9fcc..ef9548864e72fa165423ff775a849ed62b9472e6 100644 (file)
@@ -25,6 +25,7 @@ public class Result_NodeAnnouncementInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(ptr);
                        NodeAnnouncementInfo res_hu_conv = new NodeAnnouncementInfo(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_NodeAnnouncementInfoDecodeErrorZ_OK(NodeAnnouncementInfo res) {
@@ -39,6 +40,7 @@ public class Result_NodeAnnouncementInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_NodeAnnouncementInfoDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NodeAnnouncementInfoDecodeErrorZ_Err(DecodeError err) {
index 01d528e3488e54eb4e8a6338ac74633883235f23..11e99111511db3cba1da496a69a3679997147144 100644 (file)
@@ -25,6 +25,7 @@ public class Result_NodeInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_NodeInfoDecodeErrorZ_get_ok(ptr);
                        NodeInfo res_hu_conv = new NodeInfo(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_NodeInfoDecodeErrorZ_OK(NodeInfo res) {
@@ -39,6 +40,7 @@ public class Result_NodeInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_NodeInfoDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NodeInfoDecodeErrorZ_Err(DecodeError err) {
index 056bb41a1e4d59c323627e33d19727f7bec3a228..436be322e2db34378f0f581cb1300eedc471338e 100644 (file)
@@ -34,6 +34,7 @@ public class Result_NoneLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_NoneLightningErrorZ_get_err(ptr);
                        LightningError err_hu_conv = new LightningError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NoneLightningErrorZ_Err(LightningError err) {
index 1a18d9232baffb64a76b167f4def1fba8241f728..9ab9611ccdbdee88de3664f83bd81a1347c4f9c8 100644 (file)
@@ -34,6 +34,7 @@ public class Result_NoneMonitorUpdateErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_NoneMonitorUpdateErrorZ_get_err(ptr);
                        MonitorUpdateError err_hu_conv = new MonitorUpdateError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NoneMonitorUpdateErrorZ_Err(MonitorUpdateError err) {
index 8bb2b0375355f595838b66af5873b457801d9367..7b0f72bc6196095d24501b8cc1afea6f37c4c73b 100644 (file)
@@ -34,6 +34,7 @@ public class Result_NonePaymentSendFailureZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_NonePaymentSendFailureZ_get_err(ptr);
                        PaymentSendFailure err_hu_conv = new PaymentSendFailure(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NonePaymentSendFailureZ_Err(PaymentSendFailure err) {
index c3aa3adfd16b5e8b768ae1a539766f000427e44f..6c93409161f9ec6999da8cdeaa46dd605b5b2024 100644 (file)
@@ -34,6 +34,7 @@ public class Result_NonePeerHandleErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_NonePeerHandleErrorZ_get_err(ptr);
                        PeerHandleError err_hu_conv = new PeerHandleError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NonePeerHandleErrorZ_Err(PeerHandleError err) {
index 078fd1f89324b1d32c3c164c91db145ac5b4a929..90c10d2667f18c90e713f1c910178424d9b60f6b 100644 (file)
@@ -25,6 +25,7 @@ public class Result_PingDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_PingDecodeErrorZ_get_ok(ptr);
                        Ping res_hu_conv = new Ping(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_PingDecodeErrorZ_OK(Ping res) {
@@ -39,6 +40,7 @@ public class Result_PingDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_PingDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_PingDecodeErrorZ_Err(DecodeError err) {
index 6ccd90dda7a5915736913b6a43387b1b574dec55..c89904e97b99eaced1c6326b789e64edf182cd47 100644 (file)
@@ -25,6 +25,7 @@ public class Result_PongDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_PongDecodeErrorZ_get_ok(ptr);
                        Pong res_hu_conv = new Pong(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_PongDecodeErrorZ_OK(Pong res) {
@@ -39,6 +40,7 @@ public class Result_PongDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_PongDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_PongDecodeErrorZ_Err(DecodeError err) {
index 9a94fdfb5a6d068debef8ef4cbf2953e48f4a8d8..1bfd4620eeb23eee7866ed00e8c1628a7df2893c 100644 (file)
@@ -25,6 +25,7 @@ public class Result_QueryChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_QueryChannelRangeDecodeErrorZ_get_ok(ptr);
                        QueryChannelRange res_hu_conv = new QueryChannelRange(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_QueryChannelRangeDecodeErrorZ_OK(QueryChannelRange res) {
@@ -39,6 +40,7 @@ public class Result_QueryChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_QueryChannelRangeDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_QueryChannelRangeDecodeErrorZ_Err(DecodeError err) {
index 822a6dd60180caf89e088da9b26179e3e64a1940..b903ae3ddf4fce09ab2da7774d441e4c90f78e06 100644 (file)
@@ -25,6 +25,7 @@ public class Result_QueryShortChannelIdsDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_QueryShortChannelIdsDecodeErrorZ_get_ok(ptr);
                        QueryShortChannelIds res_hu_conv = new QueryShortChannelIds(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_QueryShortChannelIdsDecodeErrorZ_OK(QueryShortChannelIds res) {
@@ -39,6 +40,7 @@ public class Result_QueryShortChannelIdsDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_QueryShortChannelIdsDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_QueryShortChannelIdsDecodeErrorZ_Err(DecodeError err) {
index 9d86f09a8acd37305e4cdd44022ce5cff31ba8cb..3b3fb9583909d44477c4e2a3daf3ef940dcfb050 100644 (file)
@@ -25,6 +25,7 @@ public class Result_ReplyChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_ReplyChannelRangeDecodeErrorZ_get_ok(ptr);
                        ReplyChannelRange res_hu_conv = new ReplyChannelRange(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ReplyChannelRangeDecodeErrorZ_OK(ReplyChannelRange res) {
@@ -39,6 +40,7 @@ public class Result_ReplyChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_ReplyChannelRangeDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ReplyChannelRangeDecodeErrorZ_Err(DecodeError err) {
index 9db0c5d4b8db16f634a4f6315f9bf2106683eb57..397f04ad814125fc7e24c6dbd000fbf435389e68 100644 (file)
@@ -25,6 +25,7 @@ public class Result_ReplyShortChannelIdsEndDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ_get_ok(ptr);
                        ReplyShortChannelIdsEnd res_hu_conv = new ReplyShortChannelIdsEnd(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ReplyShortChannelIdsEndDecodeErrorZ_OK(ReplyShortChannelIdsEnd res) {
@@ -39,6 +40,7 @@ public class Result_ReplyShortChannelIdsEndDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ReplyShortChannelIdsEndDecodeErrorZ_Err(DecodeError err) {
index e13143309a9c0adb9c0fcf1aa28e998d88ce18a6..601e81e1fffaca48746e251e70e20a19707c9b70 100644 (file)
@@ -25,6 +25,7 @@ public class Result_RouteDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_RouteDecodeErrorZ_get_ok(ptr);
                        Route res_hu_conv = new Route(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_RouteDecodeErrorZ_OK(Route res) {
@@ -39,6 +40,7 @@ public class Result_RouteDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_RouteDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_RouteDecodeErrorZ_Err(DecodeError err) {
index 09c430f294828695c1c57754e6f32fccf697e6bf..73c74bbc3e5a3e050de10d2a4050e2d4685a7fd7 100644 (file)
@@ -25,6 +25,7 @@ public class Result_RouteLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_RouteLightningErrorZ_get_ok(ptr);
                        Route res_hu_conv = new Route(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_RouteLightningErrorZ_OK(Route res) {
@@ -39,6 +40,7 @@ public class Result_RouteLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_RouteLightningErrorZ_get_err(ptr);
                        LightningError err_hu_conv = new LightningError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_RouteLightningErrorZ_Err(LightningError err) {
index eda7ce3e11b5efc7f9777e3b1e7ba318a4bfe407..1f190465ca76125bd52f2103724073e184462cb8 100644 (file)
@@ -25,6 +25,7 @@ public class Result_RoutingFeesDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_RoutingFeesDecodeErrorZ_get_ok(ptr);
                        RoutingFees res_hu_conv = new RoutingFees(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_RoutingFeesDecodeErrorZ_OK(RoutingFees res) {
@@ -39,6 +40,7 @@ public class Result_RoutingFeesDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_RoutingFeesDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_RoutingFeesDecodeErrorZ_Err(DecodeError err) {
index 40c3b4ecca22aaca42ebb856b1590cfe5b26c1ca..c5f99935036668cffc158c9ab5b0266a18711acb 100644 (file)
@@ -39,6 +39,7 @@ public class Result_SpendableOutputDescriptorDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_SpendableOutputDescriptorDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_SpendableOutputDescriptorDecodeErrorZ_Err(DecodeError err) {
index a4a939f175ba2a50c37bb2f5e380e021917744b5..46172256c02505797f7c8a2b224ac47f29b0b4b0 100644 (file)
@@ -25,11 +25,20 @@ public class Result_TrustedCommitmentTransactionNoneZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_TrustedCommitmentTransactionNoneZ_get_ok(ptr);
                        TrustedCommitmentTransaction res_hu_conv = new TrustedCommitmentTransaction(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_TrustedCommitmentTransactionNoneZ_OK(TrustedCommitmentTransaction res) {
                        this(null, bindings.CResult_TrustedCommitmentTransactionNoneZ_ok(res == null ? 0 : res.ptr & ~1));
                        this.ptrs_to.add(res);
+                       // Due to rust's strict-ownership memory model, in some cases we need to "move"
+                       // an object to pass exclusive ownership to the function being called.
+                       // In most cases, we avoid this being visible in GC'd languages by cloning the object
+                       // at the FFI layer, creating a new object which Rust can claim ownership of
+                       // However, in some cases (eg here), there is no way to clone an object, and thus
+                       // we actually have to pass full ownership to Rust.
+                       // Thus, after this call, res is reset to null and is now a dummy object.
+                       res.ptr = 0;
                }
        }
 
index 86e637aabb72888491db12912d3113383af68e73..3ee052d255e5a579e19246000fc4db1bfe1e60e7 100644 (file)
@@ -25,6 +25,7 @@ public class Result_TxCreationKeysSecpErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_TxCreationKeysSecpErrorZ_get_ok(ptr);
                        TxCreationKeys res_hu_conv = new TxCreationKeys(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_TxCreationKeysSecpErrorZ_OK(TxCreationKeys res) {
index 2473f7a203544c556dd9dbc2fece9498022b8cc0..325541d20ce0504e1af76324e8e768239bb591bf 100644 (file)
@@ -25,6 +25,7 @@ public class Result_UnsignedChannelAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ_get_ok(ptr);
                        UnsignedChannelAnnouncement res_hu_conv = new UnsignedChannelAnnouncement(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_UnsignedChannelAnnouncementDecodeErrorZ_OK(UnsignedChannelAnnouncement res) {
@@ -39,6 +40,7 @@ public class Result_UnsignedChannelAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_UnsignedChannelAnnouncementDecodeErrorZ_Err(DecodeError err) {
index 627fdf693bc1995d1568910690bb074b90639959..7dbeefc4040fec4aa4592a76264f9e80abe82816 100644 (file)
@@ -25,6 +25,7 @@ public class Result_UnsignedChannelUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_UnsignedChannelUpdateDecodeErrorZ_get_ok(ptr);
                        UnsignedChannelUpdate res_hu_conv = new UnsignedChannelUpdate(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_UnsignedChannelUpdateDecodeErrorZ_OK(UnsignedChannelUpdate res) {
@@ -39,6 +40,7 @@ public class Result_UnsignedChannelUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_UnsignedChannelUpdateDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_UnsignedChannelUpdateDecodeErrorZ_Err(DecodeError err) {
index 7493f14ebe3101df4599601f876ebc471edd6520..0e981e5ba506d5dcc8e1420ad90f9456b6a4c0a0 100644 (file)
@@ -25,6 +25,7 @@ public class Result_UnsignedNodeAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long res = bindings.LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ_get_ok(ptr);
                        UnsignedNodeAnnouncement res_hu_conv = new UnsignedNodeAnnouncement(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_UnsignedNodeAnnouncementDecodeErrorZ_OK(UnsignedNodeAnnouncement res) {
@@ -39,6 +40,7 @@ public class Result_UnsignedNodeAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ_get_err(ptr);
                        DecodeError err_hu_conv = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_UnsignedNodeAnnouncementDecodeErrorZ_Err(DecodeError err) {
index 5eb4ab80258a931729163642a3fafa096809e53a..4519dd152ec7ea738685993983b3696ef575071d 100644 (file)
@@ -36,6 +36,7 @@ public class Result_boolLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_boolLightningErrorZ_get_err(ptr);
                        LightningError err_hu_conv = new LightningError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_boolLightningErrorZ_Err(LightningError err) {
index e29335b6b91b10b01915b9ae913119637e49e1ca..014c611cdc5ce8f0c84f7e387b2a19a1dda5b57c 100644 (file)
@@ -36,6 +36,7 @@ public class Result_boolPeerHandleErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        long err = bindings.LDKCResult_boolPeerHandleErrorZ_get_err(ptr);
                        PeerHandleError err_hu_conv = new PeerHandleError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_boolPeerHandleErrorZ_Err(PeerHandleError err) {
index a874af856ea5701959f370c835fb9cd0655075df..dcf6ddd95167123ddbda58973301ce6f79b584d3 100644 (file)
@@ -17,6 +17,7 @@ public class RevokeAndACK extends CommonBase {
        public RevokeAndACK clone() {
                long ret = bindings.RevokeAndACK_clone(this.ptr);
                RevokeAndACK ret_hu_conv = new RevokeAndACK(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,6 +51,7 @@ public class RevokeAndACK extends CommonBase {
        public static RevokeAndACK constructor_new(byte[] channel_id_arg, byte[] per_commitment_secret_arg, byte[] next_per_commitment_point_arg) {
                long ret = bindings.RevokeAndACK_new(channel_id_arg, per_commitment_secret_arg, next_per_commitment_point_arg);
                RevokeAndACK ret_hu_conv = new RevokeAndACK(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -61,6 +63,7 @@ public class RevokeAndACK extends CommonBase {
        public static RevokeAndACK constructor_read(byte[] ser) {
                long ret = bindings.RevokeAndACK_read(ser);
                RevokeAndACK ret_hu_conv = new RevokeAndACK(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index e6195c343751b2ea38ef71b282e9049dd90cd6df..cb0f6a2b290f56d944a1f4054892e6cdf731abd8 100644 (file)
@@ -17,6 +17,7 @@ public class Route extends CommonBase {
        public Route clone() {
                long ret = bindings.Route_clone(this.ptr);
                Route ret_hu_conv = new Route(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -28,6 +29,7 @@ public class Route extends CommonBase {
        public static Route constructor_new(RouteHop[][] paths_arg) {
                long ret = bindings.Route_new((long[][])Arrays.stream(paths_arg).map(arr_conv_12 -> Arrays.stream(arr_conv_12).mapToLong(arr_conv_10 -> arr_conv_10 == null ? 0 : arr_conv_10.ptr & ~1).toArray()).toArray());
                Route ret_hu_conv = new Route(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                /* TODO 2 RouteHop[]  */;
                return ret_hu_conv;
        }
index f94c4071a2fdbe50208e55f0dfb6680831724458..f543b75aac07d3ccad1e3a63e1dcbd29a5b7acfd 100644 (file)
@@ -17,6 +17,7 @@ public class RouteHint extends CommonBase {
        public RouteHint clone() {
                long ret = bindings.RouteHint_clone(this.ptr);
                RouteHint ret_hu_conv = new RouteHint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class RouteHint extends CommonBase {
        public RoutingFees get_fees() {
                long ret = bindings.RouteHint_get_fees(this.ptr);
                RoutingFees ret_hu_conv = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -70,6 +72,7 @@ public class RouteHint extends CommonBase {
        public static RouteHint constructor_new(byte[] src_node_id_arg, long short_channel_id_arg, RoutingFees fees_arg, short cltv_expiry_delta_arg, long htlc_minimum_msat_arg) {
                long ret = bindings.RouteHint_new(src_node_id_arg, short_channel_id_arg, fees_arg == null ? 0 : fees_arg.ptr & ~1, cltv_expiry_delta_arg, htlc_minimum_msat_arg);
                RouteHint ret_hu_conv = new RouteHint(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(fees_arg);
                return ret_hu_conv;
        }
index fe13c7b52a9933b09a5483c38ee9386d97f1496e..ace10a9b2eea39fe6705324d07f856de303ca55f 100644 (file)
@@ -17,6 +17,7 @@ public class RouteHop extends CommonBase {
        public RouteHop clone() {
                long ret = bindings.RouteHop_clone(this.ptr);
                RouteHop ret_hu_conv = new RouteHop(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,12 +33,21 @@ public class RouteHop extends CommonBase {
        public NodeFeatures get_node_features() {
                long ret = bindings.RouteHop_get_node_features(this.ptr);
                NodeFeatures ret_hu_conv = new NodeFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_node_features(NodeFeatures val) {
                bindings.RouteHop_set_node_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public long get_short_channel_id() {
@@ -52,12 +62,21 @@ public class RouteHop extends CommonBase {
        public ChannelFeatures get_channel_features() {
                long ret = bindings.RouteHop_get_channel_features(this.ptr);
                ChannelFeatures ret_hu_conv = new ChannelFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_channel_features(ChannelFeatures val) {
                bindings.RouteHop_set_channel_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public long get_fee_msat() {
@@ -81,8 +100,25 @@ public class RouteHop extends CommonBase {
        public static RouteHop constructor_new(byte[] pubkey_arg, NodeFeatures node_features_arg, long short_channel_id_arg, ChannelFeatures channel_features_arg, long fee_msat_arg, int cltv_expiry_delta_arg) {
                long ret = bindings.RouteHop_new(pubkey_arg, node_features_arg == null ? 0 : node_features_arg.ptr & ~1, short_channel_id_arg, channel_features_arg == null ? 0 : channel_features_arg.ptr & ~1, fee_msat_arg, cltv_expiry_delta_arg);
                RouteHop ret_hu_conv = new RouteHop(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(node_features_arg);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid ret_hu_conv being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after ret_hu_conv call, node_features_arg is reset to null and is now a dummy object.
+               node_features_arg.ptr = 0;
                ret_hu_conv.ptrs_to.add(channel_features_arg);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid ret_hu_conv being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after ret_hu_conv call, channel_features_arg is reset to null and is now a dummy object.
+               channel_features_arg.ptr = 0;
                return ret_hu_conv;
        }
 
index ec9af16164647ba0dc4db3fa7889dd40ee136a0e..c11990a3a3bb6e776ea7531995fc634d6d55a7df 100644 (file)
@@ -17,6 +17,7 @@ public class RoutingFees extends CommonBase {
        public RoutingFees clone() {
                long ret = bindings.RoutingFees_clone(this.ptr);
                RoutingFees ret_hu_conv = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class RoutingFees extends CommonBase {
        public static RoutingFees constructor_new(int base_msat_arg, int proportional_millionths_arg) {
                long ret = bindings.RoutingFees_new(base_msat_arg, proportional_millionths_arg);
                RoutingFees ret_hu_conv = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 6e1f2214989fabc7c7ac152b28e19812868ab7e3..a4f5353dd237799770c820f8fd44fb54b7ee6033 100644 (file)
@@ -61,7 +61,7 @@ public class RoutingMessageHandler extends CommonBase {
                        }
                        @Override public long[] get_next_channel_announcements(long starting_point, byte batch_amount) {
                                ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate>[] ret = arg.get_next_channel_announcements(starting_point, batch_amount);
-                               long[] result = Arrays.stream(ret).mapToLong(arr_conv_63 -> bindings.C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(arr_conv_63.a == null ? 0 : arr_conv_63.a.ptr & ~1/*XXX: this.ptrs_to.add(arr_conv_63_a)*/, arr_conv_63.b == null ? 0 : arr_conv_63.b.ptr & ~1/*XXX: this.ptrs_to.add(arr_conv_63_b)*/, arr_conv_63.c == null ? 0 : arr_conv_63.c.ptr & ~1/*XXX: this.ptrs_to.add(arr_conv_63_c)*/)).toArray();
+                               long[] result = Arrays.stream(ret).mapToLong(arr_conv_63 -> bindings.C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(arr_conv_63.a == null ? 0 : arr_conv_63.a.ptr & ~1, arr_conv_63.b == null ? 0 : arr_conv_63.b.ptr & ~1, arr_conv_63.c == null ? 0 : arr_conv_63.c.ptr & ~1)).toArray();
                                /* TODO 2 ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate>  */;
                                return result;
                        }
@@ -77,24 +77,28 @@ public class RoutingMessageHandler extends CommonBase {
                        }
                        @Override public long handle_reply_channel_range(byte[] their_node_id, long msg) {
                                ReplyChannelRange msg_hu_conv = new ReplyChannelRange(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                Result_NoneLightningErrorZ ret = arg.handle_reply_channel_range(their_node_id, msg_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
                                return result;
                        }
                        @Override public long handle_reply_short_channel_ids_end(byte[] their_node_id, long msg) {
                                ReplyShortChannelIdsEnd msg_hu_conv = new ReplyShortChannelIdsEnd(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                Result_NoneLightningErrorZ ret = arg.handle_reply_short_channel_ids_end(their_node_id, msg_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
                                return result;
                        }
                        @Override public long handle_query_channel_range(byte[] their_node_id, long msg) {
                                QueryChannelRange msg_hu_conv = new QueryChannelRange(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                Result_NoneLightningErrorZ ret = arg.handle_query_channel_range(their_node_id, msg_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
                                return result;
                        }
                        @Override public long handle_query_short_channel_ids(byte[] their_node_id, long msg) {
                                QueryShortChannelIds msg_hu_conv = new QueryShortChannelIds(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                Result_NoneLightningErrorZ ret = arg.handle_query_short_channel_ids(their_node_id, msg_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
                                return result;
@@ -134,11 +138,14 @@ public class RoutingMessageHandler extends CommonBase {
                for (int l = 0; l < ret.length; l++) {
                        long arr_conv_63 = ret[l];
                        long arr_conv_63_a = bindings.LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_a(arr_conv_63);
-                       ChannelAnnouncement arr_conv_63_a_hu_conv = new ChannelAnnouncement(null, arr_conv_63_a);;
+                       ChannelAnnouncement arr_conv_63_a_hu_conv = new ChannelAnnouncement(null, arr_conv_63_a);
+                       arr_conv_63_a_hu_conv.ptrs_to.add(this);;
                        long arr_conv_63_b = bindings.LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_b(arr_conv_63);
-                       ChannelUpdate arr_conv_63_b_hu_conv = new ChannelUpdate(null, arr_conv_63_b);;
+                       ChannelUpdate arr_conv_63_b_hu_conv = new ChannelUpdate(null, arr_conv_63_b);
+                       arr_conv_63_b_hu_conv.ptrs_to.add(this);;
                        long arr_conv_63_c = bindings.LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_c(arr_conv_63);
-                       ChannelUpdate arr_conv_63_c_hu_conv = new ChannelUpdate(null, arr_conv_63_c);;
+                       ChannelUpdate arr_conv_63_c_hu_conv = new ChannelUpdate(null, arr_conv_63_c);
+                       arr_conv_63_c_hu_conv.ptrs_to.add(this);;
                        ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate> arr_conv_63_conv = new ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate>(arr_conv_63_a_hu_conv, arr_conv_63_b_hu_conv, arr_conv_63_c_hu_conv);
                        arr_conv_63_arr[l] = arr_conv_63_conv;
                }
@@ -151,6 +158,7 @@ public class RoutingMessageHandler extends CommonBase {
                for (int s = 0; s < ret.length; s++) {
                        long arr_conv_18 = ret[s];
                        NodeAnnouncement arr_conv_18_hu_conv = new NodeAnnouncement(null, arr_conv_18);
+                       arr_conv_18_hu_conv.ptrs_to.add(this);
                        arr_conv_18_arr[s] = arr_conv_18_hu_conv;
                }
                return arr_conv_18_arr;
index 77b9a3421b982b99dbc82799fd80603b05ae2ec0..491939cd70e2db356a66f17f7454d7803d6d9e05 100644 (file)
@@ -17,6 +17,7 @@ public class Shutdown extends CommonBase {
        public Shutdown clone() {
                long ret = bindings.Shutdown_clone(this.ptr);
                Shutdown ret_hu_conv = new Shutdown(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class Shutdown extends CommonBase {
        public static Shutdown constructor_new(byte[] channel_id_arg, byte[] scriptpubkey_arg) {
                long ret = bindings.Shutdown_new(channel_id_arg, scriptpubkey_arg);
                Shutdown ret_hu_conv = new Shutdown(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -52,6 +54,7 @@ public class Shutdown extends CommonBase {
        public static Shutdown constructor_read(byte[] ser) {
                long ret = bindings.Shutdown_read(ser);
                Shutdown ret_hu_conv = new Shutdown(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 74c70391ebe149e977ee0a7acfcf51caf940d397..5558dd7fa7b3f269a9dc174b6355e9c35b4f0d22 100644 (file)
@@ -34,6 +34,7 @@ public class SpendableOutputDescriptor extends CommonBase {
                        super(null, ptr);
                        long outpoint = obj.outpoint;
                        OutPoint outpoint_hu_conv = new OutPoint(null, outpoint);
+                       outpoint_hu_conv.ptrs_to.add(this);
                        this.outpoint = outpoint_hu_conv;
                        long output = obj.output;
                        TxOut output_conv = new TxOut(null, output);
@@ -51,6 +52,7 @@ public class SpendableOutputDescriptor extends CommonBase {
                        super(null, ptr);
                        long outpoint = obj.outpoint;
                        OutPoint outpoint_hu_conv = new OutPoint(null, outpoint);
+                       outpoint_hu_conv.ptrs_to.add(this);
                        this.outpoint = outpoint_hu_conv;
                        this.per_commitment_point = obj.per_commitment_point;
                        this.to_self_delay = obj.to_self_delay;
@@ -73,6 +75,7 @@ public class SpendableOutputDescriptor extends CommonBase {
                        super(null, ptr);
                        long outpoint = obj.outpoint;
                        OutPoint outpoint_hu_conv = new OutPoint(null, outpoint);
+                       outpoint_hu_conv.ptrs_to.add(this);
                        this.outpoint = outpoint_hu_conv;
                        long output = obj.output;
                        TxOut output_conv = new TxOut(null, output);
index e49ae2426814d61eb0119149ce905f108f8b1f49..9d7c132000d0c4637dac3f3a38b4eb83da80331e 100644 (file)
@@ -22,12 +22,14 @@ public class TrustedCommitmentTransaction extends CommonBase {
        public BuiltCommitmentTransaction built_transaction() {
                long ret = bindings.TrustedCommitmentTransaction_built_transaction(this.ptr);
                BuiltCommitmentTransaction ret_hu_conv = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public TxCreationKeys keys() {
                long ret = bindings.TrustedCommitmentTransaction_keys(this.ptr);
                TxCreationKeys ret_hu_conv = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 9d0df3546fc186cf764c1911c1db90c1a360a471..05e70350dec9d34f4fe88a2ffd076b3e0d8cab7b 100644 (file)
@@ -17,6 +17,7 @@ public class TxCreationKeys extends CommonBase {
        public TxCreationKeys clone() {
                long ret = bindings.TxCreationKeys_clone(this.ptr);
                TxCreationKeys ret_hu_conv = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -68,6 +69,7 @@ public class TxCreationKeys extends CommonBase {
        public static TxCreationKeys constructor_new(byte[] per_commitment_point_arg, byte[] revocation_key_arg, byte[] broadcaster_htlc_key_arg, byte[] countersignatory_htlc_key_arg, byte[] broadcaster_delayed_payment_key_arg) {
                long ret = bindings.TxCreationKeys_new(per_commitment_point_arg, revocation_key_arg, broadcaster_htlc_key_arg, countersignatory_htlc_key_arg, broadcaster_delayed_payment_key_arg);
                TxCreationKeys ret_hu_conv = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -79,6 +81,7 @@ public class TxCreationKeys extends CommonBase {
        public static TxCreationKeys constructor_read(byte[] ser) {
                long ret = bindings.TxCreationKeys_read(ser);
                TxCreationKeys ret_hu_conv = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 1d6db48bc748b4b7dd61216ef8df600ba99b5f3a..d4fa2aed2663a831ad5d2ff8cd30962d04f3732f 100644 (file)
@@ -17,18 +17,28 @@ public class UnsignedChannelAnnouncement extends CommonBase {
        public UnsignedChannelAnnouncement clone() {
                long ret = bindings.UnsignedChannelAnnouncement_clone(this.ptr);
                UnsignedChannelAnnouncement ret_hu_conv = new UnsignedChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelFeatures get_features() {
                long ret = bindings.UnsignedChannelAnnouncement_get_features(this.ptr);
                ChannelFeatures ret_hu_conv = new ChannelFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(ChannelFeatures val) {
                bindings.UnsignedChannelAnnouncement_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public byte[] get_chain_hash() {
index 70c9749ada406a2d2b51a96a4d3cdeead71330a4..86ad7499d2640004fff7e265466335981d419bb8 100644 (file)
@@ -17,6 +17,7 @@ public class UnsignedChannelUpdate extends CommonBase {
        public UnsignedChannelUpdate clone() {
                long ret = bindings.UnsignedChannelUpdate_clone(this.ptr);
                UnsignedChannelUpdate ret_hu_conv = new UnsignedChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index e737f2715c1d27be67b40992326922c5f5d3f1e6..964315caa910abdd91f9aaa0a2b210226604d7c3 100644 (file)
@@ -17,18 +17,28 @@ public class UnsignedNodeAnnouncement extends CommonBase {
        public UnsignedNodeAnnouncement clone() {
                long ret = bindings.UnsignedNodeAnnouncement_clone(this.ptr);
                UnsignedNodeAnnouncement ret_hu_conv = new UnsignedNodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public NodeFeatures get_features() {
                long ret = bindings.UnsignedNodeAnnouncement_get_features(this.ptr);
                NodeFeatures ret_hu_conv = new NodeFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(NodeFeatures val) {
                bindings.UnsignedNodeAnnouncement_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public int get_timestamp() {
index acf6a36aadcc2c27b398101c12c33de1be954056..3f6643ce839b413362c4c0094b3ab5bb552b40f2 100644 (file)
@@ -17,6 +17,7 @@ public class UpdateAddHTLC extends CommonBase {
        public UpdateAddHTLC clone() {
                long ret = bindings.UpdateAddHTLC_clone(this.ptr);
                UpdateAddHTLC ret_hu_conv = new UpdateAddHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -73,6 +74,7 @@ public class UpdateAddHTLC extends CommonBase {
        public static UpdateAddHTLC constructor_read(byte[] ser) {
                long ret = bindings.UpdateAddHTLC_read(ser);
                UpdateAddHTLC ret_hu_conv = new UpdateAddHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 37d34c46e632952175fb89e6ef8ecfdf72df2b87..b341d282b9c09db10e77d387ecc42760aa1e2fb8 100644 (file)
@@ -17,6 +17,7 @@ public class UpdateFailHTLC extends CommonBase {
        public UpdateFailHTLC clone() {
                long ret = bindings.UpdateFailHTLC_clone(this.ptr);
                UpdateFailHTLC ret_hu_conv = new UpdateFailHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -46,6 +47,7 @@ public class UpdateFailHTLC extends CommonBase {
        public static UpdateFailHTLC constructor_read(byte[] ser) {
                long ret = bindings.UpdateFailHTLC_read(ser);
                UpdateFailHTLC ret_hu_conv = new UpdateFailHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 5f0fd7d2f813a331b95e6095e611f330c93ea814..69e17531b94f87bae3951d7cbc1688d7dec0810b 100644 (file)
@@ -17,6 +17,7 @@ public class UpdateFailMalformedHTLC extends CommonBase {
        public UpdateFailMalformedHTLC clone() {
                long ret = bindings.UpdateFailMalformedHTLC_clone(this.ptr);
                UpdateFailMalformedHTLC ret_hu_conv = new UpdateFailMalformedHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -55,6 +56,7 @@ public class UpdateFailMalformedHTLC extends CommonBase {
        public static UpdateFailMalformedHTLC constructor_read(byte[] ser) {
                long ret = bindings.UpdateFailMalformedHTLC_read(ser);
                UpdateFailMalformedHTLC ret_hu_conv = new UpdateFailMalformedHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 8c90926a860e89c46bbc6f596132668c46557355..a939f3f18021f9971a109503dbb0b67f3c861c03 100644 (file)
@@ -17,6 +17,7 @@ public class UpdateFee extends CommonBase {
        public UpdateFee clone() {
                long ret = bindings.UpdateFee_clone(this.ptr);
                UpdateFee ret_hu_conv = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -41,6 +42,7 @@ public class UpdateFee extends CommonBase {
        public static UpdateFee constructor_new(byte[] channel_id_arg, int feerate_per_kw_arg) {
                long ret = bindings.UpdateFee_new(channel_id_arg, feerate_per_kw_arg);
                UpdateFee ret_hu_conv = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -52,6 +54,7 @@ public class UpdateFee extends CommonBase {
        public static UpdateFee constructor_read(byte[] ser) {
                long ret = bindings.UpdateFee_read(ser);
                UpdateFee ret_hu_conv = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 5737572395d4e47f5f2acba54a09e210d79e7249..e31af1b6a309c37ce9382aba45f6506da668e24b 100644 (file)
@@ -17,6 +17,7 @@ public class UpdateFulfillHTLC extends CommonBase {
        public UpdateFulfillHTLC clone() {
                long ret = bindings.UpdateFulfillHTLC_clone(this.ptr);
                UpdateFulfillHTLC ret_hu_conv = new UpdateFulfillHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,6 +51,7 @@ public class UpdateFulfillHTLC extends CommonBase {
        public static UpdateFulfillHTLC constructor_new(byte[] channel_id_arg, long htlc_id_arg, byte[] payment_preimage_arg) {
                long ret = bindings.UpdateFulfillHTLC_new(channel_id_arg, htlc_id_arg, payment_preimage_arg);
                UpdateFulfillHTLC ret_hu_conv = new UpdateFulfillHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -61,6 +63,7 @@ public class UpdateFulfillHTLC extends CommonBase {
        public static UpdateFulfillHTLC constructor_read(byte[] ser) {
                long ret = bindings.UpdateFulfillHTLC_read(ser);
                UpdateFulfillHTLC ret_hu_conv = new UpdateFulfillHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 8e871e21f71f8a4c965f95ec75c17bdb75cad8fe..ccf01fef1de68719763acd4a191ab9b5ffc1461a 100644 (file)
@@ -17,12 +17,14 @@ public class UserConfig extends CommonBase {
        public UserConfig clone() {
                long ret = bindings.UserConfig_clone(this.ptr);
                UserConfig ret_hu_conv = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelHandshakeConfig get_own_channel_config() {
                long ret = bindings.UserConfig_get_own_channel_config(this.ptr);
                ChannelHandshakeConfig ret_hu_conv = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -34,6 +36,7 @@ public class UserConfig extends CommonBase {
        public ChannelHandshakeLimits get_peer_channel_config_limits() {
                long ret = bindings.UserConfig_get_peer_channel_config_limits(this.ptr);
                ChannelHandshakeLimits ret_hu_conv = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +48,7 @@ public class UserConfig extends CommonBase {
        public ChannelConfig get_channel_options() {
                long ret = bindings.UserConfig_get_channel_options(this.ptr);
                ChannelConfig ret_hu_conv = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -56,6 +60,7 @@ public class UserConfig extends CommonBase {
        public static UserConfig constructor_new(ChannelHandshakeConfig own_channel_config_arg, ChannelHandshakeLimits peer_channel_config_limits_arg, ChannelConfig channel_options_arg) {
                long ret = bindings.UserConfig_new(own_channel_config_arg == null ? 0 : own_channel_config_arg.ptr & ~1, peer_channel_config_limits_arg == null ? 0 : peer_channel_config_limits_arg.ptr & ~1, channel_options_arg == null ? 0 : channel_options_arg.ptr & ~1);
                UserConfig ret_hu_conv = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(own_channel_config_arg);
                ret_hu_conv.ptrs_to.add(peer_channel_config_limits_arg);
                ret_hu_conv.ptrs_to.add(channel_options_arg);
@@ -65,6 +70,7 @@ public class UserConfig extends CommonBase {
        public static UserConfig constructor_default() {
                long ret = bindings.UserConfig_default();
                UserConfig ret_hu_conv = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
diff --git a/src/main/java/org/ldk/structs/UtilMethods.java b/src/main/java/org/ldk/structs/UtilMethods.java
new file mode 100644 (file)
index 0000000..8f2f7f3
--- /dev/null
@@ -0,0 +1,26 @@
+package org.ldk.structs;
+import org.ldk.impl.bindings;
+import java.util.Arrays;
+
+public class UtilMethods {
+       public static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ constructor_BlockHashChannelMonitorZ_read(byte[] ser, KeysInterface arg) {
+               long ret = bindings.C2Tuple_BlockHashChannelMonitorZ_read(ser, arg == null ? 0 : arg.ptr);
+               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg);
+               return ret_hu_conv;
+       }
+
+       public static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ constructor_BlockHashChannelManagerZ_read(byte[] ser, KeysInterface arg_keys_manager, FeeEstimator arg_fee_estimator, Watch arg_chain_monitor, BroadcasterInterface arg_tx_broadcaster, Logger arg_logger, UserConfig arg_default_config, ChannelMonitor[] arg_channel_monitors) {
+               long ret = bindings.C2Tuple_BlockHashChannelManagerZ_read(ser, bindings.ChannelManagerReadArgs_new(arg_keys_manager == null ? 0 : arg_keys_manager.ptr, arg_fee_estimator == null ? 0 : arg_fee_estimator.ptr, arg_chain_monitor == null ? 0 : arg_chain_monitor.ptr, arg_tx_broadcaster == null ? 0 : arg_tx_broadcaster.ptr, arg_logger == null ? 0 : arg_logger.ptr, arg_default_config == null ? 0 : arg_default_config.ptr & ~1, Arrays.stream(arg_channel_monitors).mapToLong(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray()));
+               Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg_keys_manager);
+               ret_hu_conv.ptrs_to.add(arg_fee_estimator);
+               ret_hu_conv.ptrs_to.add(arg_chain_monitor);
+               ret_hu_conv.ptrs_to.add(arg_tx_broadcaster);
+               ret_hu_conv.ptrs_to.add(arg_logger);
+               ret_hu_conv.ptrs_to.add(arg_default_config);
+               /* TODO 2 ChannelMonitor  */;
+               return ret_hu_conv;
+       }
+
+}
\ No newline at end of file
index 1efd7e0ebbb4b0a6ce3100193bc5a25c4757c0d5..db7d43923d4c6c08759e37a6783ef3948afba94d 100644 (file)
@@ -30,14 +30,18 @@ public class Watch extends CommonBase {
                impl_holder.held = new Watch(new bindings.LDKWatch() {
                        @Override public long watch_channel(long funding_txo, long monitor) {
                                OutPoint funding_txo_hu_conv = new OutPoint(null, funding_txo);
+                               funding_txo_hu_conv.ptrs_to.add(this);
                                ChannelMonitor monitor_hu_conv = new ChannelMonitor(null, monitor);
+                               monitor_hu_conv.ptrs_to.add(this);
                                Result_NoneChannelMonitorUpdateErrZ ret = arg.watch_channel(funding_txo_hu_conv, monitor_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
                                return result;
                        }
                        @Override public long update_channel(long funding_txo, long update) {
                                OutPoint funding_txo_hu_conv = new OutPoint(null, funding_txo);
+                               funding_txo_hu_conv.ptrs_to.add(this);
                                ChannelMonitorUpdate update_hu_conv = new ChannelMonitorUpdate(null, update);
+                               update_hu_conv.ptrs_to.add(this);
                                Result_NoneChannelMonitorUpdateErrZ ret = arg.update_channel(funding_txo_hu_conv, update_hu_conv);
                                long result = ret != null ? ret.ptr : 0;
                                return result;
@@ -73,6 +77,7 @@ public class Watch extends CommonBase {
                for (int o = 0; o < ret.length; o++) {
                        long arr_conv_14 = ret[o];
                        MonitorEvent arr_conv_14_hu_conv = new MonitorEvent(null, arr_conv_14);
+                       arr_conv_14_hu_conv.ptrs_to.add(this);
                        arr_conv_14_arr[o] = arr_conv_14_hu_conv;
                }
                return arr_conv_14_arr;
index 3a878484cb197611b08d4411eb84da7136c2d050..ad260dc2ef91b5b04de086c42f4586eb7d77229e 100644 (file)
@@ -31,16 +31,18 @@ typedef struct allocation {
        const char* struct_name;
        void* bt[BT_MAX];
        int bt_len;
+       size_t alloc_len;
 } allocation;
 static allocation* allocation_ll = NULL;
 
 void* __real_malloc(size_t len);
 void* __real_calloc(size_t nmemb, size_t len);
-static void new_allocation(void* res, const char* struct_name) {
+static void new_allocation(void* res, const char* struct_name, size_t len) {
        allocation* new_alloc = __real_malloc(sizeof(allocation));
        new_alloc->ptr = res;
        new_alloc->struct_name = struct_name;
        new_alloc->bt_len = backtrace(new_alloc->bt, BT_MAX);
+       new_alloc->alloc_len = len;
        DO_ASSERT(mtx_lock(&allocation_mtx) == thrd_success);
        new_alloc->next = allocation_ll;
        allocation_ll = new_alloc;
@@ -48,7 +50,7 @@ static void new_allocation(void* res, const char* struct_name) {
 }
 static void* MALLOC(size_t len, const char* struct_name) {
        void* res = __real_malloc(len);
-       new_allocation(res, struct_name);
+       new_allocation(res, struct_name, len);
        return res;
 }
 void __real_free(void* ptr);
@@ -81,12 +83,12 @@ static void FREE(void* ptr) {
 
 void* __wrap_malloc(size_t len) {
        void* res = __real_malloc(len);
-       new_allocation(res, "malloc call");
+       new_allocation(res, "malloc call", len);
        return res;
 }
 void* __wrap_calloc(size_t nmemb, size_t len) {
        void* res = __real_calloc(nmemb, len);
-       new_allocation(res, "calloc call");
+       new_allocation(res, "calloc call", len);
        return res;
 }
 void __wrap_free(void* ptr) {
@@ -99,7 +101,7 @@ void* __real_realloc(void* ptr, size_t newlen);
 void* __wrap_realloc(void* ptr, size_t len) {
        if (ptr != NULL) alloc_freed(ptr);
        void* res = __real_realloc(ptr, len);
-       new_allocation(res, "realloc call");
+       new_allocation(res, "realloc call", len);
        return res;
 }
 void __wrap_reallocarray(void* ptr, size_t new_sz) {
@@ -108,11 +110,16 @@ void __wrap_reallocarray(void* ptr, size_t new_sz) {
 }
 
 void __attribute__((destructor)) check_leaks() {
+       size_t alloc_count = 0;
+       size_t alloc_size = 0;
        for (allocation* a = allocation_ll; a != NULL; a = a->next) {
                fprintf(stderr, "%s %p remains:\n", a->struct_name, a->ptr);
                backtrace_symbols_fd(a->bt, a->bt_len, STDERR_FILENO);
                fprintf(stderr, "\n\n");
+               alloc_count++;
+               alloc_size += a->alloc_len;
        }
+       fprintf(stderr, "%lu allocations remained for %lu bytes.\n", alloc_count, alloc_size);
        DO_ASSERT(allocation_ll == NULL);
 }
 
@@ -501,19 +508,12 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1u64u64Z_1new(JN
        ret->b = b;
        return (long)ret;
 }
-static inline LDKC2Tuple_u64u64Z C2Tuple_u64u64Z_clone(const LDKC2Tuple_u64u64Z *orig) {
-       LDKC2Tuple_u64u64Z ret = {
-               .a = orig->a,
-               .b = orig->b,
-       };
-       return ret;
-}
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1u64u64Z_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)ptr;
+       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)(ptr & ~1);
        return tuple->a;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1u64u64Z_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)ptr;
+       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)(ptr & ~1);
        return tuple->b;
 }
 static jclass LDKSpendableOutputDescriptor_StaticOutput_class = NULL;
@@ -547,7 +547,7 @@ JNIEXPORT jobject JNICALL Java_org_ldk_impl_bindings_LDKSpendableOutputDescripto
                        CHECK((((long)outpoint_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
                        CHECK((((long)&outpoint_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
                        long outpoint_ref = (long)outpoint_var.inner & ~1;
-                       long output_ref = (long)&obj->static_output.output;
+                       long output_ref = ((long)&obj->static_output.output) | 1;
                        return (*env)->NewObject(env, LDKSpendableOutputDescriptor_StaticOutput_class, LDKSpendableOutputDescriptor_StaticOutput_meth, outpoint_ref, (long)output_ref);
                }
                case LDKSpendableOutputDescriptor_DynamicOutputP2WSH: {
@@ -557,8 +557,8 @@ JNIEXPORT jobject JNICALL Java_org_ldk_impl_bindings_LDKSpendableOutputDescripto
                        long outpoint_ref = (long)outpoint_var.inner & ~1;
                        int8_tArray per_commitment_point_arr = (*env)->NewByteArray(env, 33);
                        (*env)->SetByteArrayRegion(env, per_commitment_point_arr, 0, 33, obj->dynamic_output_p2wsh.per_commitment_point.compressed_form);
-                       long output_ref = (long)&obj->dynamic_output_p2wsh.output;
-                       long key_derivation_params_ref = (long)&obj->dynamic_output_p2wsh.key_derivation_params;
+                       long output_ref = ((long)&obj->dynamic_output_p2wsh.output) | 1;
+                       long key_derivation_params_ref = (long)(&obj->dynamic_output_p2wsh.key_derivation_params) | 1;
                        int8_tArray revocation_pubkey_arr = (*env)->NewByteArray(env, 33);
                        (*env)->SetByteArrayRegion(env, revocation_pubkey_arr, 0, 33, obj->dynamic_output_p2wsh.revocation_pubkey.compressed_form);
                        return (*env)->NewObject(env, LDKSpendableOutputDescriptor_DynamicOutputP2WSH_class, LDKSpendableOutputDescriptor_DynamicOutputP2WSH_meth, outpoint_ref, per_commitment_point_arr, obj->dynamic_output_p2wsh.to_self_delay, (long)output_ref, key_derivation_params_ref, revocation_pubkey_arr);
@@ -568,8 +568,8 @@ JNIEXPORT jobject JNICALL Java_org_ldk_impl_bindings_LDKSpendableOutputDescripto
                        CHECK((((long)outpoint_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
                        CHECK((((long)&outpoint_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
                        long outpoint_ref = (long)outpoint_var.inner & ~1;
-                       long output_ref = (long)&obj->static_output_counterparty_payment.output;
-                       long key_derivation_params_ref = (long)&obj->static_output_counterparty_payment.key_derivation_params;
+                       long output_ref = ((long)&obj->static_output_counterparty_payment.output) | 1;
+                       long key_derivation_params_ref = (long)(&obj->static_output_counterparty_payment.key_derivation_params) | 1;
                        return (*env)->NewObject(env, LDKSpendableOutputDescriptor_StaticOutputCounterpartyPayment_class, LDKSpendableOutputDescriptor_StaticOutputCounterpartyPayment_meth, outpoint_ref, (long)output_ref, key_derivation_params_ref);
                }
                default: abort();
@@ -585,7 +585,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1SpendableOutputDes
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKSpendableOutputDescriptor arr_elem_conv = *(LDKSpendableOutputDescriptor*)arr_elem;
+                       LDKSpendableOutputDescriptor arr_elem_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -948,11 +948,11 @@ JNIEXPORT jobject JNICALL Java_org_ldk_impl_bindings_LDKMessageSendEvent_1ref_1f
                case LDKMessageSendEvent_HandleError: {
                        int8_tArray node_id_arr = (*env)->NewByteArray(env, 33);
                        (*env)->SetByteArrayRegion(env, node_id_arr, 0, 33, obj->handle_error.node_id.compressed_form);
-                       long action_ref = (long)&obj->handle_error.action;
+                       long action_ref = ((long)&obj->handle_error.action) | 1;
                        return (*env)->NewObject(env, LDKMessageSendEvent_HandleError_class, LDKMessageSendEvent_HandleError_meth, node_id_arr, action_ref);
                }
                case LDKMessageSendEvent_PaymentFailureNetworkUpdate: {
-                       long update_ref = (long)&obj->payment_failure_network_update.update;
+                       long update_ref = ((long)&obj->payment_failure_network_update.update) | 1;
                        return (*env)->NewObject(env, LDKMessageSendEvent_PaymentFailureNetworkUpdate_class, LDKMessageSendEvent_PaymentFailureNetworkUpdate_meth, update_ref);
                }
                case LDKMessageSendEvent_SendChannelRangeQuery: {
@@ -986,7 +986,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1MessageSendEventZ_
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKMessageSendEvent arr_elem_conv = *(LDKMessageSendEvent*)arr_elem;
+                       LDKMessageSendEvent arr_elem_conv = *(LDKMessageSendEvent*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -1095,7 +1095,7 @@ JNIEXPORT jobject JNICALL Java_org_ldk_impl_bindings_LDKEvent_1ref_1from_1ptr(JN
                        int64_tArray outputs_arr = (*env)->NewLongArray(env, outputs_var.datalen);
                        int64_t *outputs_arr_ptr = (*env)->GetPrimitiveArrayCritical(env, outputs_arr, NULL);
                        for (size_t b = 0; b < outputs_var.datalen; b++) {
-                               long arr_conv_27_ref = (long)&outputs_var.data[b];
+                               long arr_conv_27_ref = ((long)&outputs_var.data[b]) | 1;
                                outputs_arr_ptr[b] = arr_conv_27_ref;
                        }
                        (*env)->ReleasePrimitiveArrayCritical(env, outputs_arr, outputs_arr_ptr, 0);
@@ -1114,7 +1114,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1EventZ_1new(JNIEnv
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKEvent arr_elem_conv = *(LDKEvent*)arr_elem;
+                       LDKEvent arr_elem_conv = *(LDKEvent*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -1141,11 +1141,11 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1usizeTransactio
        return (long)ret;
 }
 JNIEXPORT intptr_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1usizeTransactionZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)ptr;
+       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)(ptr & ~1);
        return tuple->a;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1usizeTransactionZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)ptr;
+       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)(ptr & ~1);
        LDKTransaction b_var = tuple->b;
        int8_tArray b_arr = (*env)->NewByteArray(env, b_var.datalen);
        (*env)->SetByteArrayRegion(env, b_arr, 0, b_var.datalen, b_var.data);
@@ -1161,7 +1161,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1C2Tuple_1usizeTran
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKC2Tuple_usizeTransactionZ arr_elem_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_elem;
+                       LDKC2Tuple_usizeTransactionZ arr_elem_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -1173,27 +1173,16 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneChannelMon
        return ((LDKCResult_NoneChannelMonitorUpdateErrZ*)arg)->result_ok;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneChannelMonitorUpdateErrZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)arg;
+       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneChannelMonitorUpdateErrZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)arg;
+       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(arg & ~1);
        CHECK(!val->result_ok);
        jclass err_conv = LDKChannelMonitorUpdateErr_to_java(env, (*val->contents.err));
        return err_conv;
 }
-static inline LDKCResult_NoneChannelMonitorUpdateErrZ CResult_NoneChannelMonitorUpdateErrZ_clone(const LDKCResult_NoneChannelMonitorUpdateErrZ *orig) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               res.contents.result = NULL;
-       } else {
-               LDKChannelMonitorUpdateErr* contents = MALLOC(sizeof(LDKChannelMonitorUpdateErr), "LDKChannelMonitorUpdateErr result Err clone");
-               *contents = ChannelMonitorUpdateErr_clone(orig->contents.err);
-               res.contents.err = contents;
-       }
-       return res;
-}
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1MonitorEventZ_1new(JNIEnv *env, jclass clz, int64_tArray elems) {
        LDKCVec_MonitorEventZ *ret = MALLOC(sizeof(LDKCVec_MonitorEventZ), "LDKCVec_MonitorEventZ");
        ret->datalen = (*env)->GetArrayLength(env, elems);
@@ -1207,8 +1196,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1MonitorEventZ_1new
                        LDKMonitorEvent arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = MonitorEvent_clone(&arr_elem_conv);
+                       arr_elem_conv = MonitorEvent_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -1226,7 +1214,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelMonitor
        return ((LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelMonitorUpdateDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)arg;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKChannelMonitorUpdate res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1235,7 +1223,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelMonitorU
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelMonitorUpdateDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)arg;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1247,12 +1235,12 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneMonitorUpd
        return ((LDKCResult_NoneMonitorUpdateErrorZ*)arg)->result_ok;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneMonitorUpdateErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)arg;
+       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneMonitorUpdateErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)arg;
+       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKMonitorUpdateError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1265,8 +1253,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1OutPointScriptZ
        LDKOutPoint a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = OutPoint_clone(&a_conv);
+       a_conv = OutPoint_clone(&a_conv);
        ret->a = a_conv;
        LDKCVec_u8Z b_ref;
        b_ref.datalen = (*env)->GetArrayLength(env, b);
@@ -1275,15 +1262,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1OutPointScriptZ
        ret->b = b_ref;
        return (long)ret;
 }
-static inline LDKC2Tuple_OutPointScriptZ C2Tuple_OutPointScriptZ_clone(const LDKC2Tuple_OutPointScriptZ *orig) {
-       LDKC2Tuple_OutPointScriptZ ret = {
-               .a = OutPoint_clone(&orig->a),
-               .b = CVec_u8Z_clone(&orig->b),
-       };
-       return ret;
-}
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1OutPointScriptZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)ptr;
+       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)(ptr & ~1);
        LDKOutPoint a_var = tuple->a;
        CHECK((((long)a_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&a_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -1291,7 +1271,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1OutPointScriptZ
        return a_ref;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1OutPointScriptZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)ptr;
+       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)(ptr & ~1);
        LDKCVec_u8Z b_var = tuple->b;
        int8_tArray b_arr = (*env)->NewByteArray(env, b_var.datalen);
        (*env)->SetByteArrayRegion(env, b_arr, 0, b_var.datalen, b_var.data);
@@ -1300,25 +1280,18 @@ JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1OutPointScr
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1u32TxOutZ_1new(JNIEnv *env, jclass clz, int32_t a, int64_t b) {
        LDKC2Tuple_u32TxOutZ* ret = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
        ret->a = a;
-       LDKTxOut b_conv = *(LDKTxOut*)b;
+       LDKTxOut b_conv = *(LDKTxOut*)(((uint64_t)b) & ~1);
        FREE((void*)b);
        ret->b = b_conv;
        return (long)ret;
 }
-static inline LDKC2Tuple_u32TxOutZ C2Tuple_u32TxOutZ_clone(const LDKC2Tuple_u32TxOutZ *orig) {
-       LDKC2Tuple_u32TxOutZ ret = {
-               .a = orig->a,
-               .b = TxOut_clone(&orig->b),
-       };
-       return ret;
-}
 JNIEXPORT int32_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1u32TxOutZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)ptr;
+       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)(ptr & ~1);
        return tuple->a;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1u32TxOutZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)ptr;
-       long b_ref = (long)&tuple->b;
+       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)(ptr & ~1);
+       long b_ref = ((long)&tuple->b) | 1;
        return (long)b_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1C2Tuple_1u32TxOutZZ_1new(JNIEnv *env, jclass clz, int64_tArray elems) {
@@ -1331,7 +1304,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1C2Tuple_1u32TxOutZ
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKC2Tuple_u32TxOutZ arr_elem_conv = *(LDKC2Tuple_u32TxOutZ*)arr_elem;
+                       LDKC2Tuple_u32TxOutZ arr_elem_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -1361,7 +1334,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1TxidCVec_1C2Tup
        int64_t* b_vals = (*env)->GetLongArrayElements (env, b, NULL);
        for (size_t a = 0; a < b_constr.datalen; a++) {
                int64_t arr_conv_26 = b_vals[a];
-               LDKC2Tuple_u32TxOutZ arr_conv_26_conv = *(LDKC2Tuple_u32TxOutZ*)arr_conv_26;
+               LDKC2Tuple_u32TxOutZ arr_conv_26_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_conv_26) & ~1);
                FREE((void*)arr_conv_26);
                b_constr.data[a] = arr_conv_26_conv;
        }
@@ -1369,26 +1342,19 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1TxidCVec_1C2Tup
        ret->b = b_constr;
        return (long)ret;
 }
-static inline LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone(const LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *orig) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ ret = {
-               .a = ThirtyTwoBytes_clone(&orig->a),
-               .b = CVec_C2Tuple_u32TxOutZZ_clone(&orig->b),
-       };
-       return ret;
-}
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1TxidCVec_1C2Tuple_1u32TxOutZZZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)ptr;
+       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(ptr & ~1);
        int8_tArray a_arr = (*env)->NewByteArray(env, 32);
        (*env)->SetByteArrayRegion(env, a_arr, 0, 32, tuple->a.data);
        return a_arr;
 }
 JNIEXPORT int64_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1TxidCVec_1C2Tuple_1u32TxOutZZZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)ptr;
+       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(ptr & ~1);
        LDKCVec_C2Tuple_u32TxOutZZ b_var = tuple->b;
        int64_tArray b_arr = (*env)->NewLongArray(env, b_var.datalen);
        int64_t *b_arr_ptr = (*env)->GetPrimitiveArrayCritical(env, b_arr, NULL);
        for (size_t a = 0; a < b_var.datalen; a++) {
-               long arr_conv_26_ref = (long)&b_var.data[a];
+               long arr_conv_26_ref = (long)(&b_var.data[a]) | 1;
                b_arr_ptr[a] = arr_conv_26_ref;
        }
        (*env)->ReleasePrimitiveArrayCritical(env, b_arr, b_arr_ptr, 0);
@@ -1404,7 +1370,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1C2Tuple_1TxidCVec_
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_elem_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)arr_elem;
+                       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_elem_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -1412,13 +1378,6 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1C2Tuple_1TxidCVec_
        }
        return (long)ret;
 }
-static inline LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_clone(const LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ *orig) {
-       LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ) * orig->datalen, "LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone(&orig->data[i]);
-       }
-       return ret;
-}
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1SignatureCVec_1SignatureZZ_1new(JNIEnv *env, jclass clz, int8_tArray a, jobjectArray b) {
        LDKC2Tuple_SignatureCVec_SignatureZZ* ret = MALLOC(sizeof(LDKC2Tuple_SignatureCVec_SignatureZZ), "LDKC2Tuple_SignatureCVec_SignatureZZ");
        LDKSignature a_ref;
@@ -1442,13 +1401,13 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1SignatureCVec_1
        return (long)ret;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1SignatureCVec_1SignatureZZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)ptr;
+       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)(ptr & ~1);
        int8_tArray a_arr = (*env)->NewByteArray(env, 64);
        (*env)->SetByteArrayRegion(env, a_arr, 0, 64, tuple->a.compact_form);
        return a_arr;
 }
 JNIEXPORT jobjectArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1SignatureCVec_1SignatureZZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)ptr;
+       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)(ptr & ~1);
        LDKCVec_SignatureZ b_var = tuple->b;
        jobjectArray b_arr = (*env)->NewObjectArray(env, b_var.datalen, arr_of_B_clz, NULL);
        ;
@@ -1463,13 +1422,13 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1Signa
        return ((LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1SignatureCVec_1SignatureZZNoneZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)arg;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = (long)(&(*val->contents.result)) | 1;
        return res_ref;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1SignatureCVec_1SignatureZZNoneZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)arg;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
@@ -1477,35 +1436,14 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SignatureNoneZ
        return ((LDKCResult_SignatureNoneZ*)arg)->result_ok;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SignatureNoneZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)arg;
+       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)(arg & ~1);
        CHECK(val->result_ok);
        int8_tArray res_arr = (*env)->NewByteArray(env, 64);
        (*env)->SetByteArrayRegion(env, res_arr, 0, 64, (*val->contents.result).compact_form);
        return res_arr;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SignatureNoneZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)arg;
-       CHECK(!val->result_ok);
-       return *val->contents.err;
-}
-JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1result_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       return ((LDKCResult_CVec_SignatureZNoneZ*)arg)->result_ok;
-}
-JNIEXPORT jobjectArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)arg;
-       CHECK(val->result_ok);
-       LDKCVec_SignatureZ res_var = (*val->contents.result);
-       jobjectArray res_arr = (*env)->NewObjectArray(env, res_var.datalen, arr_of_B_clz, NULL);
-       ;
-       for (size_t i = 0; i < res_var.datalen; i++) {
-               int8_tArray arr_conv_8_arr = (*env)->NewByteArray(env, 64);
-               (*env)->SetByteArrayRegion(env, arr_conv_8_arr, 0, 64, res_var.data[i].compact_form);
-               (*env)->SetObjectArrayElement(env, res_arr, i, arr_conv_8_arr);
-       }
-       return res_arr;
-}
-JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)arg;
+       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
@@ -1517,8 +1455,7 @@ typedef struct LDKChannelKeys_JCalls {
        jmethodID release_commitment_secret_meth;
        jmethodID key_derivation_params_meth;
        jmethodID sign_counterparty_commitment_meth;
-       jmethodID sign_holder_commitment_meth;
-       jmethodID sign_holder_commitment_htlc_transactions_meth;
+       jmethodID sign_holder_commitment_and_htlcs_meth;
        jmethodID sign_justice_transaction_meth;
        jmethodID sign_counterparty_htlc_transaction_meth;
        jmethodID sign_closing_transaction_meth;
@@ -1566,7 +1503,7 @@ LDKC2Tuple_u64u64Z key_derivation_params_jcall(const void* this_arg) {
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKC2Tuple_u64u64Z* ret = (LDKC2Tuple_u64u64Z*)(*env)->CallLongMethod(env, obj, j_calls->key_derivation_params_meth);
-       LDKC2Tuple_u64u64Z ret_conv = *(LDKC2Tuple_u64u64Z*)ret;
+       LDKC2Tuple_u64u64Z ret_conv = *(LDKC2Tuple_u64u64Z*)(((uint64_t)ret) & ~1);
        ret_conv = C2Tuple_u64u64Z_clone((LDKC2Tuple_u64u64Z*)ret);
        return ret_conv;
 }
@@ -1575,8 +1512,7 @@ LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_counterparty_commitment_j
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKCommitmentTransaction commitment_tx_var = *commitment_tx;
-       if (commitment_tx->inner != NULL)
-               commitment_tx_var = CommitmentTransaction_clone(commitment_tx);
+       commitment_tx_var = CommitmentTransaction_clone(commitment_tx);
        CHECK((((long)commitment_tx_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&commitment_tx_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long commitment_tx_ref = (long)commitment_tx_var.inner;
@@ -1586,17 +1522,16 @@ LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_counterparty_commitment_j
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_counterparty_commitment_meth, commitment_tx_ref);
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)ret;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone((LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)ret);
        return ret_conv;
 }
-LDKCResult_SignatureNoneZ sign_holder_commitment_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
+LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_holder_commitment_and_htlcs_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
        LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKHolderCommitmentTransaction commitment_tx_var = *commitment_tx;
-       if (commitment_tx->inner != NULL)
-               commitment_tx_var = HolderCommitmentTransaction_clone(commitment_tx);
+       commitment_tx_var = HolderCommitmentTransaction_clone(commitment_tx);
        CHECK((((long)commitment_tx_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&commitment_tx_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long commitment_tx_ref = (long)commitment_tx_var.inner;
@@ -1605,29 +1540,9 @@ LDKCResult_SignatureNoneZ sign_holder_commitment_jcall(const void* this_arg, con
        }
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
-       LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_holder_commitment_meth, commitment_tx_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
-       ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
-       return ret_conv;
-}
-LDKCResult_CVec_SignatureZNoneZ sign_holder_commitment_htlc_transactions_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
-       LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
-       JNIEnv *env;
-       DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
-       LDKHolderCommitmentTransaction commitment_tx_var = *commitment_tx;
-       if (commitment_tx->inner != NULL)
-               commitment_tx_var = HolderCommitmentTransaction_clone(commitment_tx);
-       CHECK((((long)commitment_tx_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
-       CHECK((((long)&commitment_tx_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
-       long commitment_tx_ref = (long)commitment_tx_var.inner;
-       if (commitment_tx_var.is_owned) {
-               commitment_tx_ref |= 1;
-       }
-       jobject obj = (*env)->NewLocalRef(env, j_calls->o);
-       CHECK(obj != NULL);
-       LDKCResult_CVec_SignatureZNoneZ* ret = (LDKCResult_CVec_SignatureZNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_holder_commitment_htlc_transactions_meth, commitment_tx_ref);
-       LDKCResult_CVec_SignatureZNoneZ ret_conv = *(LDKCResult_CVec_SignatureZNoneZ*)ret;
-       ret_conv = CResult_CVec_SignatureZNoneZ_clone((LDKCResult_CVec_SignatureZNoneZ*)ret);
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_holder_commitment_and_htlcs_meth, commitment_tx_ref);
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone((LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)ret);
        return ret_conv;
 }
 LDKCResult_SignatureNoneZ sign_justice_transaction_jcall(const void* this_arg, LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (* per_commitment_key)[32], const LDKHTLCOutputInCommitment * htlc) {
@@ -1641,8 +1556,7 @@ LDKCResult_SignatureNoneZ sign_justice_transaction_jcall(const void* this_arg, L
        int8_tArray per_commitment_key_arr = (*env)->NewByteArray(env, 32);
        (*env)->SetByteArrayRegion(env, per_commitment_key_arr, 0, 32, *per_commitment_key);
        LDKHTLCOutputInCommitment htlc_var = *htlc;
-       if (htlc->inner != NULL)
-               htlc_var = HTLCOutputInCommitment_clone(htlc);
+       htlc_var = HTLCOutputInCommitment_clone(htlc);
        CHECK((((long)htlc_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&htlc_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long htlc_ref = (long)htlc_var.inner;
@@ -1652,7 +1566,7 @@ LDKCResult_SignatureNoneZ sign_justice_transaction_jcall(const void* this_arg, L
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_justice_transaction_meth, justice_tx_arr, input, amount, per_commitment_key_arr, htlc_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
@@ -1667,8 +1581,7 @@ LDKCResult_SignatureNoneZ sign_counterparty_htlc_transaction_jcall(const void* t
        int8_tArray per_commitment_point_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, per_commitment_point_arr, 0, 33, per_commitment_point.compressed_form);
        LDKHTLCOutputInCommitment htlc_var = *htlc;
-       if (htlc->inner != NULL)
-               htlc_var = HTLCOutputInCommitment_clone(htlc);
+       htlc_var = HTLCOutputInCommitment_clone(htlc);
        CHECK((((long)htlc_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&htlc_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long htlc_ref = (long)htlc_var.inner;
@@ -1678,7 +1591,7 @@ LDKCResult_SignatureNoneZ sign_counterparty_htlc_transaction_jcall(const void* t
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_counterparty_htlc_transaction_meth, htlc_tx_arr, input, amount, per_commitment_point_arr, htlc_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
@@ -1693,7 +1606,7 @@ LDKCResult_SignatureNoneZ sign_closing_transaction_jcall(const void* this_arg, L
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_closing_transaction_meth, closing_tx_arr);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
@@ -1702,8 +1615,7 @@ LDKCResult_SignatureNoneZ sign_channel_announcement_jcall(const void* this_arg,
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKUnsignedChannelAnnouncement msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UnsignedChannelAnnouncement_clone(msg);
+       msg_var = UnsignedChannelAnnouncement_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -1713,7 +1625,7 @@ LDKCResult_SignatureNoneZ sign_channel_announcement_jcall(const void* this_arg,
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)(*env)->CallLongMethod(env, obj, j_calls->sign_channel_announcement_meth, msg_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
@@ -1722,8 +1634,7 @@ void ready_channel_jcall(void* this_arg, const LDKChannelTransactionParameters *
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKChannelTransactionParameters channel_parameters_var = *channel_parameters;
-       if (channel_parameters->inner != NULL)
-               channel_parameters_var = ChannelTransactionParameters_clone(channel_parameters);
+       channel_parameters_var = ChannelTransactionParameters_clone(channel_parameters);
        CHECK((((long)channel_parameters_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&channel_parameters_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long channel_parameters_ref = (long)channel_parameters_var.inner;
@@ -1767,10 +1678,8 @@ static inline LDKChannelKeys LDKChannelKeys_init (JNIEnv *env, jclass clz, jobje
        CHECK(calls->key_derivation_params_meth != NULL);
        calls->sign_counterparty_commitment_meth = (*env)->GetMethodID(env, c, "sign_counterparty_commitment", "(J)J");
        CHECK(calls->sign_counterparty_commitment_meth != NULL);
-       calls->sign_holder_commitment_meth = (*env)->GetMethodID(env, c, "sign_holder_commitment", "(J)J");
-       CHECK(calls->sign_holder_commitment_meth != NULL);
-       calls->sign_holder_commitment_htlc_transactions_meth = (*env)->GetMethodID(env, c, "sign_holder_commitment_htlc_transactions", "(J)J");
-       CHECK(calls->sign_holder_commitment_htlc_transactions_meth != NULL);
+       calls->sign_holder_commitment_and_htlcs_meth = (*env)->GetMethodID(env, c, "sign_holder_commitment_and_htlcs", "(J)J");
+       CHECK(calls->sign_holder_commitment_and_htlcs_meth != NULL);
        calls->sign_justice_transaction_meth = (*env)->GetMethodID(env, c, "sign_justice_transaction", "([BJJ[BJ)J");
        CHECK(calls->sign_justice_transaction_meth != NULL);
        calls->sign_counterparty_htlc_transaction_meth = (*env)->GetMethodID(env, c, "sign_counterparty_htlc_transaction", "([BJJ[BJ)J");
@@ -1787,8 +1696,7 @@ static inline LDKChannelKeys LDKChannelKeys_init (JNIEnv *env, jclass clz, jobje
        LDKChannelPublicKeys pubkeys_conv;
        pubkeys_conv.inner = (void*)(pubkeys & (~1));
        pubkeys_conv.is_owned = (pubkeys & 1) || (pubkeys == 0);
-       if (pubkeys_conv.inner != NULL)
-               pubkeys_conv = ChannelPublicKeys_clone(&pubkeys_conv);
+       pubkeys_conv = ChannelPublicKeys_clone(&pubkeys_conv);
 
        LDKChannelKeys ret = {
                .this_arg = (void*) calls,
@@ -1796,8 +1704,7 @@ static inline LDKChannelKeys LDKChannelKeys_init (JNIEnv *env, jclass clz, jobje
                .release_commitment_secret = release_commitment_secret_jcall,
                .key_derivation_params = key_derivation_params_jcall,
                .sign_counterparty_commitment = sign_counterparty_commitment_jcall,
-               .sign_holder_commitment = sign_holder_commitment_jcall,
-               .sign_holder_commitment_htlc_transactions = sign_holder_commitment_htlc_transactions_jcall,
+               .sign_holder_commitment_and_htlcs = sign_holder_commitment_and_htlcs_jcall,
                .sign_justice_transaction = sign_justice_transaction_jcall,
                .sign_counterparty_htlc_transaction = sign_counterparty_htlc_transaction_jcall,
                .sign_closing_transaction = sign_closing_transaction_jcall,
@@ -1847,23 +1754,13 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1counterp
        return (long)ret_conv;
 }
 
-JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1holder_1commitment(JNIEnv *env, jclass clz, int64_t this_arg, int64_t commitment_tx) {
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1holder_1commitment_1and_1htlcs(JNIEnv *env, jclass clz, int64_t this_arg, int64_t commitment_tx) {
        LDKChannelKeys* this_arg_conv = (LDKChannelKeys*)this_arg;
        LDKHolderCommitmentTransaction commitment_tx_conv;
        commitment_tx_conv.inner = (void*)(commitment_tx & (~1));
        commitment_tx_conv.is_owned = false;
-       LDKCResult_SignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SignatureNoneZ), "LDKCResult_SignatureNoneZ");
-       *ret_conv = (this_arg_conv->sign_holder_commitment)(this_arg_conv->this_arg, &commitment_tx_conv);
-       return (long)ret_conv;
-}
-
-JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1holder_1commitment_1htlc_1transactions(JNIEnv *env, jclass clz, int64_t this_arg, int64_t commitment_tx) {
-       LDKChannelKeys* this_arg_conv = (LDKChannelKeys*)this_arg;
-       LDKHolderCommitmentTransaction commitment_tx_conv;
-       commitment_tx_conv.inner = (void*)(commitment_tx & (~1));
-       commitment_tx_conv.is_owned = false;
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = (this_arg_conv->sign_holder_commitment_htlc_transactions)(this_arg_conv->this_arg, &commitment_tx_conv);
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ), "LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_commitment_and_htlcs)(this_arg_conv->this_arg, &commitment_tx_conv);
        return (long)ret_conv;
 }
 
@@ -1969,18 +1866,18 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1BlockHashChanne
        LDKChannelMonitor b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       b_conv = ChannelMonitor_clone(&b_conv);
        ret->b = b_conv;
        return (long)ret;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1BlockHashChannelMonitorZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)ptr;
+       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)(ptr & ~1);
        int8_tArray a_arr = (*env)->NewByteArray(env, 32);
        (*env)->SetByteArrayRegion(env, a_arr, 0, 32, tuple->a.data);
        return a_arr;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1BlockHashChannelMonitorZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)ptr;
+       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)(ptr & ~1);
        LDKChannelMonitor b_var = tuple->b;
        CHECK((((long)b_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&b_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -1991,13 +1888,13 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1Block
        return ((LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1BlockHashChannelMonitorZDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = (long)(&(*val->contents.result)) | 1;
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1BlockHashChannelMonitorZDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2009,13 +1906,13 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SpendableOutpu
        return ((LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SpendableOutputDescriptorDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)arg;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = ((long)&(*val->contents.result)) | 1;
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SpendableOutputDescriptorDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)arg;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2027,14 +1924,14 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChanKeySignerD
        return ((LDKCResult_ChanKeySignerDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChanKeySignerDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)arg;
+       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKChannelKeys* ret = MALLOC(sizeof(LDKChannelKeys), "LDKChannelKeys");
-       *ret = (*val->contents.result);
+       *ret = ChannelKeys_clone(&(*val->contents.result));
        return (long)ret;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChanKeySignerDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)arg;
+       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2046,7 +1943,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InMemoryChanne
        return ((LDKCResult_InMemoryChannelKeysDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InMemoryChannelKeysDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)arg;
+       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKInMemoryChannelKeys res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2055,7 +1952,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InMemoryChannel
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InMemoryChannelKeysDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)arg;
+       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2067,30 +1964,17 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TxOutAccessErr
        return ((LDKCResult_TxOutAccessErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TxOutAccessErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)arg;
+       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = ((long)&(*val->contents.result)) | 1;
        return (long)res_ref;
 }
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TxOutAccessErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)arg;
+       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        jclass err_conv = LDKAccessError_to_java(env, (*val->contents.err));
        return err_conv;
 }
-static inline LDKCResult_TxOutAccessErrorZ CResult_TxOutAccessErrorZ_clone(const LDKCResult_TxOutAccessErrorZ *orig) {
-       LDKCResult_TxOutAccessErrorZ res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               LDKTxOut* contents = MALLOC(sizeof(LDKTxOut), "LDKTxOut result OK clone");
-               *contents = TxOut_clone(orig->contents.result);
-               res.contents.result = contents;
-       } else {
-               LDKAccessError* contents = MALLOC(sizeof(LDKAccessError), "LDKAccessError result Err clone");
-               *contents = AccessError_clone(orig->contents.err);
-               res.contents.err = contents;
-       }
-       return res;
-}
 static jclass LDKAPIError_APIMisuseError_class = NULL;
 static jmethodID LDKAPIError_APIMisuseError_meth = NULL;
 static jclass LDKAPIError_FeeRateTooHigh_class = NULL;
@@ -2164,27 +2048,16 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneAPIErrorZ_
        return ((LDKCResult_NoneAPIErrorZ*)arg)->result_ok;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneAPIErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)arg;
+       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneAPIErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)arg;
+       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
-       long err_ref = (long)&(*val->contents.err);
+       long err_ref = ((long)&(*val->contents.err)) | 1;
        return err_ref;
 }
-static inline LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_clone(const LDKCResult_NoneAPIErrorZ *orig) {
-       LDKCResult_NoneAPIErrorZ res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               res.contents.result = NULL;
-       } else {
-               LDKAPIError* contents = MALLOC(sizeof(LDKAPIError), "LDKAPIError result Err clone");
-               *contents = APIError_clone(orig->contents.err);
-               res.contents.err = contents;
-       }
-       return res;
-}
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1ChannelDetailsZ_1new(JNIEnv *env, jclass clz, int64_tArray elems) {
        LDKCVec_ChannelDetailsZ *ret = MALLOC(sizeof(LDKCVec_ChannelDetailsZ), "LDKCVec_ChannelDetailsZ");
        ret->datalen = (*env)->GetArrayLength(env, elems);
@@ -2198,8 +2071,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1ChannelDetailsZ_1n
                        LDKChannelDetails arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = ChannelDetails_clone(&arr_elem_conv);
+                       arr_elem_conv = ChannelDetails_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -2217,12 +2089,12 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NonePaymentSen
        return ((LDKCResult_NonePaymentSendFailureZ*)arg)->result_ok;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NonePaymentSendFailureZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)arg;
+       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NonePaymentSendFailureZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)arg;
+       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPaymentSendFailure err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2296,7 +2168,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1NetAddressZ_1new(J
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKNetAddress arr_elem_conv = *(LDKNetAddress*)arr_elem;
+                       LDKNetAddress arr_elem_conv = *(LDKNetAddress*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -2324,13 +2196,20 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1ChannelMonitorZ_1n
                        LDKChannelMonitor arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       // Warning: we may need a move here but can't clone!
+                       arr_elem_conv = ChannelMonitor_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
        }
        return (long)ret;
 }
+static inline LDKCVec_ChannelMonitorZ CVec_ChannelMonitorZ_clone(const LDKCVec_ChannelMonitorZ *orig) {
+       LDKCVec_ChannelMonitorZ ret = { .data = MALLOC(sizeof(LDKChannelMonitor) * orig->datalen, "LDKCVec_ChannelMonitorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ChannelMonitor_clone(&orig->data[i]);
+       }
+       return ret;
+}
 typedef struct LDKWatch_JCalls {
        atomic_size_t refcnt;
        JavaVM *vm;
@@ -2369,7 +2248,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ watch_channel_jcall(const void* this_arg
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(*env)->CallLongMethod(env, obj, j_calls->watch_channel_meth, funding_txo_ref, monitor_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -2394,7 +2273,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_channel_jcall(const void* this_ar
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(*env)->CallLongMethod(env, obj, j_calls->update_channel_meth, funding_txo_ref, update_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -2417,8 +2296,7 @@ LDKCVec_MonitorEventZ release_pending_monitor_events_jcall(const void* this_arg)
                LDKMonitorEvent arr_conv_14_conv;
                arr_conv_14_conv.inner = (void*)(arr_conv_14 & (~1));
                arr_conv_14_conv.is_owned = (arr_conv_14 & 1) || (arr_conv_14 == 0);
-               if (arr_conv_14_conv.inner != NULL)
-                       arr_conv_14_conv = MonitorEvent_clone(&arr_conv_14_conv);
+               arr_conv_14_conv = MonitorEvent_clone(&arr_conv_14_conv);
                arg_constr.data[o] = arr_conv_14_conv;
        }
        (*env)->ReleaseLongArrayElements(env, arg, arg_vals, 0);
@@ -2462,12 +2340,11 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_Watch_1watch_1channel(JNIEn
        LDKOutPoint funding_txo_conv;
        funding_txo_conv.inner = (void*)(funding_txo & (~1));
        funding_txo_conv.is_owned = (funding_txo & 1) || (funding_txo == 0);
-       if (funding_txo_conv.inner != NULL)
-               funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
        LDKChannelMonitor monitor_conv;
        monitor_conv.inner = (void*)(monitor & (~1));
        monitor_conv.is_owned = (monitor & 1) || (monitor == 0);
-       // Warning: we may need a move here but can't clone!
+       monitor_conv = ChannelMonitor_clone(&monitor_conv);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneChannelMonitorUpdateErrZ), "LDKCResult_NoneChannelMonitorUpdateErrZ");
        *ret_conv = (this_arg_conv->watch_channel)(this_arg_conv->this_arg, funding_txo_conv, monitor_conv);
        return (long)ret_conv;
@@ -2478,13 +2355,11 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_Watch_1update_1channel(JNIE
        LDKOutPoint funding_txo_conv;
        funding_txo_conv.inner = (void*)(funding_txo & (~1));
        funding_txo_conv.is_owned = (funding_txo & 1) || (funding_txo == 0);
-       if (funding_txo_conv.inner != NULL)
-               funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
        LDKChannelMonitorUpdate update_conv;
        update_conv.inner = (void*)(update & (~1));
        update_conv.is_owned = (update & 1) || (update == 0);
-       if (update_conv.inner != NULL)
-               update_conv = ChannelMonitorUpdate_clone(&update_conv);
+       update_conv = ChannelMonitorUpdate_clone(&update_conv);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneChannelMonitorUpdateErrZ), "LDKCResult_NoneChannelMonitorUpdateErrZ");
        *ret_conv = (this_arg_conv->update_channel)(this_arg_conv->this_arg, funding_txo_conv, update_conv);
        return (long)ret_conv;
@@ -2638,7 +2513,7 @@ LDKChannelKeys get_channel_keys_jcall(const void* this_arg, bool inbound, uint64
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKChannelKeys* ret = (LDKChannelKeys*)(*env)->CallLongMethod(env, obj, j_calls->get_channel_keys_meth, inbound, channel_value_satoshis);
-       LDKChannelKeys ret_conv = *(LDKChannelKeys*)ret;
+       LDKChannelKeys ret_conv = *(LDKChannelKeys*)(((uint64_t)ret) & ~1);
        ret_conv = ChannelKeys_clone(ret);
        return ret_conv;
 }
@@ -2664,8 +2539,8 @@ LDKCResult_ChanKeySignerDecodeErrorZ read_chan_signer_jcall(const void* this_arg
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_ChanKeySignerDecodeErrorZ* ret = (LDKCResult_ChanKeySignerDecodeErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->read_chan_signer_meth, reader_arr);
-       LDKCResult_ChanKeySignerDecodeErrorZ ret_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_ChanKeySignerDecodeErrorZ ret_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_ChanKeySignerDecodeErrorZ_clone((LDKCResult_ChanKeySignerDecodeErrorZ*)ret);
        return ret_conv;
 }
 static void* LDKKeysInterface_JCalls_clone(const void* this_arg) {
@@ -2877,18 +2752,18 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1BlockHashChanne
        LDKChannelManager b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelManager
        ret->b = b_conv;
        return (long)ret;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1BlockHashChannelManagerZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)ptr;
+       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)(ptr & ~1);
        int8_tArray a_arr = (*env)->NewByteArray(env, 32);
        (*env)->SetByteArrayRegion(env, a_arr, 0, 32, tuple->a.data);
        return a_arr;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC2Tuple_1BlockHashChannelManagerZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)ptr;
+       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)(ptr & ~1);
        LDKChannelManager b_var = tuple->b;
        CHECK((((long)b_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&b_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -2899,13 +2774,13 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1Block
        return ((LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1BlockHashChannelManagerZDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = (long)(&(*val->contents.result)) | 1;
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1C2Tuple_1BlockHashChannelManagerZDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2917,34 +2792,21 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NetAddressu8Z_
        return ((LDKCResult_NetAddressu8Z*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NetAddressu8Z_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)arg;
+       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = ((long)&(*val->contents.result)) | 1;
        return res_ref;
 }
 JNIEXPORT int8_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NetAddressu8Z_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)arg;
+       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
-static inline LDKCResult_NetAddressu8Z CResult_NetAddressu8Z_clone(const LDKCResult_NetAddressu8Z *orig) {
-       LDKCResult_NetAddressu8Z res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               LDKNetAddress* contents = MALLOC(sizeof(LDKNetAddress), "LDKNetAddress result OK clone");
-               *contents = NetAddress_clone(orig->contents.result);
-               res.contents.result = contents;
-       } else {
-               int8_t* contents = MALLOC(sizeof(int8_t), "int8_t result Err clone");
-               *contents = *orig->contents.err;
-               res.contents.err = contents;
-       }
-       return res;
-}
 JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CResult_1NetAddressu8ZDecodeErrorZ_1result_1ok(JNIEnv *env, jclass clz, int64_t arg) {
        return ((LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CResult_1NetAddressu8ZDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)arg;
+       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKCResult_NetAddressu8Z* res_conv = MALLOC(sizeof(LDKCResult_NetAddressu8Z), "LDKCResult_NetAddressu8Z");
        *res_conv = (*val->contents.result);
@@ -2952,7 +2814,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CResult_1NetAdd
        return (long)res_conv;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CResult_1NetAddressu8ZDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)arg;
+       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2993,8 +2855,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1UpdateAddHTLCZ_1ne
                        LDKUpdateAddHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateAddHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateAddHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -3021,8 +2882,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1UpdateFulfillHTLCZ
                        LDKUpdateFulfillHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateFulfillHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateFulfillHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -3049,8 +2909,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1UpdateFailHTLCZ_1n
                        LDKUpdateFailHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateFailHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateFailHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -3077,8 +2936,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1UpdateFailMalforme
                        LDKUpdateFailMalformedHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateFailMalformedHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateFailMalformedHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -3096,12 +2954,12 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1boolLightningE
        return ((LDKCResult_boolLightningErrorZ*)arg)->result_ok;
 }
 JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1boolLightningErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)arg;
+       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1boolLightningErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)arg;
+       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKLightningError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3114,33 +2972,22 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC3Tuple_1ChannelAnnounce
        LDKChannelAnnouncement a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = ChannelAnnouncement_clone(&a_conv);
+       a_conv = ChannelAnnouncement_clone(&a_conv);
        ret->a = a_conv;
        LDKChannelUpdate b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       if (b_conv.inner != NULL)
-               b_conv = ChannelUpdate_clone(&b_conv);
+       b_conv = ChannelUpdate_clone(&b_conv);
        ret->b = b_conv;
        LDKChannelUpdate c_conv;
        c_conv.inner = (void*)(c & (~1));
        c_conv.is_owned = (c & 1) || (c == 0);
-       if (c_conv.inner != NULL)
-               c_conv = ChannelUpdate_clone(&c_conv);
+       c_conv = ChannelUpdate_clone(&c_conv);
        ret->c = c_conv;
        return (long)ret;
 }
-static inline LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(const LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *orig) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ ret = {
-               .a = ChannelAnnouncement_clone(&orig->a),
-               .b = ChannelUpdate_clone(&orig->b),
-               .c = ChannelUpdate_clone(&orig->c),
-       };
-       return ret;
-}
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC3Tuple_1ChannelAnnouncementChannelUpdateChannelUpdateZ_1get_1a(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)ptr;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(ptr & ~1);
        LDKChannelAnnouncement a_var = tuple->a;
        CHECK((((long)a_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&a_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -3148,7 +2995,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC3Tuple_1ChannelAnnounce
        return a_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC3Tuple_1ChannelAnnouncementChannelUpdateChannelUpdateZ_1get_1b(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)ptr;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(ptr & ~1);
        LDKChannelUpdate b_var = tuple->b;
        CHECK((((long)b_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&b_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -3156,7 +3003,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC3Tuple_1ChannelAnnounce
        return b_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKC3Tuple_1ChannelAnnouncementChannelUpdateChannelUpdateZ_1get_1c(JNIEnv *env, jclass clz, int64_t ptr) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)ptr;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(ptr & ~1);
        LDKChannelUpdate c_var = tuple->c;
        CHECK((((long)c_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&c_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -3173,7 +3020,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1C3Tuple_1ChannelAn
                int64_t *java_elems = (*env)->GetPrimitiveArrayCritical(env, elems, NULL);
                for (size_t i = 0; i < ret->datalen; i++) {
                        int64_t arr_elem = java_elems[i];
-                       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_elem_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)arr_elem;
+                       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_elem_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -3181,13 +3028,6 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1C3Tuple_1ChannelAn
        }
        return (long)ret;
 }
-static inline LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ CVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(const LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *orig) {
-       LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ) * orig->datalen, "LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(&orig->data[i]);
-       }
-       return ret;
-}
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1NodeAnnouncementZ_1new(JNIEnv *env, jclass clz, int64_tArray elems) {
        LDKCVec_NodeAnnouncementZ *ret = MALLOC(sizeof(LDKCVec_NodeAnnouncementZ), "LDKCVec_NodeAnnouncementZ");
        ret->datalen = (*env)->GetArrayLength(env, elems);
@@ -3201,8 +3041,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1NodeAnnouncementZ_
                        LDKNodeAnnouncement arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = NodeAnnouncement_clone(&arr_elem_conv);
+                       arr_elem_conv = NodeAnnouncement_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -3220,12 +3059,12 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneLightningE
        return ((LDKCResult_NoneLightningErrorZ*)arg)->result_ok;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneLightningErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)arg;
+       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NoneLightningErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)arg;
+       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKLightningError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3237,7 +3076,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelReestab
        return ((LDKCResult_ChannelReestablishDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelReestablishDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)arg;
+       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKChannelReestablish res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3246,7 +3085,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelReestabl
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ChannelReestablishDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)arg;
+       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3258,7 +3097,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InitDecodeErro
        return ((LDKCResult_InitDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InitDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)arg;
+       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKInit res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3267,7 +3106,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InitDecodeError
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1InitDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)arg;
+       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3279,7 +3118,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PingDecodeErro
        return ((LDKCResult_PingDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PingDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)arg;
+       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKPing res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3288,7 +3127,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PingDecodeError
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PingDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)arg;
+       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3300,7 +3139,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PongDecodeErro
        return ((LDKCResult_PongDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PongDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)arg;
+       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKPong res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3309,7 +3148,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PongDecodeError
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PongDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)arg;
+       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3321,7 +3160,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChanne
        return ((LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChannelAnnouncementDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKUnsignedChannelAnnouncement res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3330,7 +3169,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChannel
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChannelAnnouncementDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3342,7 +3181,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChanne
        return ((LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChannelUpdateDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKUnsignedChannelUpdate res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3351,7 +3190,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChannel
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedChannelUpdateDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3363,7 +3202,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ErrorMessageDe
        return ((LDKCResult_ErrorMessageDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ErrorMessageDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)arg;
+       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKErrorMessage res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3372,7 +3211,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ErrorMessageDec
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ErrorMessageDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)arg;
+       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3384,7 +3223,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedNodeAn
        return ((LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedNodeAnnouncementDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKUnsignedNodeAnnouncement res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3393,7 +3232,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedNodeAnn
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1UnsignedNodeAnnouncementDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3405,7 +3244,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryShortChan
        return ((LDKCResult_QueryShortChannelIdsDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryShortChannelIdsDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)arg;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKQueryShortChannelIds res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3414,7 +3253,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryShortChann
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryShortChannelIdsDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)arg;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3426,7 +3265,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyShortChan
        return ((LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyShortChannelIdsEndDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)arg;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKReplyShortChannelIdsEnd res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3435,7 +3274,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyShortChann
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyShortChannelIdsEndDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)arg;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3447,7 +3286,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryChannelRa
        return ((LDKCResult_QueryChannelRangeDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryChannelRangeDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKQueryChannelRange res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3456,7 +3295,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryChannelRan
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1QueryChannelRangeDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3468,7 +3307,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyChannelRa
        return ((LDKCResult_ReplyChannelRangeDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyChannelRangeDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKReplyChannelRange res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3477,7 +3316,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyChannelRan
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1ReplyChannelRangeDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3489,7 +3328,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1GossipTimestam
        return ((LDKCResult_GossipTimestampFilterDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1GossipTimestampFilterDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)arg;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKGossipTimestampFilter res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3498,7 +3337,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1GossipTimestamp
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1GossipTimestampFilterDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)arg;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3510,7 +3349,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1u8ZPeerH
        return ((LDKCResult_CVec_u8ZPeerHandleErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1u8ZPeerHandleErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)arg;
+       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKCVec_u8Z res_var = (*val->contents.result);
        int8_tArray res_arr = (*env)->NewByteArray(env, res_var.datalen);
@@ -3518,7 +3357,7 @@ JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1u8ZPe
        return res_arr;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1u8ZPeerHandleErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)arg;
+       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPeerHandleError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3530,12 +3369,12 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NonePeerHandle
        return ((LDKCResult_NonePeerHandleErrorZ*)arg)->result_ok;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NonePeerHandleErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)arg;
+       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NonePeerHandleErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)arg;
+       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPeerHandleError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3547,12 +3386,12 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1boolPeerHandle
        return ((LDKCResult_boolPeerHandleErrorZ*)arg)->result_ok;
 }
 JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1boolPeerHandleErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)arg;
+       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1boolPeerHandleErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)arg;
+       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPeerHandleError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3564,14 +3403,14 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SecretKeySecpE
        return ((LDKCResult_SecretKeySecpErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SecretKeySecpErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)arg;
+       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        int8_tArray res_arr = (*env)->NewByteArray(env, 32);
        (*env)->SetByteArrayRegion(env, res_arr, 0, 32, (*val->contents.result).bytes);
        return res_arr;
 }
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SecretKeySecpErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)arg;
+       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        jclass err_conv = LDKSecp256k1Error_to_java(env, (*val->contents.err));
        return err_conv;
@@ -3580,14 +3419,14 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PublicKeySecpE
        return ((LDKCResult_PublicKeySecpErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PublicKeySecpErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)arg;
+       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        int8_tArray res_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, res_arr, 0, 33, (*val->contents.result).compressed_form);
        return res_arr;
 }
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_LDKCResult_1PublicKeySecpErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)arg;
+       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        jclass err_conv = LDKSecp256k1Error_to_java(env, (*val->contents.err));
        return err_conv;
@@ -3596,7 +3435,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TxCreationKeys
        return ((LDKCResult_TxCreationKeysSecpErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TxCreationKeysSecpErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)arg;
+       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKTxCreationKeys res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3605,7 +3444,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TxCreationKeysS
        return res_ref;
 }
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TxCreationKeysSecpErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)arg;
+       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        jclass err_conv = LDKSecp256k1Error_to_java(env, (*val->contents.err));
        return err_conv;
@@ -3614,7 +3453,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TrustedCommitm
        return ((LDKCResult_TrustedCommitmentTransactionNoneZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TrustedCommitmentTransactionNoneZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)arg;
+       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKTrustedCommitmentTransaction res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3623,7 +3462,28 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TrustedCommitme
        return res_ref;
 }
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TrustedCommitmentTransactionNoneZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)arg;
+       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)(arg & ~1);
+       CHECK(!val->result_ok);
+       return *val->contents.err;
+}
+JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1result_1ok(JNIEnv *env, jclass clz, int64_t arg) {
+       return ((LDKCResult_CVec_SignatureZNoneZ*)arg)->result_ok;
+}
+JNIEXPORT jobjectArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
+       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)(arg & ~1);
+       CHECK(val->result_ok);
+       LDKCVec_SignatureZ res_var = (*val->contents.result);
+       jobjectArray res_arr = (*env)->NewObjectArray(env, res_var.datalen, arr_of_B_clz, NULL);
+       ;
+       for (size_t i = 0; i < res_var.datalen; i++) {
+               int8_tArray arr_conv_8_arr = (*env)->NewByteArray(env, 64);
+               (*env)->SetByteArrayRegion(env, arr_conv_8_arr, 0, 64, res_var.data[i].compact_form);
+               (*env)->SetObjectArrayElement(env, res_arr, i, arr_conv_8_arr);
+       }
+       return res_arr;
+}
+JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
+       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
@@ -3640,8 +3500,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1RouteHopZ_1new(JNI
                        LDKRouteHop arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = RouteHop_clone(&arr_elem_conv);
+                       arr_elem_conv = RouteHop_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -3666,7 +3525,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteDecodeErr
        return ((LDKCResult_RouteDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)arg;
+       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKRoute res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3675,7 +3534,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteDecodeErro
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)arg;
+       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3696,8 +3555,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCVec_1RouteHintZ_1new(JN
                        LDKRouteHint arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = RouteHint_clone(&arr_elem_conv);
+                       arr_elem_conv = RouteHint_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
                (*env)->ReleasePrimitiveArrayCritical(env, elems, java_elems, 0);
@@ -3715,7 +3573,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteLightning
        return ((LDKCResult_RouteLightningErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteLightningErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)arg;
+       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKRoute res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3724,7 +3582,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteLightningE
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RouteLightningErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)arg;
+       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKLightningError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3736,7 +3594,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RoutingFeesDec
        return ((LDKCResult_RoutingFeesDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RoutingFeesDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)arg;
+       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKRoutingFees res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3745,7 +3603,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RoutingFeesDeco
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1RoutingFeesDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)arg;
+       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3757,7 +3615,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeAnnounceme
        return ((LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeAnnouncementInfoDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKNodeAnnouncementInfo res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3766,7 +3624,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeAnnouncemen
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeAnnouncementInfoDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3778,7 +3636,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeInfoDecode
        return ((LDKCResult_NodeInfoDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeInfoDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKNodeInfo res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3787,7 +3645,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeInfoDecodeE
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NodeInfoDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3799,7 +3657,7 @@ JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NetworkGraphDe
        return ((LDKCResult_NetworkGraphDecodeErrorZ*)arg)->result_ok;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NetworkGraphDecodeErrorZ_1get_1ok(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)arg;
+       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKNetworkGraph res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3808,7 +3666,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NetworkGraphDec
        return res_ref;
 }
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LDKCResult_1NetworkGraphDecodeErrorZ_1get_1err(JNIEnv *env, jclass clz, int64_t arg) {
-       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)arg;
+       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3847,7 +3705,7 @@ LDKCVec_MessageSendEventZ get_and_clear_pending_msg_events_jcall(const void* thi
        int64_t* arg_vals = (*env)->GetLongArrayElements (env, arg, NULL);
        for (size_t s = 0; s < arg_constr.datalen; s++) {
                int64_t arr_conv_18 = arg_vals[s];
-               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)arr_conv_18;
+               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)(((uint64_t)arr_conv_18) & ~1);
                FREE((void*)arr_conv_18);
                arg_constr.data[s] = arr_conv_18_conv;
        }
@@ -3928,7 +3786,7 @@ LDKCVec_EventZ get_and_clear_pending_events_jcall(const void* this_arg) {
        int64_t* arg_vals = (*env)->GetLongArrayElements (env, arg, NULL);
        for (size_t h = 0; h < arg_constr.datalen; h++) {
                int64_t arr_conv_7 = arg_vals[h];
-               LDKEvent arr_conv_7_conv = *(LDKEvent*)arr_conv_7;
+               LDKEvent arr_conv_7_conv = *(LDKEvent*)(((uint64_t)arr_conv_7) & ~1);
                FREE((void*)arr_conv_7);
                arg_constr.data[h] = arr_conv_7_conv;
        }
@@ -4002,7 +3860,7 @@ LDKCResult_TxOutAccessErrorZ get_utxo_jcall(const void* this_arg, const uint8_t
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_TxOutAccessErrorZ* ret = (LDKCResult_TxOutAccessErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->get_utxo_meth, genesis_hash_arr, short_channel_id);
-       LDKCResult_TxOutAccessErrorZ ret_conv = *(LDKCResult_TxOutAccessErrorZ*)ret;
+       LDKCResult_TxOutAccessErrorZ ret_conv = *(LDKCResult_TxOutAccessErrorZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_TxOutAccessErrorZ_clone((LDKCResult_TxOutAccessErrorZ*)ret);
        return ret_conv;
 }
@@ -4078,8 +3936,7 @@ void register_output_jcall(const void* this_arg, const LDKOutPoint * outpoint, L
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKOutPoint outpoint_var = *outpoint;
-       if (outpoint->inner != NULL)
-               outpoint_var = OutPoint_clone(outpoint);
+       outpoint_var = OutPoint_clone(outpoint);
        CHECK((((long)outpoint_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&outpoint_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long outpoint_ref = (long)outpoint_var.inner;
@@ -4176,7 +4033,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ persist_new_channel_jcall(const void* th
                id_ref |= 1;
        }
        LDKChannelMonitor data_var = *data;
-       // Warning: we may need a move here but can't clone!
+       data_var = ChannelMonitor_clone(data);
        CHECK((((long)data_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&data_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long data_ref = (long)data_var.inner;
@@ -4186,7 +4043,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ persist_new_channel_jcall(const void* th
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(*env)->CallLongMethod(env, obj, j_calls->persist_new_channel_meth, id_ref, data_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -4202,8 +4059,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_persisted_channel_jcall(const voi
                id_ref |= 1;
        }
        LDKChannelMonitorUpdate update_var = *update;
-       if (update->inner != NULL)
-               update_var = ChannelMonitorUpdate_clone(update);
+       update_var = ChannelMonitorUpdate_clone(update);
        CHECK((((long)update_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&update_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long update_ref = (long)update_var.inner;
@@ -4211,7 +4067,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_persisted_channel_jcall(const voi
                update_ref |= 1;
        }
        LDKChannelMonitor data_var = *data;
-       // Warning: we may need a move here but can't clone!
+       data_var = ChannelMonitor_clone(data);
        CHECK((((long)data_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&data_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long data_ref = (long)data_var.inner;
@@ -4221,7 +4077,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_persisted_channel_jcall(const voi
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(*env)->CallLongMethod(env, obj, j_calls->update_persisted_channel_meth, id_ref, update_ref, data_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -4260,8 +4116,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_Persist_1persist_1new_1chan
        LDKOutPoint id_conv;
        id_conv.inner = (void*)(id & (~1));
        id_conv.is_owned = (id & 1) || (id == 0);
-       if (id_conv.inner != NULL)
-               id_conv = OutPoint_clone(&id_conv);
+       id_conv = OutPoint_clone(&id_conv);
        LDKChannelMonitor data_conv;
        data_conv.inner = (void*)(data & (~1));
        data_conv.is_owned = false;
@@ -4275,8 +4130,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_Persist_1update_1persisted_
        LDKOutPoint id_conv;
        id_conv.inner = (void*)(id & (~1));
        id_conv.is_owned = (id & 1) || (id == 0);
-       if (id_conv.inner != NULL)
-               id_conv = OutPoint_clone(&id_conv);
+       id_conv = OutPoint_clone(&id_conv);
        LDKChannelMonitorUpdate update_conv;
        update_conv.inner = (void*)(update & (~1));
        update_conv.is_owned = false;
@@ -4336,8 +4190,7 @@ void handle_open_channel_jcall(const void* this_arg, LDKPublicKey their_node_id,
                their_features_ref |= 1;
        }
        LDKOpenChannel msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = OpenChannel_clone(msg);
+       msg_var = OpenChannel_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4362,8 +4215,7 @@ void handle_accept_channel_jcall(const void* this_arg, LDKPublicKey their_node_i
                their_features_ref |= 1;
        }
        LDKAcceptChannel msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = AcceptChannel_clone(msg);
+       msg_var = AcceptChannel_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4381,8 +4233,7 @@ void handle_funding_created_jcall(const void* this_arg, LDKPublicKey their_node_
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKFundingCreated msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = FundingCreated_clone(msg);
+       msg_var = FundingCreated_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4400,8 +4251,7 @@ void handle_funding_signed_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKFundingSigned msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = FundingSigned_clone(msg);
+       msg_var = FundingSigned_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4419,8 +4269,7 @@ void handle_funding_locked_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKFundingLocked msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = FundingLocked_clone(msg);
+       msg_var = FundingLocked_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4438,8 +4287,7 @@ void handle_shutdown_jcall(const void* this_arg, LDKPublicKey their_node_id, con
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKShutdown msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = Shutdown_clone(msg);
+       msg_var = Shutdown_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4457,8 +4305,7 @@ void handle_closing_signed_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKClosingSigned msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ClosingSigned_clone(msg);
+       msg_var = ClosingSigned_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4476,8 +4323,7 @@ void handle_update_add_htlc_jcall(const void* this_arg, LDKPublicKey their_node_
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKUpdateAddHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateAddHTLC_clone(msg);
+       msg_var = UpdateAddHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4495,8 +4341,7 @@ void handle_update_fulfill_htlc_jcall(const void* this_arg, LDKPublicKey their_n
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKUpdateFulfillHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFulfillHTLC_clone(msg);
+       msg_var = UpdateFulfillHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4514,8 +4359,7 @@ void handle_update_fail_htlc_jcall(const void* this_arg, LDKPublicKey their_node
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKUpdateFailHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFailHTLC_clone(msg);
+       msg_var = UpdateFailHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4533,8 +4377,7 @@ void handle_update_fail_malformed_htlc_jcall(const void* this_arg, LDKPublicKey
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKUpdateFailMalformedHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFailMalformedHTLC_clone(msg);
+       msg_var = UpdateFailMalformedHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4552,8 +4395,7 @@ void handle_commitment_signed_jcall(const void* this_arg, LDKPublicKey their_nod
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKCommitmentSigned msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = CommitmentSigned_clone(msg);
+       msg_var = CommitmentSigned_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4571,8 +4413,7 @@ void handle_revoke_and_ack_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKRevokeAndACK msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = RevokeAndACK_clone(msg);
+       msg_var = RevokeAndACK_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4590,8 +4431,7 @@ void handle_update_fee_jcall(const void* this_arg, LDKPublicKey their_node_id, c
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKUpdateFee msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFee_clone(msg);
+       msg_var = UpdateFee_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4609,8 +4449,7 @@ void handle_announcement_signatures_jcall(const void* this_arg, LDKPublicKey the
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKAnnouncementSignatures msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = AnnouncementSignatures_clone(msg);
+       msg_var = AnnouncementSignatures_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4638,8 +4477,7 @@ void peer_connected_jcall(const void* this_arg, LDKPublicKey their_node_id, cons
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKInit msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = Init_clone(msg);
+       msg_var = Init_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4657,8 +4495,7 @@ void handle_channel_reestablish_jcall(const void* this_arg, LDKPublicKey their_n
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKChannelReestablish msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ChannelReestablish_clone(msg);
+       msg_var = ChannelReestablish_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4676,8 +4513,7 @@ void handle_error_jcall(const void* this_arg, LDKPublicKey their_node_id, const
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKErrorMessage msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ErrorMessage_clone(msg);
+       msg_var = ErrorMessage_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4780,7 +4616,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelMessageHandler_1handle_
        LDKInitFeatures their_features_conv;
        their_features_conv.inner = (void*)(their_features & (~1));
        their_features_conv.is_owned = (their_features & 1) || (their_features == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKInitFeatures
        LDKOpenChannel msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = false;
@@ -4795,7 +4631,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelMessageHandler_1handle_
        LDKInitFeatures their_features_conv;
        their_features_conv.inner = (void*)(their_features & (~1));
        their_features_conv.is_owned = (their_features & 1) || (their_features == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKInitFeatures
        LDKAcceptChannel msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = false;
@@ -5017,8 +4853,7 @@ LDKCResult_boolLightningErrorZ handle_node_announcement_jcall(const void* this_a
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKNodeAnnouncement msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = NodeAnnouncement_clone(msg);
+       msg_var = NodeAnnouncement_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -5028,8 +4863,8 @@ LDKCResult_boolLightningErrorZ handle_node_announcement_jcall(const void* this_a
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_boolLightningErrorZ* ret = (LDKCResult_boolLightningErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->handle_node_announcement_meth, msg_ref);
-       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_boolLightningErrorZ_clone((LDKCResult_boolLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_boolLightningErrorZ handle_channel_announcement_jcall(const void* this_arg, const LDKChannelAnnouncement * msg) {
@@ -5037,8 +4872,7 @@ LDKCResult_boolLightningErrorZ handle_channel_announcement_jcall(const void* thi
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKChannelAnnouncement msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ChannelAnnouncement_clone(msg);
+       msg_var = ChannelAnnouncement_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -5048,8 +4882,8 @@ LDKCResult_boolLightningErrorZ handle_channel_announcement_jcall(const void* thi
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_boolLightningErrorZ* ret = (LDKCResult_boolLightningErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->handle_channel_announcement_meth, msg_ref);
-       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_boolLightningErrorZ_clone((LDKCResult_boolLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_boolLightningErrorZ handle_channel_update_jcall(const void* this_arg, const LDKChannelUpdate * msg) {
@@ -5057,8 +4891,7 @@ LDKCResult_boolLightningErrorZ handle_channel_update_jcall(const void* this_arg,
        JNIEnv *env;
        DO_ASSERT((*j_calls->vm)->GetEnv(j_calls->vm, (void**)&env, JNI_VERSION_1_8) == JNI_OK);
        LDKChannelUpdate msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ChannelUpdate_clone(msg);
+       msg_var = ChannelUpdate_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -5068,8 +4901,8 @@ LDKCResult_boolLightningErrorZ handle_channel_update_jcall(const void* this_arg,
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_boolLightningErrorZ* ret = (LDKCResult_boolLightningErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->handle_channel_update_meth, msg_ref);
-       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_boolLightningErrorZ_clone((LDKCResult_boolLightningErrorZ*)ret);
        return ret_conv;
 }
 void handle_htlc_fail_channel_update_jcall(const void* this_arg, const LDKHTLCFailChannelUpdate * update) {
@@ -5097,7 +4930,7 @@ LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ get_next_channel
        int64_t* arg_vals = (*env)->GetLongArrayElements (env, arg, NULL);
        for (size_t l = 0; l < arg_constr.datalen; l++) {
                int64_t arr_conv_63 = arg_vals[l];
-               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)arr_conv_63;
+               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)arr_conv_63) & ~1);
                FREE((void*)arr_conv_63);
                arg_constr.data[l] = arr_conv_63_conv;
        }
@@ -5125,8 +4958,7 @@ LDKCVec_NodeAnnouncementZ get_next_node_announcements_jcall(const void* this_arg
                LDKNodeAnnouncement arr_conv_18_conv;
                arr_conv_18_conv.inner = (void*)(arr_conv_18 & (~1));
                arr_conv_18_conv.is_owned = (arr_conv_18 & 1) || (arr_conv_18 == 0);
-               if (arr_conv_18_conv.inner != NULL)
-                       arr_conv_18_conv = NodeAnnouncement_clone(&arr_conv_18_conv);
+               arr_conv_18_conv = NodeAnnouncement_clone(&arr_conv_18_conv);
                arg_constr.data[s] = arr_conv_18_conv;
        }
        (*env)->ReleaseLongArrayElements(env, arg, arg_vals, 0);
@@ -5139,8 +4971,7 @@ void sync_routing_table_jcall(const void* this_arg, LDKPublicKey their_node_id,
        int8_tArray their_node_id_arr = (*env)->NewByteArray(env, 33);
        (*env)->SetByteArrayRegion(env, their_node_id_arr, 0, 33, their_node_id.compressed_form);
        LDKInit init_var = *init;
-       if (init->inner != NULL)
-               init_var = Init_clone(init);
+       init_var = Init_clone(init);
        CHECK((((long)init_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&init_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long init_ref = (long)init_var.inner;
@@ -5167,8 +4998,8 @@ LDKCResult_NoneLightningErrorZ handle_reply_channel_range_jcall(const void* this
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->handle_reply_channel_range_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKReplyShortChannelIdsEnd msg) {
@@ -5187,8 +5018,8 @@ LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_jcall(const vo
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->handle_reply_short_channel_ids_end_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_NoneLightningErrorZ handle_query_channel_range_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryChannelRange msg) {
@@ -5207,8 +5038,8 @@ LDKCResult_NoneLightningErrorZ handle_query_channel_range_jcall(const void* this
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->handle_query_channel_range_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryShortChannelIds msg) {
@@ -5227,8 +5058,8 @@ LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_jcall(const void*
        jobject obj = (*env)->NewLocalRef(env, j_calls->o);
        CHECK(obj != NULL);
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)(*env)->CallLongMethod(env, obj, j_calls->handle_query_short_channel_ids_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 static void* LDKRoutingMessageHandler_JCalls_clone(const void* this_arg) {
@@ -5335,9 +5166,6 @@ JNIEXPORT int64_tArray JNICALL Java_org_ldk_impl_bindings_RoutingMessageHandler_
        for (size_t l = 0; l < ret_var.datalen; l++) {
                LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* arr_conv_63_ref = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
                *arr_conv_63_ref = ret_var.data[l];
-               arr_conv_63_ref->a = ChannelAnnouncement_clone(&arr_conv_63_ref->a);
-               arr_conv_63_ref->b = ChannelUpdate_clone(&arr_conv_63_ref->b);
-               arr_conv_63_ref->c = ChannelUpdate_clone(&arr_conv_63_ref->c);
                ret_arr_ptr[l] = (long)arr_conv_63_ref;
        }
        (*env)->ReleasePrimitiveArrayCritical(env, ret_arr, ret_arr_ptr, 0);
@@ -5387,8 +5215,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_RoutingMessageHandler_1hand
        LDKReplyChannelRange msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = ReplyChannelRange_clone(&msg_conv);
+       msg_conv = ReplyChannelRange_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_reply_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -5402,8 +5229,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_RoutingMessageHandler_1hand
        LDKReplyShortChannelIdsEnd msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = ReplyShortChannelIdsEnd_clone(&msg_conv);
+       msg_conv = ReplyShortChannelIdsEnd_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_reply_short_channel_ids_end)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -5417,8 +5243,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_RoutingMessageHandler_1hand
        LDKQueryChannelRange msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = QueryChannelRange_clone(&msg_conv);
+       msg_conv = QueryChannelRange_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_query_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -5432,8 +5257,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_RoutingMessageHandler_1hand
        LDKQueryShortChannelIds msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = QueryShortChannelIds_clone(&msg_conv);
+       msg_conv = QueryShortChannelIds_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_query_short_channel_ids)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -5562,13 +5386,14 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Transaction_1free(JNIEnv *env,
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_TxOut_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKTxOut _res_conv = *(LDKTxOut*)_res;
+       if ((_res & 1) != 0) return;
+       LDKTxOut _res_conv = *(LDKTxOut*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        TxOut_free(_res_conv);
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_TxOut_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKTxOut* orig_conv = (LDKTxOut*)orig;
+       LDKTxOut* orig_conv = (LDKTxOut*)(orig & ~1);
        LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
        *ret_ref = TxOut_clone(orig_conv);
        return (long)ret_ref;
@@ -5584,7 +5409,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1SpendableOutputDescripto
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t b = 0; b < _res_constr.datalen; b++) {
                int64_t arr_conv_27 = _res_vals[b];
-               LDKSpendableOutputDescriptor arr_conv_27_conv = *(LDKSpendableOutputDescriptor*)arr_conv_27;
+               LDKSpendableOutputDescriptor arr_conv_27_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)arr_conv_27) & ~1);
                FREE((void*)arr_conv_27);
                _res_constr.data[b] = arr_conv_27_conv;
        }
@@ -5602,7 +5427,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1MessageSendEventZ_1free(
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t s = 0; s < _res_constr.datalen; s++) {
                int64_t arr_conv_18 = _res_vals[s];
-               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)arr_conv_18;
+               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)(((uint64_t)arr_conv_18) & ~1);
                FREE((void*)arr_conv_18);
                _res_constr.data[s] = arr_conv_18_conv;
        }
@@ -5620,7 +5445,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1EventZ_1free(JNIEnv *env
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t h = 0; h < _res_constr.datalen; h++) {
                int64_t arr_conv_7 = _res_vals[h];
-               LDKEvent arr_conv_7_conv = *(LDKEvent*)arr_conv_7;
+               LDKEvent arr_conv_7_conv = *(LDKEvent*)(((uint64_t)arr_conv_7) & ~1);
                FREE((void*)arr_conv_7);
                _res_constr.data[h] = arr_conv_7_conv;
        }
@@ -5629,7 +5454,8 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1EventZ_1free(JNIEnv *env
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1usizeTransactionZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_usizeTransactionZ _res_conv = *(LDKC2Tuple_usizeTransactionZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_usizeTransactionZ _res_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_usizeTransactionZ_free(_res_conv);
 }
@@ -5642,7 +5468,6 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1usizeTransactionZ_
        b_ref.data_is_owned = true;
        LDKC2Tuple_usizeTransactionZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
        *ret_ref = C2Tuple_usizeTransactionZ_new(a, b_ref);
-       // XXX: We likely need to clone here, but no _clone fn is available for byte[]
        return (long)ret_ref;
 }
 
@@ -5656,7 +5481,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1C2Tuple_1usizeTransactio
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t y = 0; y < _res_constr.datalen; y++) {
                int64_t arr_conv_24 = _res_vals[y];
-               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_24;
+               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_24) & ~1);
                FREE((void*)arr_conv_24);
                _res_constr.data[y] = arr_conv_24_conv;
        }
@@ -5678,11 +5503,19 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneChannelMonitor
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NoneChannelMonitorUpdateErrZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ _res_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneChannelMonitorUpdateErrZ _res_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneChannelMonitorUpdateErrZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneChannelMonitorUpdateErrZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NoneChannelMonitorUpdateErrZ* orig_conv = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(orig & ~1);
+       LDKCResult_NoneChannelMonitorUpdateErrZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneChannelMonitorUpdateErrZ), "LDKCResult_NoneChannelMonitorUpdateErrZ");
+       *ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1MonitorEventZ_1free(JNIEnv *env, jclass clz, int64_tArray _res) {
        LDKCVec_MonitorEventZ _res_constr;
        _res_constr.datalen = (*env)->GetArrayLength(env, _res);
@@ -5706,8 +5539,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ChannelMonitorUpda
        LDKChannelMonitorUpdate o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ChannelMonitorUpdate_clone(&o_conv);
+       o_conv = ChannelMonitorUpdate_clone(&o_conv);
        LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
        *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5717,14 +5549,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ChannelMonitorUpda
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
        *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1ChannelMonitorUpdateDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_ChannelMonitorUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ChannelMonitorUpdateDecodeErrorZ_free(_res_conv);
 }
@@ -5739,20 +5572,29 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneMonitorUpdateE
        LDKMonitorUpdateError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = MonitorUpdateError_clone(&e_conv);
        LDKCResult_NoneMonitorUpdateErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneMonitorUpdateErrorZ), "LDKCResult_NoneMonitorUpdateErrorZ");
        *ret_conv = CResult_NoneMonitorUpdateErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NoneMonitorUpdateErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NoneMonitorUpdateErrorZ _res_conv = *(LDKCResult_NoneMonitorUpdateErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneMonitorUpdateErrorZ _res_conv = *(LDKCResult_NoneMonitorUpdateErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneMonitorUpdateErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneMonitorUpdateErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NoneMonitorUpdateErrorZ* orig_conv = (LDKCResult_NoneMonitorUpdateErrorZ*)(orig & ~1);
+       LDKCResult_NoneMonitorUpdateErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneMonitorUpdateErrorZ), "LDKCResult_NoneMonitorUpdateErrorZ");
+       *ret_conv = CResult_NoneMonitorUpdateErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1OutPointScriptZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_OutPointScriptZ _res_conv = *(LDKC2Tuple_OutPointScriptZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_OutPointScriptZ _res_conv = *(LDKC2Tuple_OutPointScriptZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_OutPointScriptZ_free(_res_conv);
 }
@@ -5761,16 +5603,13 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1OutPointScriptZ_1n
        LDKOutPoint a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = OutPoint_clone(&a_conv);
+       a_conv = OutPoint_clone(&a_conv);
        LDKCVec_u8Z b_ref;
        b_ref.datalen = (*env)->GetArrayLength(env, b);
        b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
        (*env)->GetByteArrayRegion(env, b, 0, b_ref.datalen, b_ref.data);
        LDKC2Tuple_OutPointScriptZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_OutPointScriptZ), "LDKC2Tuple_OutPointScriptZ");
        *ret_ref = C2Tuple_OutPointScriptZ_new(a_conv, b_ref);
-       ret_ref->a = OutPoint_clone(&ret_ref->a);
-       ret_ref->b = CVec_u8Z_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -5793,18 +5632,25 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1TransactionZ_1free(JNIEn
        CVec_TransactionZ_free(_res_constr);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u32TxOutZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKC2Tuple_u32TxOutZ* orig_conv = (LDKC2Tuple_u32TxOutZ*)(orig & ~1);
+       LDKC2Tuple_u32TxOutZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_ref = C2Tuple_u32TxOutZ_clone(orig_conv);
+       return (long)ret_ref;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u32TxOutZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_u32TxOutZ _res_conv = *(LDKC2Tuple_u32TxOutZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_u32TxOutZ _res_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_u32TxOutZ_free(_res_conv);
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u32TxOutZ_1new(JNIEnv *env, jclass clz, int32_t a, int64_t b) {
-       LDKTxOut b_conv = *(LDKTxOut*)b;
+       LDKTxOut b_conv = *(LDKTxOut*)(((uint64_t)b) & ~1);
        FREE((void*)b);
        LDKC2Tuple_u32TxOutZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
        *ret_ref = C2Tuple_u32TxOutZ_new(a, b_conv);
-       ret_ref->b = TxOut_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -5818,7 +5664,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1C2Tuple_1u32TxOutZZ_1fre
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t a = 0; a < _res_constr.datalen; a++) {
                int64_t arr_conv_26 = _res_vals[a];
-               LDKC2Tuple_u32TxOutZ arr_conv_26_conv = *(LDKC2Tuple_u32TxOutZ*)arr_conv_26;
+               LDKC2Tuple_u32TxOutZ arr_conv_26_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_conv_26) & ~1);
                FREE((void*)arr_conv_26);
                _res_constr.data[a] = arr_conv_26_conv;
        }
@@ -5827,7 +5673,8 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1C2Tuple_1u32TxOutZZ_1fre
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1TxidCVec_1C2Tuple_1u32TxOutZZZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ _res_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ _res_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_free(_res_conv);
 }
@@ -5845,15 +5692,13 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1TxidCVec_1C2Tuple_
        int64_t* b_vals = (*env)->GetLongArrayElements (env, b, NULL);
        for (size_t a = 0; a < b_constr.datalen; a++) {
                int64_t arr_conv_26 = b_vals[a];
-               LDKC2Tuple_u32TxOutZ arr_conv_26_conv = *(LDKC2Tuple_u32TxOutZ*)arr_conv_26;
+               LDKC2Tuple_u32TxOutZ arr_conv_26_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_conv_26) & ~1);
                FREE((void*)arr_conv_26);
                b_constr.data[a] = arr_conv_26_conv;
        }
        (*env)->ReleaseLongArrayElements(env, b, b_vals, 0);
        LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ");
        *ret_ref = C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_new(a_ref, b_constr);
-       ret_ref->a = ThirtyTwoBytes_clone(&ret_ref->a);
-       ret_ref->b = CVec_C2Tuple_u32TxOutZZ_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -5867,7 +5712,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1C2Tuple_1TxidCVec_1C2Tup
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t u = 0; u < _res_constr.datalen; u++) {
                int64_t arr_conv_46 = _res_vals[u];
-               LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_conv_46_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)arr_conv_46;
+               LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_conv_46_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(((uint64_t)arr_conv_46) & ~1);
                FREE((void*)arr_conv_46);
                _res_constr.data[u] = arr_conv_46_conv;
        }
@@ -5876,7 +5721,8 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1C2Tuple_1TxidCVec_1C2Tup
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1BlockHashChannelMonitorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_BlockHashChannelMonitorZ _res_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_BlockHashChannelMonitorZ _res_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_BlockHashChannelMonitorZ_free(_res_conv);
 }
@@ -5888,16 +5734,14 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1BlockHashChannelMo
        LDKChannelMonitor b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       b_conv = ChannelMonitor_clone(&b_conv);
        LDKC2Tuple_BlockHashChannelMonitorZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_BlockHashChannelMonitorZ), "LDKC2Tuple_BlockHashChannelMonitorZ");
        *ret_ref = C2Tuple_BlockHashChannelMonitorZ_new(a_ref, b_conv);
-       ret_ref->a = ThirtyTwoBytes_clone(&ret_ref->a);
-       // XXX: We likely need to clone here, but no _clone fn is available for ChannelMonitor
        return (long)ret_ref;
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHashChannelMonitorZDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKC2Tuple_BlockHashChannelMonitorZ o_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)o;
+       LDKC2Tuple_BlockHashChannelMonitorZ o_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(o_conv);
@@ -5908,20 +5752,29 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHash
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHashChannelMonitorZDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u64u64Z_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKC2Tuple_u64u64Z* orig_conv = (LDKC2Tuple_u64u64Z*)(orig & ~1);
+       LDKC2Tuple_u64u64Z* ret_ref = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_ref = C2Tuple_u64u64Z_clone(orig_conv);
+       return (long)ret_ref;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u64u64Z_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_u64u64Z _res_conv = *(LDKC2Tuple_u64u64Z*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_u64u64Z _res_conv = *(LDKC2Tuple_u64u64Z*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_u64u64Z_free(_res_conv);
 }
@@ -5933,7 +5786,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u64u64Z_1new(JNIEn
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDescriptorDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKSpendableOutputDescriptor o_conv = *(LDKSpendableOutputDescriptor*)o;
+       LDKSpendableOutputDescriptor o_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
        *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_ok(o_conv);
@@ -5944,18 +5797,26 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDes
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
        *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDescriptorDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_SpendableOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_SpendableOutputDescriptorDecodeErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDescriptorDecodeErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(orig & ~1);
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1SignatureZ_1free(JNIEnv *env, jclass clz, jobjectArray _res) {
        LDKCVec_SignatureZ _res_constr;
        _res_constr.datalen = (*env)->GetArrayLength(env, _res);
@@ -5973,8 +5834,16 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1SignatureZ_1free(JNIEnv
        CVec_SignatureZ_free(_res_constr);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1SignatureCVec_1SignatureZZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKC2Tuple_SignatureCVec_SignatureZZ* orig_conv = (LDKC2Tuple_SignatureCVec_SignatureZZ*)(orig & ~1);
+       LDKC2Tuple_SignatureCVec_SignatureZZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_SignatureCVec_SignatureZZ), "LDKC2Tuple_SignatureCVec_SignatureZZ");
+       *ret_ref = C2Tuple_SignatureCVec_SignatureZZ_clone(orig_conv);
+       return (long)ret_ref;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1SignatureCVec_1SignatureZZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ _res_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_SignatureCVec_SignatureZZ _res_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_SignatureCVec_SignatureZZ_free(_res_conv);
 }
@@ -5998,13 +5867,11 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1SignatureCVec_1Sig
        }
        LDKC2Tuple_SignatureCVec_SignatureZZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_SignatureCVec_SignatureZZ), "LDKC2Tuple_SignatureCVec_SignatureZZ");
        *ret_ref = C2Tuple_SignatureCVec_SignatureZZ_new(a_ref, b_constr);
-       // XXX: We likely need to clone here, but no _clone fn is available for byte[]
-       // XXX: We likely need to clone here, but no _clone fn is available for byte[][]
        return (long)ret_ref;
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1SignatureCVec_1SignatureZZNoneZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ o_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)o;
+       LDKC2Tuple_SignatureCVec_SignatureZZ o_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ), "LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ");
        *ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_ok(o_conv);
@@ -6018,13 +5885,14 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1Signature
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1SignatureCVec_1SignatureZZNoneZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_free(_res_conv);
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1SignatureCVec_1SignatureZZNoneZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)orig;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(orig & ~1);
        LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ), "LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ");
        *ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone(orig_conv);
        return (long)ret_conv;
@@ -6046,58 +5914,21 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1SignatureNoneZ_1er
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1SignatureNoneZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_SignatureNoneZ _res_conv = *(LDKCResult_SignatureNoneZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_SignatureNoneZ _res_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_SignatureNoneZ_free(_res_conv);
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1SignatureNoneZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKCResult_SignatureNoneZ* orig_conv = (LDKCResult_SignatureNoneZ*)orig;
+       LDKCResult_SignatureNoneZ* orig_conv = (LDKCResult_SignatureNoneZ*)(orig & ~1);
        LDKCResult_SignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SignatureNoneZ), "LDKCResult_SignatureNoneZ");
        *ret_conv = CResult_SignatureNoneZ_clone(orig_conv);
        return (long)ret_conv;
 }
 
-JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1ok(JNIEnv *env, jclass clz, jobjectArray o) {
-       LDKCVec_SignatureZ o_constr;
-       o_constr.datalen = (*env)->GetArrayLength(env, o);
-       if (o_constr.datalen > 0)
-               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKSignature), "LDKCVec_SignatureZ Elements");
-       else
-               o_constr.data = NULL;
-       for (size_t i = 0; i < o_constr.datalen; i++) {
-               int8_tArray arr_conv_8 = (*env)->GetObjectArrayElement(env, o, i);
-               LDKSignature arr_conv_8_ref;
-               CHECK((*env)->GetArrayLength(env, arr_conv_8) == 64);
-               (*env)->GetByteArrayRegion(env, arr_conv_8, 0, 64, arr_conv_8_ref.compact_form);
-               o_constr.data[i] = arr_conv_8_ref;
-       }
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = CResult_CVec_SignatureZNoneZ_ok(o_constr);
-       return (long)ret_conv;
-}
-
-JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1err(JNIEnv *env, jclass clz) {
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = CResult_CVec_SignatureZNoneZ_err();
-       return (long)ret_conv;
-}
-
-JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_CVec_SignatureZNoneZ _res_conv = *(LDKCResult_CVec_SignatureZNoneZ*)_res;
-       FREE((void*)_res);
-       CResult_CVec_SignatureZNoneZ_free(_res_conv);
-}
-
-JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKCResult_CVec_SignatureZNoneZ* orig_conv = (LDKCResult_CVec_SignatureZNoneZ*)orig;
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = CResult_CVec_SignatureZNoneZ_clone(orig_conv);
-       return (long)ret_conv;
-}
-
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ChanKeySignerDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKChannelKeys o_conv = *(LDKChannelKeys*)o;
+       LDKChannelKeys o_conv = *(LDKChannelKeys*)(((uint64_t)o) & ~1);
        if (o_conv.free == LDKChannelKeys_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKChannelKeys_JCalls_clone(o_conv.this_arg);
@@ -6111,24 +5942,31 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ChanKeySignerDecod
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ChanKeySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChanKeySignerDecodeErrorZ), "LDKCResult_ChanKeySignerDecodeErrorZ");
        *ret_conv = CResult_ChanKeySignerDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1ChanKeySignerDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_ChanKeySignerDecodeErrorZ _res_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ChanKeySignerDecodeErrorZ _res_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ChanKeySignerDecodeErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ChanKeySignerDecodeErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_ChanKeySignerDecodeErrorZ* orig_conv = (LDKCResult_ChanKeySignerDecodeErrorZ*)(orig & ~1);
+       LDKCResult_ChanKeySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChanKeySignerDecodeErrorZ), "LDKCResult_ChanKeySignerDecodeErrorZ");
+       *ret_conv = CResult_ChanKeySignerDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1InMemoryChannelKeysDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
        LDKInMemoryChannelKeys o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = InMemoryChannelKeys_clone(&o_conv);
+       o_conv = InMemoryChannelKeys_clone(&o_conv);
        LDKCResult_InMemoryChannelKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemoryChannelKeysDecodeErrorZ), "LDKCResult_InMemoryChannelKeysDecodeErrorZ");
        *ret_conv = CResult_InMemoryChannelKeysDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6138,20 +5976,21 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1InMemoryChannelKey
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_InMemoryChannelKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemoryChannelKeysDecodeErrorZ), "LDKCResult_InMemoryChannelKeysDecodeErrorZ");
        *ret_conv = CResult_InMemoryChannelKeysDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1InMemoryChannelKeysDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_InMemoryChannelKeysDecodeErrorZ _res_conv = *(LDKCResult_InMemoryChannelKeysDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_InMemoryChannelKeysDecodeErrorZ _res_conv = *(LDKCResult_InMemoryChannelKeysDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_InMemoryChannelKeysDecodeErrorZ_free(_res_conv);
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1TxOutAccessErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKTxOut o_conv = *(LDKTxOut*)o;
+       LDKTxOut o_conv = *(LDKTxOut*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_TxOutAccessErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutAccessErrorZ), "LDKCResult_TxOutAccessErrorZ");
        *ret_conv = CResult_TxOutAccessErrorZ_ok(o_conv);
@@ -6166,11 +6005,19 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1TxOutAccessErrorZ_
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1TxOutAccessErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_TxOutAccessErrorZ _res_conv = *(LDKCResult_TxOutAccessErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_TxOutAccessErrorZ _res_conv = *(LDKCResult_TxOutAccessErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_TxOutAccessErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1TxOutAccessErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_TxOutAccessErrorZ* orig_conv = (LDKCResult_TxOutAccessErrorZ*)(orig & ~1);
+       LDKCResult_TxOutAccessErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutAccessErrorZ), "LDKCResult_TxOutAccessErrorZ");
+       *ret_conv = CResult_TxOutAccessErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneAPIErrorZ_1ok(JNIEnv *env, jclass clz) {
        LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
        *ret_conv = CResult_NoneAPIErrorZ_ok();
@@ -6178,7 +6025,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneAPIErrorZ_1ok(
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneAPIErrorZ_1err(JNIEnv *env, jclass clz, int64_t e) {
-       LDKAPIError e_conv = *(LDKAPIError*)e;
+       LDKAPIError e_conv = *(LDKAPIError*)(((uint64_t)e) & ~1);
        FREE((void*)e);
        LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
        *ret_conv = CResult_NoneAPIErrorZ_err(e_conv);
@@ -6186,7 +6033,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneAPIErrorZ_1err
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NoneAPIErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NoneAPIErrorZ _res_conv = *(LDKCResult_NoneAPIErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneAPIErrorZ _res_conv = *(LDKCResult_NoneAPIErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneAPIErrorZ_free(_res_conv);
 }
@@ -6220,18 +6068,26 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NonePaymentSendFai
        LDKPaymentSendFailure e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PaymentSendFailure_clone(&e_conv);
        LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
        *ret_conv = CResult_NonePaymentSendFailureZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NonePaymentSendFailureZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NonePaymentSendFailureZ _res_conv = *(LDKCResult_NonePaymentSendFailureZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NonePaymentSendFailureZ _res_conv = *(LDKCResult_NonePaymentSendFailureZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NonePaymentSendFailureZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NonePaymentSendFailureZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NonePaymentSendFailureZ* orig_conv = (LDKCResult_NonePaymentSendFailureZ*)(orig & ~1);
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1NetAddressZ_1free(JNIEnv *env, jclass clz, int64_tArray _res) {
        LDKCVec_NetAddressZ _res_constr;
        _res_constr.datalen = (*env)->GetArrayLength(env, _res);
@@ -6242,7 +6098,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1NetAddressZ_1free(JNIEnv
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t m = 0; m < _res_constr.datalen; m++) {
                int64_t arr_conv_12 = _res_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                _res_constr.data[m] = arr_conv_12_conv;
        }
@@ -6270,7 +6126,8 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1ChannelMonitorZ_1free(JN
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C2Tuple_1BlockHashChannelManagerZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC2Tuple_BlockHashChannelManagerZ _res_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_BlockHashChannelManagerZ _res_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_BlockHashChannelManagerZ_free(_res_conv);
 }
@@ -6282,16 +6139,14 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1BlockHashChannelMa
        LDKChannelManager b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelManager
        LDKC2Tuple_BlockHashChannelManagerZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_BlockHashChannelManagerZ), "LDKC2Tuple_BlockHashChannelManagerZ");
        *ret_ref = C2Tuple_BlockHashChannelManagerZ_new(a_ref, b_conv);
-       ret_ref->a = ThirtyTwoBytes_clone(&ret_ref->a);
-       // XXX: We likely need to clone here, but no _clone fn is available for ChannelManager
        return (long)ret_ref;
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHashChannelManagerZDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKC2Tuple_BlockHashChannelManagerZ o_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)o;
+       LDKC2Tuple_BlockHashChannelManagerZ o_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(o_conv);
@@ -6302,20 +6157,21 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHash
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHashChannelManagerZDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_free(_res_conv);
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NetAddressu8Z_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKNetAddress o_conv = *(LDKNetAddress*)o;
+       LDKNetAddress o_conv = *(LDKNetAddress*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_NetAddressu8Z* ret_conv = MALLOC(sizeof(LDKCResult_NetAddressu8Z), "LDKCResult_NetAddressu8Z");
        *ret_conv = CResult_NetAddressu8Z_ok(o_conv);
@@ -6329,13 +6185,21 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NetAddressu8Z_1err
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NetAddressu8Z_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NetAddressu8Z _res_conv = *(LDKCResult_NetAddressu8Z*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NetAddressu8Z _res_conv = *(LDKCResult_NetAddressu8Z*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NetAddressu8Z_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NetAddressu8Z_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NetAddressu8Z* orig_conv = (LDKCResult_NetAddressu8Z*)(orig & ~1);
+       LDKCResult_NetAddressu8Z* ret_conv = MALLOC(sizeof(LDKCResult_NetAddressu8Z), "LDKCResult_NetAddressu8Z");
+       *ret_conv = CResult_NetAddressu8Z_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CResult_1NetAddressu8ZDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
-       LDKCResult_NetAddressu8Z o_conv = *(LDKCResult_NetAddressu8Z*)o;
+       LDKCResult_NetAddressu8Z o_conv = *(LDKCResult_NetAddressu8Z*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_CResult_NetAddressu8ZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ), "LDKCResult_CResult_NetAddressu8ZDecodeErrorZ");
        *ret_conv = CResult_CResult_NetAddressu8ZDecodeErrorZ_ok(o_conv);
@@ -6346,14 +6210,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CResult_1NetAddres
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_CResult_NetAddressu8ZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ), "LDKCResult_CResult_NetAddressu8ZDecodeErrorZ");
        *ret_conv = CResult_CResult_NetAddressu8ZDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1CResult_1NetAddressu8ZDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ _res_conv = *(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ _res_conv = *(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_CResult_NetAddressu8ZDecodeErrorZ_free(_res_conv);
 }
@@ -6460,20 +6325,29 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1boolLightningError
        LDKLightningError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = LightningError_clone(&e_conv);
        LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
        *ret_conv = CResult_boolLightningErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1boolLightningErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_boolLightningErrorZ _res_conv = *(LDKCResult_boolLightningErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_boolLightningErrorZ _res_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_boolLightningErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1boolLightningErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_boolLightningErrorZ* orig_conv = (LDKCResult_boolLightningErrorZ*)(orig & ~1);
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_C3Tuple_1ChannelAnnouncementChannelUpdateChannelUpdateZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(_res_conv);
 }
@@ -6482,23 +6356,17 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C3Tuple_1ChannelAnnouncemen
        LDKChannelAnnouncement a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = ChannelAnnouncement_clone(&a_conv);
+       a_conv = ChannelAnnouncement_clone(&a_conv);
        LDKChannelUpdate b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       if (b_conv.inner != NULL)
-               b_conv = ChannelUpdate_clone(&b_conv);
+       b_conv = ChannelUpdate_clone(&b_conv);
        LDKChannelUpdate c_conv;
        c_conv.inner = (void*)(c & (~1));
        c_conv.is_owned = (c & 1) || (c == 0);
-       if (c_conv.inner != NULL)
-               c_conv = ChannelUpdate_clone(&c_conv);
+       c_conv = ChannelUpdate_clone(&c_conv);
        LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_ref = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
        *ret_ref = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(a_conv, b_conv, c_conv);
-       ret_ref->a = ChannelAnnouncement_clone(&ret_ref->a);
-       ret_ref->b = ChannelUpdate_clone(&ret_ref->b);
-       ret_ref->c = ChannelUpdate_clone(&ret_ref->c);
        return (long)ret_ref;
 }
 
@@ -6512,7 +6380,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1C3Tuple_1ChannelAnnounce
        int64_t* _res_vals = (*env)->GetLongArrayElements (env, _res, NULL);
        for (size_t l = 0; l < _res_constr.datalen; l++) {
                int64_t arr_conv_63 = _res_vals[l];
-               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)arr_conv_63;
+               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)arr_conv_63) & ~1);
                FREE((void*)arr_conv_63);
                _res_constr.data[l] = arr_conv_63_conv;
        }
@@ -6549,24 +6417,31 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneLightningError
        LDKLightningError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = LightningError_clone(&e_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = CResult_NoneLightningErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NoneLightningErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NoneLightningErrorZ _res_conv = *(LDKCResult_NoneLightningErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneLightningErrorZ _res_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneLightningErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NoneLightningErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NoneLightningErrorZ* orig_conv = (LDKCResult_NoneLightningErrorZ*)(orig & ~1);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ChannelReestablishDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
        LDKChannelReestablish o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ChannelReestablish_clone(&o_conv);
+       o_conv = ChannelReestablish_clone(&o_conv);
        LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
        *ret_conv = CResult_ChannelReestablishDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6576,14 +6451,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ChannelReestablish
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
        *ret_conv = CResult_ChannelReestablishDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1ChannelReestablishDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_ChannelReestablishDecodeErrorZ _res_conv = *(LDKCResult_ChannelReestablishDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ChannelReestablishDecodeErrorZ _res_conv = *(LDKCResult_ChannelReestablishDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ChannelReestablishDecodeErrorZ_free(_res_conv);
 }
@@ -6592,8 +6468,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1InitDecodeErrorZ_1
        LDKInit o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Init_clone(&o_conv);
+       o_conv = Init_clone(&o_conv);
        LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
        *ret_conv = CResult_InitDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6603,14 +6478,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1InitDecodeErrorZ_1
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
        *ret_conv = CResult_InitDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1InitDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_InitDecodeErrorZ _res_conv = *(LDKCResult_InitDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_InitDecodeErrorZ _res_conv = *(LDKCResult_InitDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_InitDecodeErrorZ_free(_res_conv);
 }
@@ -6619,8 +6495,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1PingDecodeErrorZ_1
        LDKPing o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Ping_clone(&o_conv);
+       o_conv = Ping_clone(&o_conv);
        LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
        *ret_conv = CResult_PingDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6630,14 +6505,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1PingDecodeErrorZ_1
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
        *ret_conv = CResult_PingDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1PingDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_PingDecodeErrorZ _res_conv = *(LDKCResult_PingDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_PingDecodeErrorZ _res_conv = *(LDKCResult_PingDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_PingDecodeErrorZ_free(_res_conv);
 }
@@ -6646,8 +6522,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1PongDecodeErrorZ_1
        LDKPong o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Pong_clone(&o_conv);
+       o_conv = Pong_clone(&o_conv);
        LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
        *ret_conv = CResult_PongDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6657,14 +6532,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1PongDecodeErrorZ_1
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
        *ret_conv = CResult_PongDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1PongDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_PongDecodeErrorZ _res_conv = *(LDKCResult_PongDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_PongDecodeErrorZ _res_conv = *(LDKCResult_PongDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_PongDecodeErrorZ_free(_res_conv);
 }
@@ -6673,8 +6549,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedChannelAnn
        LDKUnsignedChannelAnnouncement o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = UnsignedChannelAnnouncement_clone(&o_conv);
+       o_conv = UnsignedChannelAnnouncement_clone(&o_conv);
        LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6684,14 +6559,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedChannelAnn
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedChannelAnnouncementDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_UnsignedChannelAnnouncementDecodeErrorZ_free(_res_conv);
 }
@@ -6700,8 +6576,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedChannelUpd
        LDKUnsignedChannelUpdate o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = UnsignedChannelUpdate_clone(&o_conv);
+       o_conv = UnsignedChannelUpdate_clone(&o_conv);
        LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6711,14 +6586,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedChannelUpd
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedChannelUpdateDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_UnsignedChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_UnsignedChannelUpdateDecodeErrorZ_free(_res_conv);
 }
@@ -6727,8 +6603,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ErrorMessageDecode
        LDKErrorMessage o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ErrorMessage_clone(&o_conv);
+       o_conv = ErrorMessage_clone(&o_conv);
        LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
        *ret_conv = CResult_ErrorMessageDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6738,14 +6613,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ErrorMessageDecode
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
        *ret_conv = CResult_ErrorMessageDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1ErrorMessageDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_ErrorMessageDecodeErrorZ _res_conv = *(LDKCResult_ErrorMessageDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ErrorMessageDecodeErrorZ _res_conv = *(LDKCResult_ErrorMessageDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ErrorMessageDecodeErrorZ_free(_res_conv);
 }
@@ -6754,8 +6630,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedNodeAnnoun
        LDKUnsignedNodeAnnouncement o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = UnsignedNodeAnnouncement_clone(&o_conv);
+       o_conv = UnsignedNodeAnnouncement_clone(&o_conv);
        LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6765,14 +6640,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedNodeAnnoun
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1UnsignedNodeAnnouncementDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_UnsignedNodeAnnouncementDecodeErrorZ_free(_res_conv);
 }
@@ -6781,8 +6657,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1QueryShortChannelI
        LDKQueryShortChannelIds o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = QueryShortChannelIds_clone(&o_conv);
+       o_conv = QueryShortChannelIds_clone(&o_conv);
        LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
        *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6792,14 +6667,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1QueryShortChannelI
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
        *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1QueryShortChannelIdsDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_QueryShortChannelIdsDecodeErrorZ _res_conv = *(LDKCResult_QueryShortChannelIdsDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ _res_conv = *(LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_QueryShortChannelIdsDecodeErrorZ_free(_res_conv);
 }
@@ -6808,8 +6684,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ReplyShortChannelI
        LDKReplyShortChannelIdsEnd o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ReplyShortChannelIdsEnd_clone(&o_conv);
+       o_conv = ReplyShortChannelIdsEnd_clone(&o_conv);
        LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
        *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6819,14 +6694,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ReplyShortChannelI
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
        *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1ReplyShortChannelIdsEndDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ _res_conv = *(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ _res_conv = *(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ReplyShortChannelIdsEndDecodeErrorZ_free(_res_conv);
 }
@@ -6835,8 +6711,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1QueryChannelRangeD
        LDKQueryChannelRange o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = QueryChannelRange_clone(&o_conv);
+       o_conv = QueryChannelRange_clone(&o_conv);
        LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
        *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6846,14 +6721,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1QueryChannelRangeD
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
        *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1QueryChannelRangeDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_QueryChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_QueryChannelRangeDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_QueryChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_QueryChannelRangeDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_QueryChannelRangeDecodeErrorZ_free(_res_conv);
 }
@@ -6862,8 +6738,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ReplyChannelRangeD
        LDKReplyChannelRange o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ReplyChannelRange_clone(&o_conv);
+       o_conv = ReplyChannelRange_clone(&o_conv);
        LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
        *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6873,14 +6748,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1ReplyChannelRangeD
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
        *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1ReplyChannelRangeDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_ReplyChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_ReplyChannelRangeDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_ReplyChannelRangeDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ReplyChannelRangeDecodeErrorZ_free(_res_conv);
 }
@@ -6889,8 +6765,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1GossipTimestampFil
        LDKGossipTimestampFilter o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = GossipTimestampFilter_clone(&o_conv);
+       o_conv = GossipTimestampFilter_clone(&o_conv);
        LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
        *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6900,14 +6775,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1GossipTimestampFil
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
        *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1GossipTimestampFilterDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_GossipTimestampFilterDecodeErrorZ _res_conv = *(LDKCResult_GossipTimestampFilterDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ _res_conv = *(LDKCResult_GossipTimestampFilterDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_GossipTimestampFilterDecodeErrorZ_free(_res_conv);
 }
@@ -6951,18 +6827,26 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1u8ZPeerHandl
        LDKPeerHandleError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PeerHandleError_clone(&e_conv);
        LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
        *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1u8ZPeerHandleErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_CVec_u8ZPeerHandleErrorZ _res_conv = *(LDKCResult_CVec_u8ZPeerHandleErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_CVec_u8ZPeerHandleErrorZ _res_conv = *(LDKCResult_CVec_u8ZPeerHandleErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_CVec_u8ZPeerHandleErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1u8ZPeerHandleErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* orig_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)(orig & ~1);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NonePeerHandleErrorZ_1ok(JNIEnv *env, jclass clz) {
        LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
        *ret_conv = CResult_NonePeerHandleErrorZ_ok();
@@ -6973,18 +6857,26 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NonePeerHandleErro
        LDKPeerHandleError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PeerHandleError_clone(&e_conv);
        LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
        *ret_conv = CResult_NonePeerHandleErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NonePeerHandleErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NonePeerHandleErrorZ _res_conv = *(LDKCResult_NonePeerHandleErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NonePeerHandleErrorZ _res_conv = *(LDKCResult_NonePeerHandleErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NonePeerHandleErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NonePeerHandleErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NonePeerHandleErrorZ* orig_conv = (LDKCResult_NonePeerHandleErrorZ*)(orig & ~1);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1boolPeerHandleErrorZ_1ok(JNIEnv *env, jclass clz, jboolean o) {
        LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
        *ret_conv = CResult_boolPeerHandleErrorZ_ok(o);
@@ -6995,18 +6887,26 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1boolPeerHandleErro
        LDKPeerHandleError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PeerHandleError_clone(&e_conv);
        LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
        *ret_conv = CResult_boolPeerHandleErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1boolPeerHandleErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_boolPeerHandleErrorZ _res_conv = *(LDKCResult_boolPeerHandleErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_boolPeerHandleErrorZ _res_conv = *(LDKCResult_boolPeerHandleErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_boolPeerHandleErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1boolPeerHandleErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_boolPeerHandleErrorZ* orig_conv = (LDKCResult_boolPeerHandleErrorZ*)(orig & ~1);
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1SecretKeySecpErrorZ_1ok(JNIEnv *env, jclass clz, int8_tArray o) {
        LDKSecretKey o_ref;
        CHECK((*env)->GetArrayLength(env, o) == 32);
@@ -7024,7 +6924,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1SecretKeySecpError
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1SecretKeySecpErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_SecretKeySecpErrorZ _res_conv = *(LDKCResult_SecretKeySecpErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_SecretKeySecpErrorZ _res_conv = *(LDKCResult_SecretKeySecpErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_SecretKeySecpErrorZ_free(_res_conv);
 }
@@ -7046,7 +6947,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1PublicKeySecpError
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1PublicKeySecpErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_PublicKeySecpErrorZ _res_conv = *(LDKCResult_PublicKeySecpErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_PublicKeySecpErrorZ _res_conv = *(LDKCResult_PublicKeySecpErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_PublicKeySecpErrorZ_free(_res_conv);
 }
@@ -7055,8 +6957,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1TxCreationKeysSecp
        LDKTxCreationKeys o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = TxCreationKeys_clone(&o_conv);
+       o_conv = TxCreationKeys_clone(&o_conv);
        LDKCResult_TxCreationKeysSecpErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysSecpErrorZ), "LDKCResult_TxCreationKeysSecpErrorZ");
        *ret_conv = CResult_TxCreationKeysSecpErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -7070,7 +6971,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1TxCreationKeysSecp
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1TxCreationKeysSecpErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_TxCreationKeysSecpErrorZ _res_conv = *(LDKCResult_TxCreationKeysSecpErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_TxCreationKeysSecpErrorZ _res_conv = *(LDKCResult_TxCreationKeysSecpErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_TxCreationKeysSecpErrorZ_free(_res_conv);
 }
@@ -7079,7 +6981,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1TrustedCommitmentT
        LDKTrustedCommitmentTransaction o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKTrustedCommitmentTransaction
        LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
        *ret_conv = CResult_TrustedCommitmentTransactionNoneZ_ok(o_conv);
        return (long)ret_conv;
@@ -7092,11 +6994,51 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1TrustedCommitmentT
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1TrustedCommitmentTransactionNoneZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_TrustedCommitmentTransactionNoneZ _res_conv = *(LDKCResult_TrustedCommitmentTransactionNoneZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_TrustedCommitmentTransactionNoneZ _res_conv = *(LDKCResult_TrustedCommitmentTransactionNoneZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_TrustedCommitmentTransactionNoneZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1ok(JNIEnv *env, jclass clz, jobjectArray o) {
+       LDKCVec_SignatureZ o_constr;
+       o_constr.datalen = (*env)->GetArrayLength(env, o);
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKSignature), "LDKCVec_SignatureZ Elements");
+       else
+               o_constr.data = NULL;
+       for (size_t i = 0; i < o_constr.datalen; i++) {
+               int8_tArray arr_conv_8 = (*env)->GetObjectArrayElement(env, o, i);
+               LDKSignature arr_conv_8_ref;
+               CHECK((*env)->GetArrayLength(env, arr_conv_8) == 64);
+               (*env)->GetByteArrayRegion(env, arr_conv_8, 0, 64, arr_conv_8_ref.compact_form);
+               o_constr.data[i] = arr_conv_8_ref;
+       }
+       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
+       *ret_conv = CResult_CVec_SignatureZNoneZ_ok(o_constr);
+       return (long)ret_conv;
+}
+
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1err(JNIEnv *env, jclass clz) {
+       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
+       *ret_conv = CResult_CVec_SignatureZNoneZ_err();
+       return (long)ret_conv;
+}
+
+JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
+       if ((_res & 1) != 0) return;
+       LDKCResult_CVec_SignatureZNoneZ _res_conv = *(LDKCResult_CVec_SignatureZNoneZ*)(((uint64_t)_res) & ~1);
+       FREE((void*)_res);
+       CResult_CVec_SignatureZNoneZ_free(_res_conv);
+}
+
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_CVec_SignatureZNoneZ* orig_conv = (LDKCResult_CVec_SignatureZNoneZ*)(orig & ~1);
+       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
+       *ret_conv = CResult_CVec_SignatureZNoneZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1RouteHopZ_1free(JNIEnv *env, jclass clz, int64_tArray _res) {
        LDKCVec_RouteHopZ _res_constr;
        _res_constr.datalen = (*env)->GetArrayLength(env, _res);
@@ -7149,8 +7091,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1RouteDecodeErrorZ_
        LDKRoute o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Route_clone(&o_conv);
+       o_conv = Route_clone(&o_conv);
        LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
        *ret_conv = CResult_RouteDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -7160,14 +7101,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1RouteDecodeErrorZ_
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
        *ret_conv = CResult_RouteDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1RouteDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_RouteDecodeErrorZ _res_conv = *(LDKCResult_RouteDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_RouteDecodeErrorZ _res_conv = *(LDKCResult_RouteDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_RouteDecodeErrorZ_free(_res_conv);
 }
@@ -7195,8 +7137,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1RouteLightningErro
        LDKRoute o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Route_clone(&o_conv);
+       o_conv = Route_clone(&o_conv);
        LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
        *ret_conv = CResult_RouteLightningErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -7206,14 +7147,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1RouteLightningErro
        LDKLightningError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = LightningError_clone(&e_conv);
        LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
        *ret_conv = CResult_RouteLightningErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1RouteLightningErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_RouteLightningErrorZ _res_conv = *(LDKCResult_RouteLightningErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_RouteLightningErrorZ _res_conv = *(LDKCResult_RouteLightningErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_RouteLightningErrorZ_free(_res_conv);
 }
@@ -7222,8 +7164,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1RoutingFeesDecodeE
        LDKRoutingFees o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = RoutingFees_clone(&o_conv);
+       o_conv = RoutingFees_clone(&o_conv);
        LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
        *ret_conv = CResult_RoutingFeesDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -7233,14 +7174,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1RoutingFeesDecodeE
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
        *ret_conv = CResult_RoutingFeesDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1RoutingFeesDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_RoutingFeesDecodeErrorZ _res_conv = *(LDKCResult_RoutingFeesDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_RoutingFeesDecodeErrorZ _res_conv = *(LDKCResult_RoutingFeesDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_RoutingFeesDecodeErrorZ_free(_res_conv);
 }
@@ -7249,7 +7191,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NodeAnnouncementIn
        LDKNodeAnnouncementInfo o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       o_conv = NodeAnnouncementInfo_clone(&o_conv);
        LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
        *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -7259,23 +7201,31 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NodeAnnouncementIn
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
        *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NodeAnnouncementInfoDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NodeAnnouncementInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NodeAnnouncementInfoDecodeErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NodeAnnouncementInfoDecodeErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(orig & ~1);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NodeInfoDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
        LDKNodeInfo o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       o_conv = NodeInfo_clone(&o_conv);
        LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
        *ret_conv = CResult_NodeInfoDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -7285,23 +7235,31 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NodeInfoDecodeErro
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
        *ret_conv = CResult_NodeInfoDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NodeInfoDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NodeInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeInfoDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NodeInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeInfoDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NodeInfoDecodeErrorZ_free(_res_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NodeInfoDecodeErrorZ_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKCResult_NodeInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeInfoDecodeErrorZ*)(orig & ~1);
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NetworkGraphDecodeErrorZ_1ok(JNIEnv *env, jclass clz, int64_t o) {
        LDKNetworkGraph o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNetworkGraph
        LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
        *ret_conv = CResult_NetworkGraphDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -7311,20 +7269,22 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CResult_1NetworkGraphDecode
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
        *ret_conv = CResult_NetworkGraphDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NetworkGraphDecodeErrorZ_1free(JNIEnv *env, jclass clz, int64_t _res) {
-       LDKCResult_NetworkGraphDecodeErrorZ _res_conv = *(LDKCResult_NetworkGraphDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NetworkGraphDecodeErrorZ _res_conv = *(LDKCResult_NetworkGraphDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NetworkGraphDecodeErrorZ_free(_res_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Event_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKEvent this_ptr_conv = *(LDKEvent*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKEvent this_ptr_conv = *(LDKEvent*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Event_free(this_ptr_conv);
 }
@@ -7347,7 +7307,8 @@ JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_Event_1write(JNIEnv *en
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MessageSendEvent_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKMessageSendEvent this_ptr_conv = *(LDKMessageSendEvent*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKMessageSendEvent this_ptr_conv = *(LDKMessageSendEvent*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        MessageSendEvent_free(this_ptr_conv);
 }
@@ -7361,19 +7322,22 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_MessageSendEvent_1clone(JNI
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MessageSendEventsProvider_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKMessageSendEventsProvider this_ptr_conv = *(LDKMessageSendEventsProvider*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKMessageSendEventsProvider this_ptr_conv = *(LDKMessageSendEventsProvider*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        MessageSendEventsProvider_free(this_ptr_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_EventsProvider_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKEventsProvider this_ptr_conv = *(LDKEventsProvider*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKEventsProvider this_ptr_conv = *(LDKEventsProvider*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        EventsProvider_free(this_ptr_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_APIError_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKAPIError this_ptr_conv = *(LDKAPIError*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKAPIError this_ptr_conv = *(LDKAPIError*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        APIError_free(this_ptr_conv);
 }
@@ -7387,7 +7351,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_APIError_1clone(JNIEnv *env
 }
 
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_Level_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKLevel* orig_conv = (LDKLevel*)orig;
+       LDKLevel* orig_conv = (LDKLevel*)(orig & ~1);
        jclass ret_conv = LDKLevel_to_java(env, Level_clone(orig_conv));
        return ret_conv;
 }
@@ -7398,7 +7362,8 @@ JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_Level_1max(JNIEnv *env, jcla
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Logger_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKLogger this_ptr_conv = *(LDKLogger*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKLogger this_ptr_conv = *(LDKLogger*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Logger_free(this_ptr_conv);
 }
@@ -7840,8 +7805,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_UserConfig_1set_1own_1channel_
        LDKChannelHandshakeConfig val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelHandshakeConfig_clone(&val_conv);
+       val_conv = ChannelHandshakeConfig_clone(&val_conv);
        UserConfig_set_own_channel_config(&this_ptr_conv, val_conv);
 }
 
@@ -7866,8 +7830,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_UserConfig_1set_1peer_1channel
        LDKChannelHandshakeLimits val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelHandshakeLimits_clone(&val_conv);
+       val_conv = ChannelHandshakeLimits_clone(&val_conv);
        UserConfig_set_peer_channel_config_limits(&this_ptr_conv, val_conv);
 }
 
@@ -7892,8 +7855,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_UserConfig_1set_1channel_1opti
        LDKChannelConfig val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelConfig_clone(&val_conv);
+       val_conv = ChannelConfig_clone(&val_conv);
        UserConfig_set_channel_options(&this_ptr_conv, val_conv);
 }
 
@@ -7901,18 +7863,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_UserConfig_1new(JNIEnv *env
        LDKChannelHandshakeConfig own_channel_config_arg_conv;
        own_channel_config_arg_conv.inner = (void*)(own_channel_config_arg & (~1));
        own_channel_config_arg_conv.is_owned = (own_channel_config_arg & 1) || (own_channel_config_arg == 0);
-       if (own_channel_config_arg_conv.inner != NULL)
-               own_channel_config_arg_conv = ChannelHandshakeConfig_clone(&own_channel_config_arg_conv);
+       own_channel_config_arg_conv = ChannelHandshakeConfig_clone(&own_channel_config_arg_conv);
        LDKChannelHandshakeLimits peer_channel_config_limits_arg_conv;
        peer_channel_config_limits_arg_conv.inner = (void*)(peer_channel_config_limits_arg & (~1));
        peer_channel_config_limits_arg_conv.is_owned = (peer_channel_config_limits_arg & 1) || (peer_channel_config_limits_arg == 0);
-       if (peer_channel_config_limits_arg_conv.inner != NULL)
-               peer_channel_config_limits_arg_conv = ChannelHandshakeLimits_clone(&peer_channel_config_limits_arg_conv);
+       peer_channel_config_limits_arg_conv = ChannelHandshakeLimits_clone(&peer_channel_config_limits_arg_conv);
        LDKChannelConfig channel_options_arg_conv;
        channel_options_arg_conv.inner = (void*)(channel_options_arg & (~1));
        channel_options_arg_conv.is_owned = (channel_options_arg & 1) || (channel_options_arg == 0);
-       if (channel_options_arg_conv.inner != NULL)
-               channel_options_arg_conv = ChannelConfig_clone(&channel_options_arg_conv);
+       channel_options_arg_conv = ChannelConfig_clone(&channel_options_arg_conv);
        LDKUserConfig ret_var = UserConfig_new(own_channel_config_arg_conv, peer_channel_config_limits_arg_conv, channel_options_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -7935,43 +7894,48 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_UserConfig_1default(JNIEnv
 }
 
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_AccessError_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKAccessError* orig_conv = (LDKAccessError*)orig;
+       LDKAccessError* orig_conv = (LDKAccessError*)(orig & ~1);
        jclass ret_conv = LDKAccessError_to_java(env, AccessError_clone(orig_conv));
        return ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Access_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKAccess this_ptr_conv = *(LDKAccess*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKAccess this_ptr_conv = *(LDKAccess*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Access_free(this_ptr_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Watch_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKWatch this_ptr_conv = *(LDKWatch*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKWatch this_ptr_conv = *(LDKWatch*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Watch_free(this_ptr_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Filter_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKFilter this_ptr_conv = *(LDKFilter*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKFilter this_ptr_conv = *(LDKFilter*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Filter_free(this_ptr_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_BroadcasterInterface_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKBroadcasterInterface this_ptr_conv = *(LDKBroadcasterInterface*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKBroadcasterInterface this_ptr_conv = *(LDKBroadcasterInterface*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        BroadcasterInterface_free(this_ptr_conv);
 }
 
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_ConfirmationTarget_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKConfirmationTarget* orig_conv = (LDKConfirmationTarget*)orig;
+       LDKConfirmationTarget* orig_conv = (LDKConfirmationTarget*)(orig & ~1);
        jclass ret_conv = LDKConfirmationTarget_to_java(env, ConfirmationTarget_clone(orig_conv));
        return ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_FeeEstimator_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKFeeEstimator this_ptr_conv = *(LDKFeeEstimator*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKFeeEstimator this_ptr_conv = *(LDKFeeEstimator*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        FeeEstimator_free(this_ptr_conv);
 }
@@ -8000,7 +7964,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChainMonitor_1block_1connected
        int64_t* txdata_vals = (*env)->GetLongArrayElements (env, txdata, NULL);
        for (size_t y = 0; y < txdata_constr.datalen; y++) {
                int64_t arr_conv_24 = txdata_vals[y];
-               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_24;
+               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_24) & ~1);
                FREE((void*)arr_conv_24);
                txdata_constr.data[y] = arr_conv_24_conv;
        }
@@ -8021,22 +7985,22 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChainMonitor_1block_1disconnec
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChainMonitor_1new(JNIEnv *env, jclass clz, int64_t chain_source, int64_t broadcaster, int64_t logger, int64_t feeest, int64_t persister) {
        LDKFilter* chain_source_conv = (LDKFilter*)chain_source;
-       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)broadcaster;
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)broadcaster) & ~1);
        if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKBroadcasterInterface_JCalls_clone(broadcaster_conv.this_arg);
        }
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
        }
-       LDKFeeEstimator feeest_conv = *(LDKFeeEstimator*)feeest;
+       LDKFeeEstimator feeest_conv = *(LDKFeeEstimator*)(((uint64_t)feeest) & ~1);
        if (feeest_conv.free == LDKFeeEstimator_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKFeeEstimator_JCalls_clone(feeest_conv.this_arg);
        }
-       LDKPersist persister_conv = *(LDKPersist*)persister;
+       LDKPersist persister_conv = *(LDKPersist*)(((uint64_t)persister) & ~1);
        if (persister_conv.free == LDKPersist_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKPersist_JCalls_clone(persister_conv.this_arg);
@@ -8127,7 +8091,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelMonitorUpdate_1read(
 }
 
 JNIEXPORT jclass JNICALL Java_org_ldk_impl_bindings_ChannelMonitorUpdateErr_1clone(JNIEnv *env, jclass clz, int64_t orig) {
-       LDKChannelMonitorUpdateErr* orig_conv = (LDKChannelMonitorUpdateErr*)orig;
+       LDKChannelMonitorUpdateErr* orig_conv = (LDKChannelMonitorUpdateErr*)(orig & ~1);
        jclass ret_conv = LDKChannelMonitorUpdateErr_to_java(env, ChannelMonitorUpdateErr_clone(orig_conv));
        return ret_conv;
 }
@@ -8139,6 +8103,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MonitorUpdateError_1free(JNIEn
        MonitorUpdateError_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_MonitorUpdateError_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKMonitorUpdateError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKMonitorUpdateError ret_var = MonitorUpdateError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MonitorEvent_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
        LDKMonitorEvent this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -8214,6 +8192,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1free(JNIEnv *e
        ChannelMonitor_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKChannelMonitor orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKChannelMonitor ret_var = ChannelMonitor_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT int8_tArray JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1write(JNIEnv *env, jclass clz, int64_t obj) {
        LDKChannelMonitor obj_conv;
        obj_conv.inner = (void*)(obj & (~1));
@@ -8254,8 +8246,6 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1get_1fundin
        this_arg_conv.is_owned = false;
        LDKC2Tuple_OutPointScriptZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_OutPointScriptZ), "LDKC2Tuple_OutPointScriptZ");
        *ret_ref = ChannelMonitor_get_funding_txo(&this_arg_conv);
-       ret_ref->a = OutPoint_clone(&ret_ref->a);
-       ret_ref->b = CVec_u8Z_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -8335,22 +8325,22 @@ JNIEXPORT int64_tArray JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1block_
        int64_t* txdata_vals = (*env)->GetLongArrayElements (env, txdata, NULL);
        for (size_t y = 0; y < txdata_constr.datalen; y++) {
                int64_t arr_conv_24 = txdata_vals[y];
-               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_24;
+               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_24) & ~1);
                FREE((void*)arr_conv_24);
                txdata_constr.data[y] = arr_conv_24_conv;
        }
        (*env)->ReleaseLongArrayElements(env, txdata, txdata_vals, 0);
-       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)broadcaster;
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)broadcaster) & ~1);
        if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKBroadcasterInterface_JCalls_clone(broadcaster_conv.this_arg);
        }
-       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)fee_estimator;
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(((uint64_t)fee_estimator) & ~1);
        if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKFeeEstimator_JCalls_clone(fee_estimator_conv.this_arg);
        }
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
@@ -8361,8 +8351,6 @@ JNIEXPORT int64_tArray JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1block_
        for (size_t u = 0; u < ret_var.datalen; u++) {
                LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ* arr_conv_46_ref = MALLOC(sizeof(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ");
                *arr_conv_46_ref = ret_var.data[u];
-               arr_conv_46_ref->a = ThirtyTwoBytes_clone(&arr_conv_46_ref->a);
-               arr_conv_46_ref->b = CVec_C2Tuple_u32TxOutZZ_clone(&arr_conv_46_ref->b);
                ret_arr_ptr[u] = (long)arr_conv_46_ref;
        }
        (*env)->ReleasePrimitiveArrayCritical(env, ret_arr, ret_arr_ptr, 0);
@@ -8378,17 +8366,17 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1block_1disconn
        CHECK((*env)->GetArrayLength(env, header) == 80);
        (*env)->GetByteArrayRegion(env, header, 0, 80, header_arr);
        unsigned char (*header_ref)[80] = &header_arr;
-       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)broadcaster;
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)broadcaster) & ~1);
        if (broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKBroadcasterInterface_JCalls_clone(broadcaster_conv.this_arg);
        }
-       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)fee_estimator;
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(((uint64_t)fee_estimator) & ~1);
        if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKFeeEstimator_JCalls_clone(fee_estimator_conv.this_arg);
        }
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
@@ -8397,7 +8385,8 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1block_1disconn
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Persist_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKPersist this_ptr_conv = *(LDKPersist*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKPersist this_ptr_conv = *(LDKPersist*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Persist_free(this_ptr_conv);
 }
@@ -8518,7 +8507,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_OutPoint_1read(JNIEnv *env,
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_SpendableOutputDescriptor_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKSpendableOutputDescriptor this_ptr_conv = *(LDKSpendableOutputDescriptor*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKSpendableOutputDescriptor this_ptr_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        SpendableOutputDescriptor_free(this_ptr_conv);
 }
@@ -8558,13 +8548,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1clone(JNIEnv *
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKChannelKeys this_ptr_conv = *(LDKChannelKeys*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKChannelKeys this_ptr_conv = *(LDKChannelKeys*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        ChannelKeys_free(this_ptr_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_KeysInterface_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKKeysInterface this_ptr_conv = *(LDKKeysInterface*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKKeysInterface this_ptr_conv = *(LDKKeysInterface*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        KeysInterface_free(this_ptr_conv);
 }
@@ -8723,7 +8715,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_InMemoryChannelKeys_1new(JN
        LDKThirtyTwoBytes commitment_seed_ref;
        CHECK((*env)->GetArrayLength(env, commitment_seed) == 32);
        (*env)->GetByteArrayRegion(env, commitment_seed, 0, 32, commitment_seed_ref.data);
-       LDKC2Tuple_u64u64Z key_derivation_params_conv = *(LDKC2Tuple_u64u64Z*)key_derivation_params;
+       LDKC2Tuple_u64u64Z key_derivation_params_conv = *(LDKC2Tuple_u64u64Z*)(((uint64_t)key_derivation_params) & ~1);
        FREE((void*)key_derivation_params);
        LDKInMemoryChannelKeys ret_var = InMemoryChannelKeys_new(funding_key_ref, revocation_base_key_ref, payment_key_ref, delayed_payment_base_key_ref, htlc_base_key_ref, commitment_seed_ref, channel_value_satoshis, key_derivation_params_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -8964,7 +8956,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelDetails_1set_1counterpa
        LDKInitFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKInitFeatures
        ChannelDetails_set_counterparty_features(&this_ptr_conv, val_conv);
 }
 
@@ -9050,29 +9042,43 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_PaymentSendFailure_1free(JNIEn
        PaymentSendFailure_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_PaymentSendFailure_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKPaymentSendFailure orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKPaymentSendFailure ret_var = PaymentSendFailure_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManager_1new(JNIEnv *env, jclass clz, jclass network, int64_t fee_est, int64_t chain_monitor, int64_t tx_broadcaster, int64_t logger, int64_t keys_manager, int64_t config, intptr_t current_blockchain_height) {
        LDKNetwork network_conv = LDKNetwork_from_java(env, network);
-       LDKFeeEstimator fee_est_conv = *(LDKFeeEstimator*)fee_est;
+       LDKFeeEstimator fee_est_conv = *(LDKFeeEstimator*)(((uint64_t)fee_est) & ~1);
        if (fee_est_conv.free == LDKFeeEstimator_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKFeeEstimator_JCalls_clone(fee_est_conv.this_arg);
        }
-       LDKWatch chain_monitor_conv = *(LDKWatch*)chain_monitor;
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(((uint64_t)chain_monitor) & ~1);
        if (chain_monitor_conv.free == LDKWatch_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKWatch_JCalls_clone(chain_monitor_conv.this_arg);
        }
-       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)tx_broadcaster;
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)tx_broadcaster) & ~1);
        if (tx_broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKBroadcasterInterface_JCalls_clone(tx_broadcaster_conv.this_arg);
        }
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
        }
-       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)keys_manager;
+       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)(((uint64_t)keys_manager) & ~1);
        if (keys_manager_conv.free == LDKKeysInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKKeysInterface_JCalls_clone(keys_manager_conv.this_arg);
@@ -9080,8 +9086,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManager_1new(JNIEnv
        LDKUserConfig config_conv;
        config_conv.inner = (void*)(config & (~1));
        config_conv.is_owned = (config & 1) || (config == 0);
-       if (config_conv.inner != NULL)
-               config_conv = UserConfig_clone(&config_conv);
+       config_conv = UserConfig_clone(&config_conv);
        LDKChannelManager ret_var = ChannelManager_new(network_conv, fee_est_conv, chain_monitor_conv, tx_broadcaster_conv, logger_conv, keys_manager_conv, config_conv, current_blockchain_height);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -9102,8 +9107,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManager_1create_1cha
        LDKUserConfig override_config_conv;
        override_config_conv.inner = (void*)(override_config & (~1));
        override_config_conv.is_owned = (override_config & 1) || (override_config == 0);
-       if (override_config_conv.inner != NULL)
-               override_config_conv = UserConfig_clone(&override_config_conv);
+       override_config_conv = UserConfig_clone(&override_config_conv);
        LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
        *ret_conv = ChannelManager_create_channel(&this_arg_conv, their_network_key_ref, channel_value_satoshis, push_msat, user_id, override_config_conv);
        return (long)ret_conv;
@@ -9166,7 +9170,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManager_1close_1chan
        return (long)ret_conv;
 }
 
-JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManager_1force_1close_1channel(JNIEnv *env, jclass clz, int64_t this_arg, int8_tArray channel_id) {
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManager_1force_1close_1channel(JNIEnv *env, jclass clz, int64_t this_arg, int8_tArray channel_id) {
        LDKChannelManager this_arg_conv;
        this_arg_conv.inner = (void*)(this_arg & (~1));
        this_arg_conv.is_owned = false;
@@ -9174,7 +9178,9 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManager_1force_1close_1
        CHECK((*env)->GetArrayLength(env, channel_id) == 32);
        (*env)->GetByteArrayRegion(env, channel_id, 0, 32, channel_id_arr);
        unsigned char (*channel_id_ref)[32] = &channel_id_arr;
-       ChannelManager_force_close_channel(&this_arg_conv, channel_id_ref);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_force_close_channel(&this_arg_conv, channel_id_ref);
+       return (long)ret_conv;
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManager_1force_1close_1all_1channels(JNIEnv *env, jclass clz, int64_t this_arg) {
@@ -9213,8 +9219,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManager_1funding_1trans
        LDKOutPoint funding_txo_conv;
        funding_txo_conv.inner = (void*)(funding_txo & (~1));
        funding_txo_conv.is_owned = (funding_txo & 1) || (funding_txo == 0);
-       if (funding_txo_conv.inner != NULL)
-               funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
        ChannelManager_funding_transaction_generated(&this_arg_conv, temporary_channel_id_ref, funding_txo_conv);
 }
 
@@ -9237,7 +9242,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManager_1broadcast_1nod
        int64_t* addresses_vals = (*env)->GetLongArrayElements (env, addresses, NULL);
        for (size_t m = 0; m < addresses_constr.datalen; m++) {
                int64_t arr_conv_12 = addresses_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                addresses_constr.data[m] = arr_conv_12_conv;
        }
@@ -9342,7 +9347,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManager_1block_1connect
        int64_t* txdata_vals = (*env)->GetLongArrayElements (env, txdata, NULL);
        for (size_t y = 0; y < txdata_constr.datalen; y++) {
                int64_t arr_conv_24 = txdata_vals[y];
-               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_24;
+               LDKC2Tuple_usizeTransactionZ arr_conv_24_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_24) & ~1);
                FREE((void*)arr_conv_24);
                txdata_constr.data[y] = arr_conv_24_conv;
        }
@@ -9400,7 +9405,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1set_1k
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKKeysInterface val_conv = *(LDKKeysInterface*)val;
+       LDKKeysInterface val_conv = *(LDKKeysInterface*)(((uint64_t)val) & ~1);
        if (val_conv.free == LDKKeysInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKKeysInterface_JCalls_clone(val_conv.this_arg);
@@ -9420,7 +9425,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1set_1f
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKFeeEstimator val_conv = *(LDKFeeEstimator*)val;
+       LDKFeeEstimator val_conv = *(LDKFeeEstimator*)(((uint64_t)val) & ~1);
        if (val_conv.free == LDKFeeEstimator_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKFeeEstimator_JCalls_clone(val_conv.this_arg);
@@ -9440,7 +9445,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1set_1c
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKWatch val_conv = *(LDKWatch*)val;
+       LDKWatch val_conv = *(LDKWatch*)(((uint64_t)val) & ~1);
        if (val_conv.free == LDKWatch_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKWatch_JCalls_clone(val_conv.this_arg);
@@ -9460,7 +9465,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1set_1t
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKBroadcasterInterface val_conv = *(LDKBroadcasterInterface*)val;
+       LDKBroadcasterInterface val_conv = *(LDKBroadcasterInterface*)(((uint64_t)val) & ~1);
        if (val_conv.free == LDKBroadcasterInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKBroadcasterInterface_JCalls_clone(val_conv.this_arg);
@@ -9480,7 +9485,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1set_1l
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKLogger val_conv = *(LDKLogger*)val;
+       LDKLogger val_conv = *(LDKLogger*)(((uint64_t)val) & ~1);
        if (val_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(val_conv.this_arg);
@@ -9509,33 +9514,32 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1set_1d
        LDKUserConfig val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UserConfig_clone(&val_conv);
+       val_conv = UserConfig_clone(&val_conv);
        ChannelManagerReadArgs_set_default_config(&this_ptr_conv, val_conv);
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1new(JNIEnv *env, jclass clz, int64_t keys_manager, int64_t fee_estimator, int64_t chain_monitor, int64_t tx_broadcaster, int64_t logger, int64_t default_config, int64_tArray channel_monitors) {
-       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)keys_manager;
+       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)(((uint64_t)keys_manager) & ~1);
        if (keys_manager_conv.free == LDKKeysInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKKeysInterface_JCalls_clone(keys_manager_conv.this_arg);
        }
-       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)fee_estimator;
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(((uint64_t)fee_estimator) & ~1);
        if (fee_estimator_conv.free == LDKFeeEstimator_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKFeeEstimator_JCalls_clone(fee_estimator_conv.this_arg);
        }
-       LDKWatch chain_monitor_conv = *(LDKWatch*)chain_monitor;
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(((uint64_t)chain_monitor) & ~1);
        if (chain_monitor_conv.free == LDKWatch_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKWatch_JCalls_clone(chain_monitor_conv.this_arg);
        }
-       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)tx_broadcaster;
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)tx_broadcaster) & ~1);
        if (tx_broadcaster_conv.free == LDKBroadcasterInterface_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKBroadcasterInterface_JCalls_clone(tx_broadcaster_conv.this_arg);
        }
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
@@ -9543,8 +9547,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1new
        LDKUserConfig default_config_conv;
        default_config_conv.inner = (void*)(default_config & (~1));
        default_config_conv.is_owned = (default_config & 1) || (default_config == 0);
-       if (default_config_conv.inner != NULL)
-               default_config_conv = UserConfig_clone(&default_config_conv);
+       default_config_conv = UserConfig_clone(&default_config_conv);
        LDKCVec_ChannelMonitorZ channel_monitors_constr;
        channel_monitors_constr.datalen = (*env)->GetArrayLength(env, channel_monitors);
        if (channel_monitors_constr.datalen > 0)
@@ -9557,7 +9560,6 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelManagerReadArgs_1new
                LDKChannelMonitor arr_conv_16_conv;
                arr_conv_16_conv.inner = (void*)(arr_conv_16 & (~1));
                arr_conv_16_conv.is_owned = (arr_conv_16 & 1) || (arr_conv_16 == 0);
-               // Warning: we may need a move here but can't clone!
                channel_monitors_constr.data[q] = arr_conv_16_conv;
        }
        (*env)->ReleaseLongArrayElements(env, channel_monitors, channel_monitors_vals, 0);
@@ -9578,7 +9580,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_C2Tuple_1BlockHashChannelMa
        LDKChannelManagerReadArgs arg_conv;
        arg_conv.inner = (void*)(arg & (~1));
        arg_conv.is_owned = (arg & 1) || (arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelManagerReadArgs
        LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ");
        *ret_conv = C2Tuple_BlockHashChannelManagerZ_read(ser_ref, arg_conv);
        (*env)->ReleaseByteArrayElements(env, ser, (int8_t*)ser_ref.data, 0);
@@ -9592,6 +9594,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_DecodeError_1free(JNIEnv *env,
        DecodeError_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_DecodeError_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKDecodeError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKDecodeError ret_var = DecodeError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Init_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
        LDKInit this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -11673,7 +11689,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_AnnouncementSignatures_1new
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NetAddress_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKNetAddress this_ptr_conv = *(LDKNetAddress*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKNetAddress this_ptr_conv = *(LDKNetAddress*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        NetAddress_free(this_ptr_conv);
 }
@@ -11747,7 +11764,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_UnsignedNodeAnnouncement_1set_
        LDKNodeFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        UnsignedNodeAnnouncement_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -11836,7 +11853,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_UnsignedNodeAnnouncement_1set_
        int64_t* val_vals = (*env)->GetLongArrayElements (env, val, NULL);
        for (size_t m = 0; m < val_constr.datalen; m++) {
                int64_t arr_conv_12 = val_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                val_constr.data[m] = arr_conv_12_conv;
        }
@@ -11905,8 +11922,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeAnnouncement_1set_1content
        LDKUnsignedNodeAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UnsignedNodeAnnouncement_clone(&val_conv);
+       val_conv = UnsignedNodeAnnouncement_clone(&val_conv);
        NodeAnnouncement_set_contents(&this_ptr_conv, val_conv);
 }
 
@@ -11917,8 +11933,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeAnnouncement_1new(JNIEn
        LDKUnsignedNodeAnnouncement contents_arg_conv;
        contents_arg_conv.inner = (void*)(contents_arg & (~1));
        contents_arg_conv.is_owned = (contents_arg & 1) || (contents_arg == 0);
-       if (contents_arg_conv.inner != NULL)
-               contents_arg_conv = UnsignedNodeAnnouncement_clone(&contents_arg_conv);
+       contents_arg_conv = UnsignedNodeAnnouncement_clone(&contents_arg_conv);
        LDKNodeAnnouncement ret_var = NodeAnnouncement_new(signature_arg_ref, contents_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -11971,7 +11986,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_UnsignedChannelAnnouncement_1s
        LDKChannelFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        UnsignedChannelAnnouncement_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -12203,8 +12218,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelAnnouncement_1set_1cont
        LDKUnsignedChannelAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UnsignedChannelAnnouncement_clone(&val_conv);
+       val_conv = UnsignedChannelAnnouncement_clone(&val_conv);
        ChannelAnnouncement_set_contents(&this_ptr_conv, val_conv);
 }
 
@@ -12224,8 +12238,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelAnnouncement_1new(JN
        LDKUnsignedChannelAnnouncement contents_arg_conv;
        contents_arg_conv.inner = (void*)(contents_arg & (~1));
        contents_arg_conv.is_owned = (contents_arg & 1) || (contents_arg == 0);
-       if (contents_arg_conv.inner != NULL)
-               contents_arg_conv = UnsignedChannelAnnouncement_clone(&contents_arg_conv);
+       contents_arg_conv = UnsignedChannelAnnouncement_clone(&contents_arg_conv);
        LDKChannelAnnouncement ret_var = ChannelAnnouncement_new(node_signature_1_arg_ref, node_signature_2_arg_ref, bitcoin_signature_1_arg_ref, bitcoin_signature_2_arg_ref, contents_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -12442,8 +12455,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelUpdate_1set_1contents(J
        LDKUnsignedChannelUpdate val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UnsignedChannelUpdate_clone(&val_conv);
+       val_conv = UnsignedChannelUpdate_clone(&val_conv);
        ChannelUpdate_set_contents(&this_ptr_conv, val_conv);
 }
 
@@ -12454,8 +12466,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelUpdate_1new(JNIEnv *
        LDKUnsignedChannelUpdate contents_arg_conv;
        contents_arg_conv.inner = (void*)(contents_arg & (~1));
        contents_arg_conv.is_owned = (contents_arg & 1) || (contents_arg == 0);
-       if (contents_arg_conv.inner != NULL)
-               contents_arg_conv = UnsignedChannelUpdate_clone(&contents_arg_conv);
+       contents_arg_conv = UnsignedChannelUpdate_clone(&contents_arg_conv);
        LDKChannelUpdate ret_var = ChannelUpdate_new(signature_arg_ref, contents_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -12919,7 +12930,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_GossipTimestampFilter_1new(
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ErrorAction_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKErrorAction this_ptr_conv = *(LDKErrorAction*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKErrorAction this_ptr_conv = *(LDKErrorAction*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        ErrorAction_free(this_ptr_conv);
 }
@@ -12939,6 +12951,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LightningError_1free(JNIEnv *e
        LightningError_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LightningError_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKLightningError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKLightningError ret_var = LightningError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT jstring JNICALL Java_org_ldk_impl_bindings_LightningError_1get_1err(JNIEnv *env, jclass clz, int64_t this_ptr) {
        LDKLightningError this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -12973,7 +12999,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LightningError_1set_1action(JN
        LDKLightningError this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKErrorAction val_conv = *(LDKErrorAction*)val;
+       LDKErrorAction val_conv = *(LDKErrorAction*)(((uint64_t)val) & ~1);
        FREE((void*)val);
        LightningError_set_action(&this_ptr_conv, val_conv);
 }
@@ -12983,7 +13009,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_LightningError_1new(JNIEnv
        err_arg_ref.datalen = (*env)->GetArrayLength(env, err_arg);
        err_arg_ref.data = MALLOC(err_arg_ref.datalen, "LDKCVec_u8Z Bytes");
        (*env)->GetByteArrayRegion(env, err_arg, 0, err_arg_ref.datalen, err_arg_ref.data);
-       LDKErrorAction action_arg_conv = *(LDKErrorAction*)action_arg;
+       LDKErrorAction action_arg_conv = *(LDKErrorAction*)(((uint64_t)action_arg) & ~1);
        FREE((void*)action_arg);
        LDKLightningError ret_var = LightningError_new(err_arg_ref, action_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -13032,8 +13058,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1set_1update_
                LDKUpdateAddHTLC arr_conv_15_conv;
                arr_conv_15_conv.inner = (void*)(arr_conv_15 & (~1));
                arr_conv_15_conv.is_owned = (arr_conv_15 & 1) || (arr_conv_15 == 0);
-               if (arr_conv_15_conv.inner != NULL)
-                       arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
+               arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
                val_constr.data[p] = arr_conv_15_conv;
        }
        (*env)->ReleaseLongArrayElements(env, val, val_vals, 0);
@@ -13056,8 +13081,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1set_1update_
                LDKUpdateFulfillHTLC arr_conv_19_conv;
                arr_conv_19_conv.inner = (void*)(arr_conv_19 & (~1));
                arr_conv_19_conv.is_owned = (arr_conv_19 & 1) || (arr_conv_19 == 0);
-               if (arr_conv_19_conv.inner != NULL)
-                       arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
+               arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
                val_constr.data[t] = arr_conv_19_conv;
        }
        (*env)->ReleaseLongArrayElements(env, val, val_vals, 0);
@@ -13080,8 +13104,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1set_1update_
                LDKUpdateFailHTLC arr_conv_16_conv;
                arr_conv_16_conv.inner = (void*)(arr_conv_16 & (~1));
                arr_conv_16_conv.is_owned = (arr_conv_16 & 1) || (arr_conv_16 == 0);
-               if (arr_conv_16_conv.inner != NULL)
-                       arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
+               arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
                val_constr.data[q] = arr_conv_16_conv;
        }
        (*env)->ReleaseLongArrayElements(env, val, val_vals, 0);
@@ -13104,8 +13127,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1set_1update_
                LDKUpdateFailMalformedHTLC arr_conv_25_conv;
                arr_conv_25_conv.inner = (void*)(arr_conv_25 & (~1));
                arr_conv_25_conv.is_owned = (arr_conv_25 & 1) || (arr_conv_25 == 0);
-               if (arr_conv_25_conv.inner != NULL)
-                       arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
+               arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
                val_constr.data[z] = arr_conv_25_conv;
        }
        (*env)->ReleaseLongArrayElements(env, val, val_vals, 0);
@@ -13133,8 +13155,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1set_1update_
        LDKUpdateFee val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UpdateFee_clone(&val_conv);
+       val_conv = UpdateFee_clone(&val_conv);
        CommitmentUpdate_set_update_fee(&this_ptr_conv, val_conv);
 }
 
@@ -13159,8 +13180,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1set_1commitm
        LDKCommitmentSigned val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = CommitmentSigned_clone(&val_conv);
+       val_conv = CommitmentSigned_clone(&val_conv);
        CommitmentUpdate_set_commitment_signed(&this_ptr_conv, val_conv);
 }
 
@@ -13177,8 +13197,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1new(JNIEn
                LDKUpdateAddHTLC arr_conv_15_conv;
                arr_conv_15_conv.inner = (void*)(arr_conv_15 & (~1));
                arr_conv_15_conv.is_owned = (arr_conv_15 & 1) || (arr_conv_15 == 0);
-               if (arr_conv_15_conv.inner != NULL)
-                       arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
+               arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
                update_add_htlcs_arg_constr.data[p] = arr_conv_15_conv;
        }
        (*env)->ReleaseLongArrayElements(env, update_add_htlcs_arg, update_add_htlcs_arg_vals, 0);
@@ -13194,8 +13213,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1new(JNIEn
                LDKUpdateFulfillHTLC arr_conv_19_conv;
                arr_conv_19_conv.inner = (void*)(arr_conv_19 & (~1));
                arr_conv_19_conv.is_owned = (arr_conv_19 & 1) || (arr_conv_19 == 0);
-               if (arr_conv_19_conv.inner != NULL)
-                       arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
+               arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
                update_fulfill_htlcs_arg_constr.data[t] = arr_conv_19_conv;
        }
        (*env)->ReleaseLongArrayElements(env, update_fulfill_htlcs_arg, update_fulfill_htlcs_arg_vals, 0);
@@ -13211,8 +13229,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1new(JNIEn
                LDKUpdateFailHTLC arr_conv_16_conv;
                arr_conv_16_conv.inner = (void*)(arr_conv_16 & (~1));
                arr_conv_16_conv.is_owned = (arr_conv_16 & 1) || (arr_conv_16 == 0);
-               if (arr_conv_16_conv.inner != NULL)
-                       arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
+               arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
                update_fail_htlcs_arg_constr.data[q] = arr_conv_16_conv;
        }
        (*env)->ReleaseLongArrayElements(env, update_fail_htlcs_arg, update_fail_htlcs_arg_vals, 0);
@@ -13228,21 +13245,18 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1new(JNIEn
                LDKUpdateFailMalformedHTLC arr_conv_25_conv;
                arr_conv_25_conv.inner = (void*)(arr_conv_25 & (~1));
                arr_conv_25_conv.is_owned = (arr_conv_25 & 1) || (arr_conv_25 == 0);
-               if (arr_conv_25_conv.inner != NULL)
-                       arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
+               arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
                update_fail_malformed_htlcs_arg_constr.data[z] = arr_conv_25_conv;
        }
        (*env)->ReleaseLongArrayElements(env, update_fail_malformed_htlcs_arg, update_fail_malformed_htlcs_arg_vals, 0);
        LDKUpdateFee update_fee_arg_conv;
        update_fee_arg_conv.inner = (void*)(update_fee_arg & (~1));
        update_fee_arg_conv.is_owned = (update_fee_arg & 1) || (update_fee_arg == 0);
-       if (update_fee_arg_conv.inner != NULL)
-               update_fee_arg_conv = UpdateFee_clone(&update_fee_arg_conv);
+       update_fee_arg_conv = UpdateFee_clone(&update_fee_arg_conv);
        LDKCommitmentSigned commitment_signed_arg_conv;
        commitment_signed_arg_conv.inner = (void*)(commitment_signed_arg & (~1));
        commitment_signed_arg_conv.is_owned = (commitment_signed_arg & 1) || (commitment_signed_arg == 0);
-       if (commitment_signed_arg_conv.inner != NULL)
-               commitment_signed_arg_conv = CommitmentSigned_clone(&commitment_signed_arg_conv);
+       commitment_signed_arg_conv = CommitmentSigned_clone(&commitment_signed_arg_conv);
        LDKCommitmentUpdate ret_var = CommitmentUpdate_new(update_add_htlcs_arg_constr, update_fulfill_htlcs_arg_constr, update_fail_htlcs_arg_constr, update_fail_malformed_htlcs_arg_constr, update_fee_arg_conv, commitment_signed_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -13254,7 +13268,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CommitmentUpdate_1new(JNIEn
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_HTLCFailChannelUpdate_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKHTLCFailChannelUpdate this_ptr_conv = *(LDKHTLCFailChannelUpdate*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKHTLCFailChannelUpdate this_ptr_conv = *(LDKHTLCFailChannelUpdate*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        HTLCFailChannelUpdate_free(this_ptr_conv);
 }
@@ -13268,13 +13283,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_HTLCFailChannelUpdate_1clon
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelMessageHandler_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKChannelMessageHandler this_ptr_conv = *(LDKChannelMessageHandler*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKChannelMessageHandler this_ptr_conv = *(LDKChannelMessageHandler*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        ChannelMessageHandler_free(this_ptr_conv);
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_RoutingMessageHandler_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKRoutingMessageHandler this_ptr_conv = *(LDKRoutingMessageHandler*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKRoutingMessageHandler this_ptr_conv = *(LDKRoutingMessageHandler*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        RoutingMessageHandler_free(this_ptr_conv);
 }
@@ -14039,7 +14056,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MessageHandler_1set_1chan_1han
        LDKMessageHandler this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKChannelMessageHandler val_conv = *(LDKChannelMessageHandler*)val;
+       LDKChannelMessageHandler val_conv = *(LDKChannelMessageHandler*)(((uint64_t)val) & ~1);
        if (val_conv.free == LDKChannelMessageHandler_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKChannelMessageHandler_JCalls_clone(val_conv.this_arg);
@@ -14059,7 +14076,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MessageHandler_1set_1route_1ha
        LDKMessageHandler this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKRoutingMessageHandler val_conv = *(LDKRoutingMessageHandler*)val;
+       LDKRoutingMessageHandler val_conv = *(LDKRoutingMessageHandler*)(((uint64_t)val) & ~1);
        if (val_conv.free == LDKRoutingMessageHandler_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKRoutingMessageHandler_JCalls_clone(val_conv.this_arg);
@@ -14068,12 +14085,12 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MessageHandler_1set_1route_1ha
 }
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_MessageHandler_1new(JNIEnv *env, jclass clz, int64_t chan_handler_arg, int64_t route_handler_arg) {
-       LDKChannelMessageHandler chan_handler_arg_conv = *(LDKChannelMessageHandler*)chan_handler_arg;
+       LDKChannelMessageHandler chan_handler_arg_conv = *(LDKChannelMessageHandler*)(((uint64_t)chan_handler_arg) & ~1);
        if (chan_handler_arg_conv.free == LDKChannelMessageHandler_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKChannelMessageHandler_JCalls_clone(chan_handler_arg_conv.this_arg);
        }
-       LDKRoutingMessageHandler route_handler_arg_conv = *(LDKRoutingMessageHandler*)route_handler_arg;
+       LDKRoutingMessageHandler route_handler_arg_conv = *(LDKRoutingMessageHandler*)(((uint64_t)route_handler_arg) & ~1);
        if (route_handler_arg_conv.free == LDKRoutingMessageHandler_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKRoutingMessageHandler_JCalls_clone(route_handler_arg_conv.this_arg);
@@ -14096,7 +14113,8 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_SocketDescriptor_1clone(JNI
 }
 
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_SocketDescriptor_1free(JNIEnv *env, jclass clz, int64_t this_ptr) {
-       LDKSocketDescriptor this_ptr_conv = *(LDKSocketDescriptor*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKSocketDescriptor this_ptr_conv = *(LDKSocketDescriptor*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        SocketDescriptor_free(this_ptr_conv);
 }
@@ -14108,6 +14126,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_PeerHandleError_1free(JNIEnv *
        PeerHandleError_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_PeerHandleError_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKPeerHandleError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKPeerHandleError ret_var = PeerHandleError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_PeerHandleError_1get_1no_1connection_1possible(JNIEnv *env, jclass clz, int64_t this_ptr) {
        LDKPeerHandleError this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -14145,7 +14177,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_PeerManager_1new(JNIEnv *en
        LDKMessageHandler message_handler_conv;
        message_handler_conv.inner = (void*)(message_handler & (~1));
        message_handler_conv.is_owned = (message_handler & 1) || (message_handler == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKMessageHandler
        LDKSecretKey our_node_secret_ref;
        CHECK((*env)->GetArrayLength(env, our_node_secret) == 32);
        (*env)->GetByteArrayRegion(env, our_node_secret, 0, 32, our_node_secret_ref.bytes);
@@ -14153,7 +14185,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_PeerManager_1new(JNIEnv *en
        CHECK((*env)->GetArrayLength(env, ephemeral_random_data) == 32);
        (*env)->GetByteArrayRegion(env, ephemeral_random_data, 0, 32, ephemeral_random_data_arr);
        unsigned char (*ephemeral_random_data_ref)[32] = &ephemeral_random_data_arr;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
@@ -14191,7 +14223,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_PeerManager_1new_1outbound_
        LDKPublicKey their_node_id_ref;
        CHECK((*env)->GetArrayLength(env, their_node_id) == 33);
        (*env)->GetByteArrayRegion(env, their_node_id, 0, 33, their_node_id_ref.compressed_form);
-       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)descriptor;
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(((uint64_t)descriptor) & ~1);
        if (descriptor_conv.free == LDKSocketDescriptor_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKSocketDescriptor_JCalls_clone(descriptor_conv.this_arg);
@@ -14205,7 +14237,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_PeerManager_1new_1inbound_1
        LDKPeerManager this_arg_conv;
        this_arg_conv.inner = (void*)(this_arg & (~1));
        this_arg_conv.is_owned = false;
-       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)descriptor;
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(((uint64_t)descriptor) & ~1);
        if (descriptor_conv.free == LDKSocketDescriptor_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKSocketDescriptor_JCalls_clone(descriptor_conv.this_arg);
@@ -14910,8 +14942,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelTransactionParameters_1
        LDKChannelPublicKeys val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelPublicKeys_clone(&val_conv);
+       val_conv = ChannelPublicKeys_clone(&val_conv);
        ChannelTransactionParameters_set_holder_pubkeys(&this_ptr_conv, val_conv);
 }
 
@@ -14966,8 +14997,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelTransactionParameters_1
        LDKCounterpartyChannelTransactionParameters val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = CounterpartyChannelTransactionParameters_clone(&val_conv);
+       val_conv = CounterpartyChannelTransactionParameters_clone(&val_conv);
        ChannelTransactionParameters_set_counterparty_parameters(&this_ptr_conv, val_conv);
 }
 
@@ -14992,8 +15022,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelTransactionParameters_1
        LDKOutPoint val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = OutPoint_clone(&val_conv);
+       val_conv = OutPoint_clone(&val_conv);
        ChannelTransactionParameters_set_funding_outpoint(&this_ptr_conv, val_conv);
 }
 
@@ -15001,18 +15030,15 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_ChannelTransactionParameter
        LDKChannelPublicKeys holder_pubkeys_arg_conv;
        holder_pubkeys_arg_conv.inner = (void*)(holder_pubkeys_arg & (~1));
        holder_pubkeys_arg_conv.is_owned = (holder_pubkeys_arg & 1) || (holder_pubkeys_arg == 0);
-       if (holder_pubkeys_arg_conv.inner != NULL)
-               holder_pubkeys_arg_conv = ChannelPublicKeys_clone(&holder_pubkeys_arg_conv);
+       holder_pubkeys_arg_conv = ChannelPublicKeys_clone(&holder_pubkeys_arg_conv);
        LDKCounterpartyChannelTransactionParameters counterparty_parameters_arg_conv;
        counterparty_parameters_arg_conv.inner = (void*)(counterparty_parameters_arg & (~1));
        counterparty_parameters_arg_conv.is_owned = (counterparty_parameters_arg & 1) || (counterparty_parameters_arg == 0);
-       if (counterparty_parameters_arg_conv.inner != NULL)
-               counterparty_parameters_arg_conv = CounterpartyChannelTransactionParameters_clone(&counterparty_parameters_arg_conv);
+       counterparty_parameters_arg_conv = CounterpartyChannelTransactionParameters_clone(&counterparty_parameters_arg_conv);
        LDKOutPoint funding_outpoint_arg_conv;
        funding_outpoint_arg_conv.inner = (void*)(funding_outpoint_arg & (~1));
        funding_outpoint_arg_conv.is_owned = (funding_outpoint_arg & 1) || (funding_outpoint_arg == 0);
-       if (funding_outpoint_arg_conv.inner != NULL)
-               funding_outpoint_arg_conv = OutPoint_clone(&funding_outpoint_arg_conv);
+       funding_outpoint_arg_conv = OutPoint_clone(&funding_outpoint_arg_conv);
        LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_new(holder_pubkeys_arg_conv, holder_selected_contest_delay_arg, is_outbound_from_holder_arg, counterparty_parameters_arg_conv, funding_outpoint_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -15065,8 +15091,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CounterpartyChannelTransaction
        LDKChannelPublicKeys val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelPublicKeys_clone(&val_conv);
+       val_conv = ChannelPublicKeys_clone(&val_conv);
        CounterpartyChannelTransactionParameters_set_pubkeys(&this_ptr_conv, val_conv);
 }
 
@@ -15089,8 +15114,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_CounterpartyChannelTransact
        LDKChannelPublicKeys pubkeys_arg_conv;
        pubkeys_arg_conv.inner = (void*)(pubkeys_arg & (~1));
        pubkeys_arg_conv.is_owned = (pubkeys_arg & 1) || (pubkeys_arg == 0);
-       if (pubkeys_arg_conv.inner != NULL)
-               pubkeys_arg_conv = ChannelPublicKeys_clone(&pubkeys_arg_conv);
+       pubkeys_arg_conv = ChannelPublicKeys_clone(&pubkeys_arg_conv);
        LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_new(pubkeys_arg_conv, selected_contest_delay_arg);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -15344,8 +15368,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_HolderCommitmentTransaction
        LDKCommitmentTransaction commitment_tx_conv;
        commitment_tx_conv.inner = (void*)(commitment_tx & (~1));
        commitment_tx_conv.is_owned = (commitment_tx & 1) || (commitment_tx == 0);
-       if (commitment_tx_conv.inner != NULL)
-               commitment_tx_conv = CommitmentTransaction_clone(&commitment_tx_conv);
+       commitment_tx_conv = CommitmentTransaction_clone(&commitment_tx_conv);
        LDKSignature counterparty_sig_ref;
        CHECK((*env)->GetArrayLength(env, counterparty_sig) == 64);
        (*env)->GetByteArrayRegion(env, counterparty_sig, 0, 64, counterparty_sig_ref.compact_form);
@@ -15780,7 +15803,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_RouteHop_1set_1node_1features(
        LDKNodeFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        RouteHop_set_node_features(&this_ptr_conv, val_conv);
 }
 
@@ -15820,7 +15843,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_RouteHop_1set_1channel_1featur
        LDKChannelFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        RouteHop_set_channel_features(&this_ptr_conv, val_conv);
 }
 
@@ -15861,11 +15884,11 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_RouteHop_1new(JNIEnv *env,
        LDKNodeFeatures node_features_arg_conv;
        node_features_arg_conv.inner = (void*)(node_features_arg & (~1));
        node_features_arg_conv.is_owned = (node_features_arg & 1) || (node_features_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        LDKChannelFeatures channel_features_arg_conv;
        channel_features_arg_conv.inner = (void*)(channel_features_arg & (~1));
        channel_features_arg_conv.is_owned = (channel_features_arg & 1) || (channel_features_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        LDKRouteHop ret_var = RouteHop_new(pubkey_arg_ref, node_features_arg_conv, short_channel_id_arg, channel_features_arg_conv, fee_msat_arg, cltv_expiry_delta_arg);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -15921,8 +15944,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_Route_1set_1paths(JNIEnv *env,
                        LDKRouteHop arr_conv_10_conv;
                        arr_conv_10_conv.inner = (void*)(arr_conv_10 & (~1));
                        arr_conv_10_conv.is_owned = (arr_conv_10 & 1) || (arr_conv_10 == 0);
-                       if (arr_conv_10_conv.inner != NULL)
-                               arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
+                       arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
                        arr_conv_12_constr.data[k] = arr_conv_10_conv;
                }
                (*env)->ReleaseLongArrayElements(env, arr_conv_12, arr_conv_12_vals, 0);
@@ -15952,8 +15974,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_Route_1new(JNIEnv *env, jcl
                        LDKRouteHop arr_conv_10_conv;
                        arr_conv_10_conv.inner = (void*)(arr_conv_10 & (~1));
                        arr_conv_10_conv.is_owned = (arr_conv_10 & 1) || (arr_conv_10 == 0);
-                       if (arr_conv_10_conv.inner != NULL)
-                               arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
+                       arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
                        arr_conv_12_constr.data[k] = arr_conv_10_conv;
                }
                (*env)->ReleaseLongArrayElements(env, arr_conv_12, arr_conv_12_vals, 0);
@@ -16066,8 +16087,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_RouteHint_1set_1fees(JNIEnv *e
        LDKRoutingFees val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = RoutingFees_clone(&val_conv);
+       val_conv = RoutingFees_clone(&val_conv);
        RouteHint_set_fees(&this_ptr_conv, val_conv);
 }
 
@@ -16108,8 +16128,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_RouteHint_1new(JNIEnv *env,
        LDKRoutingFees fees_arg_conv;
        fees_arg_conv.inner = (void*)(fees_arg & (~1));
        fees_arg_conv.is_owned = (fees_arg & 1) || (fees_arg == 0);
-       if (fees_arg_conv.inner != NULL)
-               fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
+       fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
        LDKRouteHint ret_var = RouteHint_new(src_node_id_arg_ref, short_channel_id_arg, fees_arg_conv, cltv_expiry_delta_arg, htlc_minimum_msat_arg);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -16157,12 +16176,11 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_get_1route(JNIEnv *env, jcl
                LDKRouteHint arr_conv_11_conv;
                arr_conv_11_conv.inner = (void*)(arr_conv_11 & (~1));
                arr_conv_11_conv.is_owned = (arr_conv_11 & 1) || (arr_conv_11 == 0);
-               if (arr_conv_11_conv.inner != NULL)
-                       arr_conv_11_conv = RouteHint_clone(&arr_conv_11_conv);
+               arr_conv_11_conv = RouteHint_clone(&arr_conv_11_conv);
                last_hops_constr.data[l] = arr_conv_11_conv;
        }
        (*env)->ReleaseLongArrayElements(env, last_hops, last_hops_vals, 0);
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
@@ -16199,7 +16217,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NetGraphMsgHandler_1new(JNI
        CHECK((*env)->GetArrayLength(env, genesis_hash) == 32);
        (*env)->GetByteArrayRegion(env, genesis_hash, 0, 32, genesis_hash_ref.data);
        LDKAccess* chain_access_conv = (LDKAccess*)chain_access;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
@@ -16216,7 +16234,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NetGraphMsgHandler_1new(JNI
 
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NetGraphMsgHandler_1from_1net_1graph(JNIEnv *env, jclass clz, int64_t chain_access, int64_t logger, int64_t network_graph) {
        LDKAccess* chain_access_conv = (LDKAccess*)chain_access;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        if (logger_conv.free == LDKLogger_JCalls_free) {
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_clone(logger_conv.this_arg);
@@ -16224,7 +16242,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NetGraphMsgHandler_1from_1n
        LDKNetworkGraph network_graph_conv;
        network_graph_conv.inner = (void*)(network_graph & (~1));
        network_graph_conv.is_owned = (network_graph & 1) || (network_graph == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNetworkGraph
        LDKNetGraphMsgHandler ret_var = NetGraphMsgHandler_from_net_graph(chain_access_conv, logger_conv, network_graph_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -16288,6 +16306,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_DirectionalChannelInfo_1free(J
        DirectionalChannelInfo_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_DirectionalChannelInfo_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKDirectionalChannelInfo orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKDirectionalChannelInfo ret_var = DirectionalChannelInfo_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT int32_t JNICALL Java_org_ldk_impl_bindings_DirectionalChannelInfo_1get_1last_1update(JNIEnv *env, jclass clz, int64_t this_ptr) {
        LDKDirectionalChannelInfo this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -16369,8 +16401,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_DirectionalChannelInfo_1set_1f
        LDKRoutingFees val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = RoutingFees_clone(&val_conv);
+       val_conv = RoutingFees_clone(&val_conv);
        DirectionalChannelInfo_set_fees(&this_ptr_conv, val_conv);
 }
 
@@ -16395,8 +16426,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_DirectionalChannelInfo_1set_1l
        LDKChannelUpdate val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelUpdate_clone(&val_conv);
+       val_conv = ChannelUpdate_clone(&val_conv);
        DirectionalChannelInfo_set_last_update_message(&this_ptr_conv, val_conv);
 }
 
@@ -16454,7 +16484,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelInfo_1set_1features(JNI
        LDKChannelFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        ChannelInfo_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -16498,7 +16528,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelInfo_1set_1one_1to_1two
        LDKDirectionalChannelInfo val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       val_conv = DirectionalChannelInfo_clone(&val_conv);
        ChannelInfo_set_one_to_two(&this_ptr_conv, val_conv);
 }
 
@@ -16542,7 +16572,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelInfo_1set_1two_1to_1one
        LDKDirectionalChannelInfo val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       val_conv = DirectionalChannelInfo_clone(&val_conv);
        ChannelInfo_set_two_to_one(&this_ptr_conv, val_conv);
 }
 
@@ -16567,8 +16597,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelInfo_1set_1announcement
        LDKChannelAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelAnnouncement_clone(&val_conv);
+       val_conv = ChannelAnnouncement_clone(&val_conv);
        ChannelInfo_set_announcement_message(&this_ptr_conv, val_conv);
 }
 
@@ -16688,6 +16717,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1free(JNI
        NodeAnnouncementInfo_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKNodeAnnouncementInfo orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1get_1features(JNIEnv *env, jclass clz, int64_t this_ptr) {
        LDKNodeAnnouncementInfo this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -16709,7 +16752,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1set_1fea
        LDKNodeFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        NodeAnnouncementInfo_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -16779,7 +16822,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1set_1add
        int64_t* val_vals = (*env)->GetLongArrayElements (env, val, NULL);
        for (size_t m = 0; m < val_constr.datalen; m++) {
                int64_t arr_conv_12 = val_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                val_constr.data[m] = arr_conv_12_conv;
        }
@@ -16808,8 +16851,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1set_1ann
        LDKNodeAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = NodeAnnouncement_clone(&val_conv);
+       val_conv = NodeAnnouncement_clone(&val_conv);
        NodeAnnouncementInfo_set_announcement_message(&this_ptr_conv, val_conv);
 }
 
@@ -16817,7 +16859,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1new(J
        LDKNodeFeatures features_arg_conv;
        features_arg_conv.inner = (void*)(features_arg & (~1));
        features_arg_conv.is_owned = (features_arg & 1) || (features_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        LDKThreeBytes rgb_arg_ref;
        CHECK((*env)->GetArrayLength(env, rgb_arg) == 3);
        (*env)->GetByteArrayRegion(env, rgb_arg, 0, 3, rgb_arg_ref.data);
@@ -16833,7 +16875,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1new(J
        int64_t* addresses_arg_vals = (*env)->GetLongArrayElements (env, addresses_arg, NULL);
        for (size_t m = 0; m < addresses_arg_constr.datalen; m++) {
                int64_t arr_conv_12 = addresses_arg_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                addresses_arg_constr.data[m] = arr_conv_12_conv;
        }
@@ -16841,8 +16883,7 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1new(J
        LDKNodeAnnouncement announcement_message_arg_conv;
        announcement_message_arg_conv.inner = (void*)(announcement_message_arg & (~1));
        announcement_message_arg_conv.is_owned = (announcement_message_arg & 1) || (announcement_message_arg == 0);
-       if (announcement_message_arg_conv.inner != NULL)
-               announcement_message_arg_conv = NodeAnnouncement_clone(&announcement_message_arg_conv);
+       announcement_message_arg_conv = NodeAnnouncement_clone(&announcement_message_arg_conv);
        LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_new(features_arg_conv, last_update_arg, rgb_arg_ref, alias_arg_ref, addresses_arg_constr, announcement_message_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -16881,6 +16922,20 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeInfo_1free(JNIEnv *env, jc
        NodeInfo_free(this_ptr_conv);
 }
 
+JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeInfo_1clone(JNIEnv *env, jclass clz, int64_t orig) {
+       LDKNodeInfo orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKNodeInfo ret_var = NodeInfo_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeInfo_1set_1channels(JNIEnv *env, jclass clz, int64_t this_ptr, int64_tArray val) {
        LDKNodeInfo this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -16921,8 +16976,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeInfo_1set_1lowest_1inbound
        LDKRoutingFees val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = RoutingFees_clone(&val_conv);
+       val_conv = RoutingFees_clone(&val_conv);
        NodeInfo_set_lowest_inbound_channel_fees(&this_ptr_conv, val_conv);
 }
 
@@ -16947,7 +17001,7 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeInfo_1set_1announcement_1i
        LDKNodeAnnouncementInfo val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       val_conv = NodeAnnouncementInfo_clone(&val_conv);
        NodeInfo_set_announcement_info(&this_ptr_conv, val_conv);
 }
 
@@ -16967,12 +17021,11 @@ JNIEXPORT int64_t JNICALL Java_org_ldk_impl_bindings_NodeInfo_1new(JNIEnv *env,
        LDKRoutingFees lowest_inbound_channel_fees_arg_conv;
        lowest_inbound_channel_fees_arg_conv.inner = (void*)(lowest_inbound_channel_fees_arg & (~1));
        lowest_inbound_channel_fees_arg_conv.is_owned = (lowest_inbound_channel_fees_arg & 1) || (lowest_inbound_channel_fees_arg == 0);
-       if (lowest_inbound_channel_fees_arg_conv.inner != NULL)
-               lowest_inbound_channel_fees_arg_conv = RoutingFees_clone(&lowest_inbound_channel_fees_arg_conv);
+       lowest_inbound_channel_fees_arg_conv = RoutingFees_clone(&lowest_inbound_channel_fees_arg_conv);
        LDKNodeAnnouncementInfo announcement_info_arg_conv;
        announcement_info_arg_conv.inner = (void*)(announcement_info_arg & (~1));
        announcement_info_arg_conv.is_owned = (announcement_info_arg & 1) || (announcement_info_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       announcement_info_arg_conv = NodeAnnouncementInfo_clone(&announcement_info_arg_conv);
        LDKNodeInfo ret_var = NodeInfo_new(channels_arg_constr, lowest_inbound_channel_fees_arg_conv, announcement_info_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
index eb34b84aa3b6b4b9b51a3042100b5597a07e6c8c..ad8358bec4ccb812ebc99b5775d00bb9d202d0e4 100644 (file)
@@ -479,30 +479,6 @@ JNIEXPORT jbyteArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SignatureNon
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1SignatureNoneZ_1get_1err
   (JNIEnv *, jclass, jlong);
 
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    LDKCResult_CVec_SignatureZNoneZ_result_ok
- * Signature: (J)Z
- */
-JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1result_1ok
-  (JNIEnv *, jclass, jlong);
-
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    LDKCResult_CVec_SignatureZNoneZ_get_ok
- * Signature: (J)[[B
- */
-JNIEXPORT jobjectArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1ok
-  (JNIEnv *, jclass, jlong);
-
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    LDKCResult_CVec_SignatureZNoneZ_get_err
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1err
-  (JNIEnv *, jclass, jlong);
-
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    LDKChannelKeys_new
@@ -545,18 +521,10 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1counterpar
 
 /*
  * Class:     org_ldk_impl_bindings
- * Method:    ChannelKeys_sign_holder_commitment
+ * Method:    ChannelKeys_sign_holder_commitment_and_htlcs
  * Signature: (JJ)J
  */
-JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1holder_1commitment
-  (JNIEnv *, jclass, jlong, jlong);
-
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    ChannelKeys_sign_holder_commitment_htlc_transactions
- * Signature: (JJ)J
- */
-JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1holder_1commitment_1htlc_1transactions
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ChannelKeys_1sign_1holder_1commitment_1and_1htlcs
   (JNIEnv *, jclass, jlong, jlong);
 
 /*
@@ -1687,6 +1655,30 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TrustedCommitment
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1TrustedCommitmentTransactionNoneZ_1get_1err
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    LDKCResult_CVec_SignatureZNoneZ_result_ok
+ * Signature: (J)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1result_1ok
+  (JNIEnv *, jclass, jlong);
+
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    LDKCResult_CVec_SignatureZNoneZ_get_ok
+ * Signature: (J)[[B
+ */
+JNIEXPORT jobjectArray JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1ok
+  (JNIEnv *, jclass, jlong);
+
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    LDKCResult_CVec_SignatureZNoneZ_get_err
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LDKCResult_1CVec_1SignatureZNoneZ_1get_1err
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    LDKCVec_RouteHopZ_new
@@ -2327,6 +2319,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NoneChannelMonitorUp
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NoneChannelMonitorUpdateErrZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NoneChannelMonitorUpdateErrZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NoneChannelMonitorUpdateErrZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CVec_MonitorEventZ_free
@@ -2383,6 +2383,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NoneMonitorUpdateErr
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NoneMonitorUpdateErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NoneMonitorUpdateErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NoneMonitorUpdateErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    C2Tuple_OutPointScriptZ_free
@@ -2407,6 +2415,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_C2Tuple_1OutPointScriptZ_1new
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1TransactionZ_1free
   (JNIEnv *, jclass, jobjectArray);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    C2Tuple_u32TxOutZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u32TxOutZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    C2Tuple_u32TxOutZ_free
@@ -2495,6 +2511,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHashCh
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1C2Tuple_1BlockHashChannelMonitorZDecodeErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    C2Tuple_u64u64Z_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_C2Tuple_1u64u64Z_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    C2Tuple_u64u64Z_free
@@ -2535,6 +2559,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDescr
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDescriptorDecodeErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_SpendableOutputDescriptorDecodeErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDescriptorDecodeErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CVec_SignatureZ_free
@@ -2543,6 +2575,14 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1SpendableOutputDescri
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CVec_1SignatureZ_1free
   (JNIEnv *, jclass, jobjectArray);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    C2Tuple_SignatureCVec_SignatureZZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_C2Tuple_1SignatureCVec_1SignatureZZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    C2Tuple_SignatureCVec_SignatureZZ_free
@@ -2623,38 +2663,6 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1SignatureNoneZ_1free
 JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1SignatureNoneZ_1clone
   (JNIEnv *, jclass, jlong);
 
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    CResult_CVec_SignatureZNoneZ_ok
- * Signature: ([[B)J
- */
-JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1ok
-  (JNIEnv *, jclass, jobjectArray);
-
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    CResult_CVec_SignatureZNoneZ_err
- * Signature: ()J
- */
-JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1err
-  (JNIEnv *, jclass);
-
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    CResult_CVec_SignatureZNoneZ_free
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1free
-  (JNIEnv *, jclass, jlong);
-
-/*
- * Class:     org_ldk_impl_bindings
- * Method:    CResult_CVec_SignatureZNoneZ_clone
- * Signature: (J)J
- */
-JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1clone
-  (JNIEnv *, jclass, jlong);
-
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_ChanKeySignerDecodeErrorZ_ok
@@ -2679,6 +2687,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1ChanKeySignerDecodeE
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1ChanKeySignerDecodeErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_ChanKeySignerDecodeErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1ChanKeySignerDecodeErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_InMemoryChannelKeysDecodeErrorZ_ok
@@ -2727,6 +2743,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1TxOutAccessErrorZ_1e
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1TxOutAccessErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_TxOutAccessErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1TxOutAccessErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_NoneAPIErrorZ_ok
@@ -2783,6 +2807,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NonePaymentSendFailu
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NonePaymentSendFailureZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NonePaymentSendFailureZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NonePaymentSendFailureZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CVec_NetAddressZ_free
@@ -2863,6 +2895,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NetAddressu8Z_1err
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NetAddressu8Z_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NetAddressu8Z_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NetAddressu8Z_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_CResult_NetAddressu8ZDecodeErrorZ_ok
@@ -2951,6 +2991,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1boolLightningErrorZ_
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1boolLightningErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_boolLightningErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1boolLightningErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free
@@ -3007,6 +3055,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NoneLightningErrorZ_
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NoneLightningErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NoneLightningErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NoneLightningErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_ChannelReestablishDecodeErrorZ_ok
@@ -3359,6 +3415,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1u8ZPeerHandleE
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1u8ZPeerHandleErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_CVec_u8ZPeerHandleErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1u8ZPeerHandleErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_NonePeerHandleErrorZ_ok
@@ -3383,6 +3447,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NonePeerHandleErrorZ
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NonePeerHandleErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NonePeerHandleErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NonePeerHandleErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_boolPeerHandleErrorZ_ok
@@ -3407,6 +3479,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1boolPeerHandleErrorZ
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1boolPeerHandleErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_boolPeerHandleErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1boolPeerHandleErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_SecretKeySecpErrorZ_ok
@@ -3503,6 +3583,38 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1TrustedCommitmentTra
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1TrustedCommitmentTransactionNoneZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_CVec_SignatureZNoneZ_ok
+ * Signature: ([[B)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1ok
+  (JNIEnv *, jclass, jobjectArray);
+
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_CVec_SignatureZNoneZ_err
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1err
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_CVec_SignatureZNoneZ_free
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1free
+  (JNIEnv *, jclass, jlong);
+
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_CVec_SignatureZNoneZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1CVec_1SignatureZNoneZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CVec_RouteHopZ_free
@@ -3623,6 +3735,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NodeAnnouncementInfo
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NodeAnnouncementInfoDecodeErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NodeAnnouncementInfoDecodeErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NodeAnnouncementInfoDecodeErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_NodeInfoDecodeErrorZ_ok
@@ -3647,6 +3767,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NodeInfoDecodeErrorZ
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_CResult_1NodeInfoDecodeErrorZ_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    CResult_NodeInfoDecodeErrorZ_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_CResult_1NodeInfoDecodeErrorZ_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    CResult_NetworkGraphDecodeErrorZ_ok
@@ -4383,6 +4511,14 @@ JNIEXPORT jobject JNICALL Java_org_ldk_impl_bindings_ChannelMonitorUpdateErr_1cl
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_MonitorUpdateError_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    MonitorUpdateError_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_MonitorUpdateError_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    MonitorEvent_free
@@ -4439,6 +4575,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_HTLCUpdate_1read
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    ChannelMonitor_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ChannelMonitor_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    ChannelMonitor_write
@@ -5047,6 +5191,14 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelDetails_1set_1is_1live
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_PaymentSendFailure_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    PaymentSendFailure_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_PaymentSendFailure_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    ChannelManager_new
@@ -5090,9 +5242,9 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ChannelManager_1close_1channe
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    ChannelManager_force_close_channel
- * Signature: (J[B)V
+ * Signature: (J[B)J
  */
-JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_ChannelManager_1force_1close_1channel
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ChannelManager_1force_1close_1channel
   (JNIEnv *, jclass, jlong, jbyteArray);
 
 /*
@@ -5351,6 +5503,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_C2Tuple_1BlockHashChannelMana
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_DecodeError_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    DecodeError_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_DecodeError_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    Init_free
@@ -8063,6 +8223,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_ErrorAction_1clone
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_LightningError_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    LightningError_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_LightningError_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    LightningError_get_err
@@ -8791,6 +8959,14 @@ JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_SocketDescriptor_1free
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_PeerHandleError_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    PeerHandleError_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_PeerHandleError_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    PeerHandleError_get_no_connection_possible
@@ -10247,6 +10423,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_NetGraphMsgHandler_1as_1Messa
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_DirectionalChannelInfo_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    DirectionalChannelInfo_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_DirectionalChannelInfo_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    DirectionalChannelInfo_get_last_update
@@ -10559,6 +10743,14 @@ JNIEXPORT jbyteArray JNICALL Java_org_ldk_impl_bindings_RoutingFees_1write
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    NodeAnnouncementInfo_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    NodeAnnouncementInfo_get_features
@@ -10679,6 +10871,14 @@ JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_NodeAnnouncementInfo_1read
 JNIEXPORT void JNICALL Java_org_ldk_impl_bindings_NodeInfo_1free
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_ldk_impl_bindings
+ * Method:    NodeInfo_clone
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL Java_org_ldk_impl_bindings_NodeInfo_1clone
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_ldk_impl_bindings
  * Method:    NodeInfo_set_channels
index 54ab899b0bf16926b5393973a517b4e14a1cbcd8..a383cb9d6749a4218c060c3333fd0019e32d0eb8 100644 (file)
@@ -271,19 +271,12 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_u64u64Z_new(int64
        ret->b = b;
        return (long)ret;
 }
-static inline LDKC2Tuple_u64u64Z C2Tuple_u64u64Z_clone(const LDKC2Tuple_u64u64Z *orig) {
-       LDKC2Tuple_u64u64Z ret = {
-               .a = orig->a,
-               .b = orig->b,
-       };
-       return ret;
-}
 int64_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_u64u64Z_get_a(uint32_t ptr) {
-       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)ptr;
+       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)(ptr & ~1);
        return tuple->a;
 }
 int64_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_u64u64Z_get_b(uint32_t ptr) {
-       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)ptr;
+       LDKC2Tuple_u64u64Z *tuple = (LDKC2Tuple_u64u64Z*)(ptr & ~1);
        return tuple->b;
 }
 uint32_t __attribute__((visibility("default"))) TS_LDKSpendableOutputDescriptor_ref_from_ptr(uint32_t ptr) {
@@ -294,7 +287,7 @@ uint32_t __attribute__((visibility("default"))) TS_LDKSpendableOutputDescriptor_
                        CHECK((((long)outpoint_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
                        CHECK((((long)&outpoint_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
                        long outpoint_ref = (long)outpoint_var.inner & ~1;
-                       long output_ref = (long)&obj->static_output.output;
+                       long output_ref = ((long)&obj->static_output.output) | 1;
                        return 0 /* LDKSpendableOutputDescriptor - StaticOutput */; (void) outpoint_ref; (void) (long)output_ref;
                }
                case LDKSpendableOutputDescriptor_DynamicOutputP2WSH: {
@@ -304,8 +297,8 @@ uint32_t __attribute__((visibility("default"))) TS_LDKSpendableOutputDescriptor_
                        long outpoint_ref = (long)outpoint_var.inner & ~1;
                        int8_tArray per_commitment_point_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
                        memcpy((uint8_t*)(per_commitment_point_arr + 4), obj->dynamic_output_p2wsh.per_commitment_point.compressed_form, 33);
-                       long output_ref = (long)&obj->dynamic_output_p2wsh.output;
-                       long key_derivation_params_ref = (long)&obj->dynamic_output_p2wsh.key_derivation_params;
+                       long output_ref = ((long)&obj->dynamic_output_p2wsh.output) | 1;
+                       long key_derivation_params_ref = (long)(&obj->dynamic_output_p2wsh.key_derivation_params) | 1;
                        int8_tArray revocation_pubkey_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
                        memcpy((uint8_t*)(revocation_pubkey_arr + 4), obj->dynamic_output_p2wsh.revocation_pubkey.compressed_form, 33);
                        return 0 /* LDKSpendableOutputDescriptor - DynamicOutputP2WSH */; (void) outpoint_ref; (void) per_commitment_point_arr; (void) obj->dynamic_output_p2wsh.to_self_delay; (void) (long)output_ref; (void) key_derivation_params_ref; (void) revocation_pubkey_arr;
@@ -315,8 +308,8 @@ uint32_t __attribute__((visibility("default"))) TS_LDKSpendableOutputDescriptor_
                        CHECK((((long)outpoint_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
                        CHECK((((long)&outpoint_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
                        long outpoint_ref = (long)outpoint_var.inner & ~1;
-                       long output_ref = (long)&obj->static_output_counterparty_payment.output;
-                       long key_derivation_params_ref = (long)&obj->static_output_counterparty_payment.key_derivation_params;
+                       long output_ref = ((long)&obj->static_output_counterparty_payment.output) | 1;
+                       long key_derivation_params_ref = (long)(&obj->static_output_counterparty_payment.key_derivation_params) | 1;
                        return 0 /* LDKSpendableOutputDescriptor - StaticOutputCounterpartyPayment */; (void) outpoint_ref; (void) (long)output_ref; (void) key_derivation_params_ref;
                }
                default: abort();
@@ -332,7 +325,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_SpendableOutputDescr
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKSpendableOutputDescriptor arr_elem_conv = *(LDKSpendableOutputDescriptor*)arr_elem;
+                       LDKSpendableOutputDescriptor arr_elem_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -520,11 +513,11 @@ uint32_t __attribute__((visibility("default"))) TS_LDKMessageSendEvent_ref_from_
                case LDKMessageSendEvent_HandleError: {
                        int8_tArray node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
                        memcpy((uint8_t*)(node_id_arr + 4), obj->handle_error.node_id.compressed_form, 33);
-                       long action_ref = (long)&obj->handle_error.action;
+                       long action_ref = ((long)&obj->handle_error.action) | 1;
                        return 0 /* LDKMessageSendEvent - HandleError */; (void) node_id_arr; (void) action_ref;
                }
                case LDKMessageSendEvent_PaymentFailureNetworkUpdate: {
-                       long update_ref = (long)&obj->payment_failure_network_update.update;
+                       long update_ref = ((long)&obj->payment_failure_network_update.update) | 1;
                        return 0 /* LDKMessageSendEvent - PaymentFailureNetworkUpdate */; (void) update_ref;
                }
                case LDKMessageSendEvent_SendChannelRangeQuery: {
@@ -558,7 +551,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_MessageSendEventZ_ne
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKMessageSendEvent arr_elem_conv = *(LDKMessageSendEvent*)arr_elem;
+                       LDKMessageSendEvent arr_elem_conv = *(LDKMessageSendEvent*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -615,7 +608,7 @@ uint32_t __attribute__((visibility("default"))) TS_LDKEvent_ref_from_ptr(uint32_
                        uint32_tArray outputs_arr = init_arr(outputs_var.datalen, sizeof(uint32_t), "Native uint32_tArray Bytes");
                        uint32_t *outputs_arr_ptr = (uint32_t*)(outputs_arr + 4);
                        for (size_t b = 0; b < outputs_var.datalen; b++) {
-                               long arr_conv_27_ref = (long)&outputs_var.data[b];
+                               long arr_conv_27_ref = ((long)&outputs_var.data[b]) | 1;
                                outputs_arr_ptr[b] = arr_conv_27_ref;
                        }
                        return 0 /* LDKEvent - SpendableOutputs */; (void) outputs_arr;
@@ -633,7 +626,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_EventZ_new(uint32_tA
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKEvent arr_elem_conv = *(LDKEvent*)arr_elem;
+                       LDKEvent arr_elem_conv = *(LDKEvent*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -659,11 +652,11 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_usizeTransactionZ
        return (long)ret;
 }
 intptr_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_usizeTransactionZ_get_a(uint32_t ptr) {
-       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)ptr;
+       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)(ptr & ~1);
        return tuple->a;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_usizeTransactionZ_get_b(uint32_t ptr) {
-       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)ptr;
+       LDKC2Tuple_usizeTransactionZ *tuple = (LDKC2Tuple_usizeTransactionZ*)(ptr & ~1);
        LDKTransaction b_var = tuple->b;
        int8_tArray b_arr = init_arr(b_var.datalen, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(b_arr + 4), b_var.data, b_var.datalen);
@@ -679,7 +672,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_C2Tuple_usizeTransac
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKC2Tuple_usizeTransactionZ arr_elem_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_elem;
+                       LDKC2Tuple_usizeTransactionZ arr_elem_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -690,27 +683,16 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NoneChannelMonito
        return ((LDKCResult_NoneChannelMonitorUpdateErrZ*)arg)->result_ok;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_NoneChannelMonitorUpdateErrZ_get_ok(uint32_t arg) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)arg;
+       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NoneChannelMonitorUpdateErrZ_get_err(uint32_t arg) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)arg;
+       LDKCResult_NoneChannelMonitorUpdateErrZ *val = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(arg & ~1);
        CHECK(!val->result_ok);
        uint32_t err_conv = LDKChannelMonitorUpdateErr_to_js((*val->contents.err));
        return err_conv;
 }
-static inline LDKCResult_NoneChannelMonitorUpdateErrZ CResult_NoneChannelMonitorUpdateErrZ_clone(const LDKCResult_NoneChannelMonitorUpdateErrZ *orig) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               res.contents.result = NULL;
-       } else {
-               LDKChannelMonitorUpdateErr* contents = MALLOC(sizeof(LDKChannelMonitorUpdateErr), "LDKChannelMonitorUpdateErr result Err clone");
-               *contents = ChannelMonitorUpdateErr_clone(orig->contents.err);
-               res.contents.err = contents;
-       }
-       return res;
-}
 uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_MonitorEventZ_new(uint32_tArray elems) {
        LDKCVec_MonitorEventZ *ret = MALLOC(sizeof(LDKCVec_MonitorEventZ), "LDKCVec_MonitorEventZ");
        ret->datalen = *((uint32_t*)elems);
@@ -724,8 +706,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_MonitorEventZ_new(ui
                        LDKMonitorEvent arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = MonitorEvent_clone(&arr_elem_conv);
+                       arr_elem_conv = MonitorEvent_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -742,7 +723,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_ChannelMonitorUpd
        return ((LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChannelMonitorUpdateDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)arg;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKChannelMonitorUpdate res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -751,7 +732,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChannelMonitorUpd
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChannelMonitorUpdateDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)arg;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ *val = (LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -763,12 +744,12 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NoneMonitorUpdate
        return ((LDKCResult_NoneMonitorUpdateErrorZ*)arg)->result_ok;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_NoneMonitorUpdateErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)arg;
+       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NoneMonitorUpdateErrorZ_get_err(uint32_t arg) {
-       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)arg;
+       LDKCResult_NoneMonitorUpdateErrorZ *val = (LDKCResult_NoneMonitorUpdateErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKMonitorUpdateError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -781,8 +762,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_OutPointScriptZ_n
        LDKOutPoint a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = OutPoint_clone(&a_conv);
+       a_conv = OutPoint_clone(&a_conv);
        ret->a = a_conv;
        LDKCVec_u8Z b_ref;
        b_ref.datalen = *((uint32_t*)b);
@@ -791,15 +771,8 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_OutPointScriptZ_n
        ret->b = b_ref;
        return (long)ret;
 }
-static inline LDKC2Tuple_OutPointScriptZ C2Tuple_OutPointScriptZ_clone(const LDKC2Tuple_OutPointScriptZ *orig) {
-       LDKC2Tuple_OutPointScriptZ ret = {
-               .a = OutPoint_clone(&orig->a),
-               .b = CVec_u8Z_clone(&orig->b),
-       };
-       return ret;
-}
 uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_OutPointScriptZ_get_a(uint32_t ptr) {
-       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)ptr;
+       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)(ptr & ~1);
        LDKOutPoint a_var = tuple->a;
        CHECK((((long)a_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&a_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -807,7 +780,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_OutPointScriptZ_g
        return a_ref;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_OutPointScriptZ_get_b(uint32_t ptr) {
-       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)ptr;
+       LDKC2Tuple_OutPointScriptZ *tuple = (LDKC2Tuple_OutPointScriptZ*)(ptr & ~1);
        LDKCVec_u8Z b_var = tuple->b;
        int8_tArray b_arr = init_arr(b_var.datalen, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(b_arr + 4), b_var.data, b_var.datalen);
@@ -816,25 +789,18 @@ int8_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_OutPointScript
 uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_u32TxOutZ_new(int32_t a, uint32_t b) {
        LDKC2Tuple_u32TxOutZ* ret = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
        ret->a = a;
-       LDKTxOut b_conv = *(LDKTxOut*)b;
+       LDKTxOut b_conv = *(LDKTxOut*)(((uint64_t)b) & ~1);
        FREE((void*)b);
        ret->b = b_conv;
        return (long)ret;
 }
-static inline LDKC2Tuple_u32TxOutZ C2Tuple_u32TxOutZ_clone(const LDKC2Tuple_u32TxOutZ *orig) {
-       LDKC2Tuple_u32TxOutZ ret = {
-               .a = orig->a,
-               .b = TxOut_clone(&orig->b),
-       };
-       return ret;
-}
 int32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_u32TxOutZ_get_a(uint32_t ptr) {
-       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)ptr;
+       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)(ptr & ~1);
        return tuple->a;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_u32TxOutZ_get_b(uint32_t ptr) {
-       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)ptr;
-       long b_ref = (long)&tuple->b;
+       LDKC2Tuple_u32TxOutZ *tuple = (LDKC2Tuple_u32TxOutZ*)(ptr & ~1);
+       long b_ref = ((long)&tuple->b) | 1;
        return (long)b_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_C2Tuple_u32TxOutZZ_new(uint32_tArray elems) {
@@ -847,7 +813,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_C2Tuple_u32TxOutZZ_n
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKC2Tuple_u32TxOutZ arr_elem_conv = *(LDKC2Tuple_u32TxOutZ*)arr_elem;
+                       LDKC2Tuple_u32TxOutZ arr_elem_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -876,33 +842,26 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_TxidCVec_C2Tuple_
        uint32_t* b_vals = (uint32_t*)(b + 4);
        for (size_t z = 0; z < b_constr.datalen; z++) {
                uint32_t arr_conv_25 = b_vals[z];
-               LDKC2Tuple_u32TxOutZ arr_conv_25_conv = *(LDKC2Tuple_u32TxOutZ*)arr_conv_25;
+               LDKC2Tuple_u32TxOutZ arr_conv_25_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_conv_25) & ~1);
                FREE((void*)arr_conv_25);
                b_constr.data[z] = arr_conv_25_conv;
        }
        ret->b = b_constr;
        return (long)ret;
 }
-static inline LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone(const LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *orig) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ ret = {
-               .a = ThirtyTwoBytes_clone(&orig->a),
-               .b = CVec_C2Tuple_u32TxOutZZ_clone(&orig->b),
-       };
-       return ret;
-}
 int8_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_a(uint32_t ptr) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)ptr;
+       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(ptr & ~1);
        int8_tArray a_arr = init_arr(32, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(a_arr + 4), tuple->a.data, 32);
        return a_arr;
 }
 uint32_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_get_b(uint32_t ptr) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)ptr;
+       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ *tuple = (LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(ptr & ~1);
        LDKCVec_C2Tuple_u32TxOutZZ b_var = tuple->b;
        uint32_tArray b_arr = init_arr(b_var.datalen, sizeof(uint32_t), "Native uint32_tArray Bytes");
        uint32_t *b_arr_ptr = (uint32_t*)(b_arr + 4);
        for (size_t z = 0; z < b_var.datalen; z++) {
-               long arr_conv_25_ref = (long)&b_var.data[z];
+               long arr_conv_25_ref = (long)(&b_var.data[z]) | 1;
                b_arr_ptr[z] = arr_conv_25_ref;
        }
        return b_arr;
@@ -917,20 +876,13 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_C2Tuple_TxidCVec_C2T
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_elem_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)arr_elem;
+                       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_elem_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
        }
        return (long)ret;
 }
-static inline LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_clone(const LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ *orig) {
-       LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ) * orig->datalen, "LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_clone(&orig->data[i]);
-       }
-       return ret;
-}
 uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_SignatureCVec_SignatureZZ_new(int8_tArray a, ptrArray b) {
        LDKC2Tuple_SignatureCVec_SignatureZZ* ret = MALLOC(sizeof(LDKC2Tuple_SignatureCVec_SignatureZZ), "LDKC2Tuple_SignatureCVec_SignatureZZ");
        LDKSignature a_ref;
@@ -955,13 +907,13 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_SignatureCVec_Sig
        return (long)ret;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_SignatureCVec_SignatureZZ_get_a(uint32_t ptr) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)ptr;
+       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)(ptr & ~1);
        int8_tArray a_arr = init_arr(64, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(a_arr + 4), tuple->a.compact_form, 64);
        return a_arr;
 }
 ptrArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_SignatureCVec_SignatureZZ_get_b(uint32_t ptr) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)ptr;
+       LDKC2Tuple_SignatureCVec_SignatureZZ *tuple = (LDKC2Tuple_SignatureCVec_SignatureZZ*)(ptr & ~1);
        LDKCVec_SignatureZ b_var = tuple->b;
        ptrArray b_arr = init_arr(b_var.datalen, sizeof(uint32_t), "Native ptrArray Bytes");
        int8_tArray *b_arr_ptr = (int8_tArray*)(b_arr + 4);
@@ -976,13 +928,13 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_Signature
        return ((LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_ok(uint32_t arg) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)arg;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = (long)(&(*val->contents.result)) | 1;
        return res_ref;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_get_err(uint32_t arg) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)arg;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ *val = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
@@ -990,35 +942,14 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_SignatureNoneZ_re
        return ((LDKCResult_SignatureNoneZ*)arg)->result_ok;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKCResult_SignatureNoneZ_get_ok(uint32_t arg) {
-       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)arg;
+       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)(arg & ~1);
        CHECK(val->result_ok);
        int8_tArray res_arr = init_arr(64, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(res_arr + 4), (*val->contents.result).compact_form, 64);
        return res_arr;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_SignatureNoneZ_get_err(uint32_t arg) {
-       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)arg;
-       CHECK(!val->result_ok);
-       return *val->contents.err;
-}
-jboolean  __attribute__((visibility("default"))) TS_LDKCResult_CVec_SignatureZNoneZ_result_ok(uint32_t arg) {
-       return ((LDKCResult_CVec_SignatureZNoneZ*)arg)->result_ok;
-}
-ptrArray  __attribute__((visibility("default"))) TS_LDKCResult_CVec_SignatureZNoneZ_get_ok(uint32_t arg) {
-       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)arg;
-       CHECK(val->result_ok);
-       LDKCVec_SignatureZ res_var = (*val->contents.result);
-       ptrArray res_arr = init_arr(res_var.datalen, sizeof(uint32_t), "Native ptrArray Bytes");
-       int8_tArray *res_arr_ptr = (int8_tArray*)(res_arr + 4);
-       for (size_t m = 0; m < res_var.datalen; m++) {
-               int8_tArray arr_conv_12_arr = init_arr(64, sizeof(uint8_t), "Native int8_tArray Bytes");
-               memcpy((uint8_t*)(arr_conv_12_arr + 4), res_var.data[m].compact_form, 64);
-               res_arr_ptr[m] = arr_conv_12_arr;
-       }
-       return res_arr;
-}
-void  __attribute__((visibility("default"))) TS_LDKCResult_CVec_SignatureZNoneZ_get_err(uint32_t arg) {
-       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)arg;
+       LDKCResult_SignatureNoneZ *val = (LDKCResult_SignatureNoneZ*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
@@ -1028,8 +959,7 @@ typedef struct LDKChannelKeys_JCalls {
        uint32_t release_commitment_secret_meth;
        uint32_t key_derivation_params_meth;
        uint32_t sign_counterparty_commitment_meth;
-       uint32_t sign_holder_commitment_meth;
-       uint32_t sign_holder_commitment_htlc_transactions_meth;
+       uint32_t sign_holder_commitment_and_htlcs_meth;
        uint32_t sign_justice_transaction_meth;
        uint32_t sign_counterparty_htlc_transaction_meth;
        uint32_t sign_closing_transaction_meth;
@@ -1044,8 +974,7 @@ static void LDKChannelKeys_JCalls_free(void* this_arg) {
                js_free(j_calls->release_commitment_secret_meth);
                js_free(j_calls->key_derivation_params_meth);
                js_free(j_calls->sign_counterparty_commitment_meth);
-               js_free(j_calls->sign_holder_commitment_meth);
-               js_free(j_calls->sign_holder_commitment_htlc_transactions_meth);
+               js_free(j_calls->sign_holder_commitment_and_htlcs_meth);
                js_free(j_calls->sign_justice_transaction_meth);
                js_free(j_calls->sign_counterparty_htlc_transaction_meth);
                js_free(j_calls->sign_closing_transaction_meth);
@@ -1074,15 +1003,14 @@ LDKThirtyTwoBytes release_commitment_secret_jcall(const void* this_arg, uint64_t
 LDKC2Tuple_u64u64Z key_derivation_params_jcall(const void* this_arg) {
        LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
        LDKC2Tuple_u64u64Z* ret = (LDKC2Tuple_u64u64Z*)js_invoke_function_0(j_calls->key_derivation_params_meth);
-       LDKC2Tuple_u64u64Z ret_conv = *(LDKC2Tuple_u64u64Z*)ret;
+       LDKC2Tuple_u64u64Z ret_conv = *(LDKC2Tuple_u64u64Z*)(((uint64_t)ret) & ~1);
        ret_conv = C2Tuple_u64u64Z_clone((LDKC2Tuple_u64u64Z*)ret);
        return ret_conv;
 }
 LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_counterparty_commitment_jcall(const void* this_arg, const LDKCommitmentTransaction * commitment_tx) {
        LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
        LDKCommitmentTransaction commitment_tx_var = *commitment_tx;
-       if (commitment_tx->inner != NULL)
-               commitment_tx_var = CommitmentTransaction_clone(commitment_tx);
+       commitment_tx_var = CommitmentTransaction_clone(commitment_tx);
        CHECK((((long)commitment_tx_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&commitment_tx_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long commitment_tx_ref = (long)commitment_tx_var.inner;
@@ -1090,40 +1018,23 @@ LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_counterparty_commitment_j
                commitment_tx_ref |= 1;
        }
        LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)js_invoke_function_1(j_calls->sign_counterparty_commitment_meth, commitment_tx_ref);
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)ret;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone((LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)ret);
        return ret_conv;
 }
-LDKCResult_SignatureNoneZ sign_holder_commitment_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
+LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_holder_commitment_and_htlcs_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
        LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
        LDKHolderCommitmentTransaction commitment_tx_var = *commitment_tx;
-       if (commitment_tx->inner != NULL)
-               commitment_tx_var = HolderCommitmentTransaction_clone(commitment_tx);
+       commitment_tx_var = HolderCommitmentTransaction_clone(commitment_tx);
        CHECK((((long)commitment_tx_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&commitment_tx_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long commitment_tx_ref = (long)commitment_tx_var.inner;
        if (commitment_tx_var.is_owned) {
                commitment_tx_ref |= 1;
        }
-       LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)js_invoke_function_1(j_calls->sign_holder_commitment_meth, commitment_tx_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
-       ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
-       return ret_conv;
-}
-LDKCResult_CVec_SignatureZNoneZ sign_holder_commitment_htlc_transactions_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
-       LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
-       LDKHolderCommitmentTransaction commitment_tx_var = *commitment_tx;
-       if (commitment_tx->inner != NULL)
-               commitment_tx_var = HolderCommitmentTransaction_clone(commitment_tx);
-       CHECK((((long)commitment_tx_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
-       CHECK((((long)&commitment_tx_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
-       long commitment_tx_ref = (long)commitment_tx_var.inner;
-       if (commitment_tx_var.is_owned) {
-               commitment_tx_ref |= 1;
-       }
-       LDKCResult_CVec_SignatureZNoneZ* ret = (LDKCResult_CVec_SignatureZNoneZ*)js_invoke_function_1(j_calls->sign_holder_commitment_htlc_transactions_meth, commitment_tx_ref);
-       LDKCResult_CVec_SignatureZNoneZ ret_conv = *(LDKCResult_CVec_SignatureZNoneZ*)ret;
-       ret_conv = CResult_CVec_SignatureZNoneZ_clone((LDKCResult_CVec_SignatureZNoneZ*)ret);
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)js_invoke_function_1(j_calls->sign_holder_commitment_and_htlcs_meth, commitment_tx_ref);
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone((LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)ret);
        return ret_conv;
 }
 LDKCResult_SignatureNoneZ sign_justice_transaction_jcall(const void* this_arg, LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (* per_commitment_key)[32], const LDKHTLCOutputInCommitment * htlc) {
@@ -1135,8 +1046,7 @@ LDKCResult_SignatureNoneZ sign_justice_transaction_jcall(const void* this_arg, L
        int8_tArray per_commitment_key_arr = init_arr(32, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(per_commitment_key_arr + 4), *per_commitment_key, 32);
        LDKHTLCOutputInCommitment htlc_var = *htlc;
-       if (htlc->inner != NULL)
-               htlc_var = HTLCOutputInCommitment_clone(htlc);
+       htlc_var = HTLCOutputInCommitment_clone(htlc);
        CHECK((((long)htlc_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&htlc_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long htlc_ref = (long)htlc_var.inner;
@@ -1144,7 +1054,7 @@ LDKCResult_SignatureNoneZ sign_justice_transaction_jcall(const void* this_arg, L
                htlc_ref |= 1;
        }
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)js_invoke_function_5(j_calls->sign_justice_transaction_meth, justice_tx_arr, input, amount, per_commitment_key_arr, htlc_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
@@ -1157,8 +1067,7 @@ LDKCResult_SignatureNoneZ sign_counterparty_htlc_transaction_jcall(const void* t
        int8_tArray per_commitment_point_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(per_commitment_point_arr + 4), per_commitment_point.compressed_form, 33);
        LDKHTLCOutputInCommitment htlc_var = *htlc;
-       if (htlc->inner != NULL)
-               htlc_var = HTLCOutputInCommitment_clone(htlc);
+       htlc_var = HTLCOutputInCommitment_clone(htlc);
        CHECK((((long)htlc_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&htlc_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long htlc_ref = (long)htlc_var.inner;
@@ -1166,7 +1075,7 @@ LDKCResult_SignatureNoneZ sign_counterparty_htlc_transaction_jcall(const void* t
                htlc_ref |= 1;
        }
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)js_invoke_function_5(j_calls->sign_counterparty_htlc_transaction_meth, htlc_tx_arr, input, amount, per_commitment_point_arr, htlc_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
@@ -1177,15 +1086,14 @@ LDKCResult_SignatureNoneZ sign_closing_transaction_jcall(const void* this_arg, L
        memcpy((uint8_t*)(closing_tx_arr + 4), closing_tx_var.data, closing_tx_var.datalen);
        Transaction_free(closing_tx_var);
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)js_invoke_function_1(j_calls->sign_closing_transaction_meth, closing_tx_arr);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
 LDKCResult_SignatureNoneZ sign_channel_announcement_jcall(const void* this_arg, const LDKUnsignedChannelAnnouncement * msg) {
        LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
        LDKUnsignedChannelAnnouncement msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UnsignedChannelAnnouncement_clone(msg);
+       msg_var = UnsignedChannelAnnouncement_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -1193,15 +1101,14 @@ LDKCResult_SignatureNoneZ sign_channel_announcement_jcall(const void* this_arg,
                msg_ref |= 1;
        }
        LDKCResult_SignatureNoneZ* ret = (LDKCResult_SignatureNoneZ*)js_invoke_function_1(j_calls->sign_channel_announcement_meth, msg_ref);
-       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)ret;
+       LDKCResult_SignatureNoneZ ret_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_SignatureNoneZ_clone((LDKCResult_SignatureNoneZ*)ret);
        return ret_conv;
 }
 void ready_channel_jcall(void* this_arg, const LDKChannelTransactionParameters * channel_parameters) {
        LDKChannelKeys_JCalls *j_calls = (LDKChannelKeys_JCalls*) this_arg;
        LDKChannelTransactionParameters channel_parameters_var = *channel_parameters;
-       if (channel_parameters->inner != NULL)
-               channel_parameters_var = ChannelTransactionParameters_clone(channel_parameters);
+       channel_parameters_var = ChannelTransactionParameters_clone(channel_parameters);
        CHECK((((long)channel_parameters_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&channel_parameters_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long channel_parameters_ref = (long)channel_parameters_var.inner;
@@ -1232,8 +1139,7 @@ static inline LDKChannelKeys LDKChannelKeys_init (/*TODO: JS Object Reference */
        LDKChannelPublicKeys pubkeys_conv;
        pubkeys_conv.inner = (void*)(pubkeys & (~1));
        pubkeys_conv.is_owned = (pubkeys & 1) || (pubkeys == 0);
-       if (pubkeys_conv.inner != NULL)
-               pubkeys_conv = ChannelPublicKeys_clone(&pubkeys_conv);
+       pubkeys_conv = ChannelPublicKeys_clone(&pubkeys_conv);
 
        LDKChannelKeys ret = {
                .this_arg = (void*) calls,
@@ -1241,8 +1147,7 @@ static inline LDKChannelKeys LDKChannelKeys_init (/*TODO: JS Object Reference */
                .release_commitment_secret = release_commitment_secret_jcall,
                .key_derivation_params = key_derivation_params_jcall,
                .sign_counterparty_commitment = sign_counterparty_commitment_jcall,
-               .sign_holder_commitment = sign_holder_commitment_jcall,
-               .sign_holder_commitment_htlc_transactions = sign_holder_commitment_htlc_transactions_jcall,
+               .sign_holder_commitment_and_htlcs = sign_holder_commitment_and_htlcs_jcall,
                .sign_justice_transaction = sign_justice_transaction_jcall,
                .sign_counterparty_htlc_transaction = sign_counterparty_htlc_transaction_jcall,
                .sign_closing_transaction = sign_closing_transaction_jcall,
@@ -1292,23 +1197,13 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelKeys_sign_counterpart
        return (long)ret_conv;
 }
 
-uint32_t  __attribute__((visibility("default"))) TS_ChannelKeys_sign_holder_commitment(uint32_t this_arg, uint32_t commitment_tx) {
-       LDKChannelKeys* this_arg_conv = (LDKChannelKeys*)this_arg;
-       LDKHolderCommitmentTransaction commitment_tx_conv;
-       commitment_tx_conv.inner = (void*)(commitment_tx & (~1));
-       commitment_tx_conv.is_owned = false;
-       LDKCResult_SignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SignatureNoneZ), "LDKCResult_SignatureNoneZ");
-       *ret_conv = (this_arg_conv->sign_holder_commitment)(this_arg_conv->this_arg, &commitment_tx_conv);
-       return (long)ret_conv;
-}
-
-uint32_t  __attribute__((visibility("default"))) TS_ChannelKeys_sign_holder_commitment_htlc_transactions(uint32_t this_arg, uint32_t commitment_tx) {
+uint32_t  __attribute__((visibility("default"))) TS_ChannelKeys_sign_holder_commitment_and_htlcs(uint32_t this_arg, uint32_t commitment_tx) {
        LDKChannelKeys* this_arg_conv = (LDKChannelKeys*)this_arg;
        LDKHolderCommitmentTransaction commitment_tx_conv;
        commitment_tx_conv.inner = (void*)(commitment_tx & (~1));
        commitment_tx_conv.is_owned = false;
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = (this_arg_conv->sign_holder_commitment_htlc_transactions)(this_arg_conv->this_arg, &commitment_tx_conv);
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ), "LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ");
+       *ret_conv = (this_arg_conv->sign_holder_commitment_and_htlcs)(this_arg_conv->this_arg, &commitment_tx_conv);
        return (long)ret_conv;
 }
 
@@ -1414,18 +1309,18 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_BlockHashChannelM
        LDKChannelMonitor b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       b_conv = ChannelMonitor_clone(&b_conv);
        ret->b = b_conv;
        return (long)ret;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_BlockHashChannelMonitorZ_get_a(uint32_t ptr) {
-       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)ptr;
+       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)(ptr & ~1);
        int8_tArray a_arr = init_arr(32, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(a_arr + 4), tuple->a.data, 32);
        return a_arr;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_BlockHashChannelMonitorZ_get_b(uint32_t ptr) {
-       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)ptr;
+       LDKC2Tuple_BlockHashChannelMonitorZ *tuple = (LDKC2Tuple_BlockHashChannelMonitorZ*)(ptr & ~1);
        LDKChannelMonitor b_var = tuple->b;
        CHECK((((long)b_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&b_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -1436,13 +1331,13 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_BlockHash
        return ((LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = (long)(&(*val->contents.result)) | 1;
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1454,13 +1349,13 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_SpendableOutputDe
        return ((LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)arg;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = ((long)&(*val->contents.result)) | 1;
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_SpendableOutputDescriptorDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)arg;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ *val = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1472,14 +1367,14 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_ChanKeySignerDeco
        return ((LDKCResult_ChanKeySignerDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChanKeySignerDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)arg;
+       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKChannelKeys* ret = MALLOC(sizeof(LDKChannelKeys), "LDKChannelKeys");
-       *ret = (*val->contents.result);
+       *ret = ChannelKeys_clone(&(*val->contents.result));
        return (long)ret;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChanKeySignerDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)arg;
+       LDKCResult_ChanKeySignerDecodeErrorZ *val = (LDKCResult_ChanKeySignerDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1491,7 +1386,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_InMemoryChannelKe
        return ((LDKCResult_InMemoryChannelKeysDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_InMemoryChannelKeysDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)arg;
+       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKInMemoryChannelKeys res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1500,7 +1395,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_InMemoryChannelKe
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_InMemoryChannelKeysDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)arg;
+       LDKCResult_InMemoryChannelKeysDecodeErrorZ *val = (LDKCResult_InMemoryChannelKeysDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1512,30 +1407,17 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_TxOutAccessErrorZ
        return ((LDKCResult_TxOutAccessErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_TxOutAccessErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)arg;
+       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = ((long)&(*val->contents.result)) | 1;
        return (long)res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_TxOutAccessErrorZ_get_err(uint32_t arg) {
-       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)arg;
+       LDKCResult_TxOutAccessErrorZ *val = (LDKCResult_TxOutAccessErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        uint32_t err_conv = LDKAccessError_to_js((*val->contents.err));
        return err_conv;
 }
-static inline LDKCResult_TxOutAccessErrorZ CResult_TxOutAccessErrorZ_clone(const LDKCResult_TxOutAccessErrorZ *orig) {
-       LDKCResult_TxOutAccessErrorZ res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               LDKTxOut* contents = MALLOC(sizeof(LDKTxOut), "LDKTxOut result OK clone");
-               *contents = TxOut_clone(orig->contents.result);
-               res.contents.result = contents;
-       } else {
-               LDKAccessError* contents = MALLOC(sizeof(LDKAccessError), "LDKAccessError result Err clone");
-               *contents = AccessError_clone(orig->contents.err);
-               res.contents.err = contents;
-       }
-       return res;
-}
 uint32_t __attribute__((visibility("default"))) TS_LDKAPIError_ref_from_ptr(uint32_t ptr) {
        LDKAPIError *obj = (LDKAPIError*)ptr;
        switch(obj->tag) {
@@ -1572,27 +1454,16 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NoneAPIErrorZ_res
        return ((LDKCResult_NoneAPIErrorZ*)arg)->result_ok;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_NoneAPIErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)arg;
+       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NoneAPIErrorZ_get_err(uint32_t arg) {
-       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)arg;
+       LDKCResult_NoneAPIErrorZ *val = (LDKCResult_NoneAPIErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
-       long err_ref = (long)&(*val->contents.err);
+       long err_ref = ((long)&(*val->contents.err)) | 1;
        return err_ref;
 }
-static inline LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_clone(const LDKCResult_NoneAPIErrorZ *orig) {
-       LDKCResult_NoneAPIErrorZ res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               res.contents.result = NULL;
-       } else {
-               LDKAPIError* contents = MALLOC(sizeof(LDKAPIError), "LDKAPIError result Err clone");
-               *contents = APIError_clone(orig->contents.err);
-               res.contents.err = contents;
-       }
-       return res;
-}
 uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_ChannelDetailsZ_new(uint32_tArray elems) {
        LDKCVec_ChannelDetailsZ *ret = MALLOC(sizeof(LDKCVec_ChannelDetailsZ), "LDKCVec_ChannelDetailsZ");
        ret->datalen = *((uint32_t*)elems);
@@ -1606,8 +1477,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_ChannelDetailsZ_new(
                        LDKChannelDetails arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = ChannelDetails_clone(&arr_elem_conv);
+                       arr_elem_conv = ChannelDetails_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -1624,12 +1494,12 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NonePaymentSendFa
        return ((LDKCResult_NonePaymentSendFailureZ*)arg)->result_ok;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_NonePaymentSendFailureZ_get_ok(uint32_t arg) {
-       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)arg;
+       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NonePaymentSendFailureZ_get_err(uint32_t arg) {
-       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)arg;
+       LDKCResult_NonePaymentSendFailureZ *val = (LDKCResult_NonePaymentSendFailureZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPaymentSendFailure err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -1673,7 +1543,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_NetAddressZ_new(uint
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKNetAddress arr_elem_conv = *(LDKNetAddress*)arr_elem;
+                       LDKNetAddress arr_elem_conv = *(LDKNetAddress*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
@@ -1700,12 +1570,19 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_ChannelMonitorZ_new(
                        LDKChannelMonitor arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       // Warning: we may need a move here but can't clone!
+                       arr_elem_conv = ChannelMonitor_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
        return (long)ret;
 }
+static inline LDKCVec_ChannelMonitorZ CVec_ChannelMonitorZ_clone(const LDKCVec_ChannelMonitorZ *orig) {
+       LDKCVec_ChannelMonitorZ ret = { .data = MALLOC(sizeof(LDKChannelMonitor) * orig->datalen, "LDKCVec_ChannelMonitorZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ChannelMonitor_clone(&orig->data[i]);
+       }
+       return ret;
+}
 typedef struct LDKWatch_JCalls {
        atomic_size_t refcnt;
        uint32_t watch_channel_meth;
@@ -1738,7 +1615,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ watch_channel_jcall(const void* this_arg
                monitor_ref |= 1;
        }
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)js_invoke_function_2(j_calls->watch_channel_meth, funding_txo_ref, monitor_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -1759,7 +1636,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_channel_jcall(const void* this_ar
                update_ref |= 1;
        }
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)js_invoke_function_2(j_calls->update_channel_meth, funding_txo_ref, update_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -1778,8 +1655,7 @@ LDKCVec_MonitorEventZ release_pending_monitor_events_jcall(const void* this_arg)
                LDKMonitorEvent arr_conv_14_conv;
                arr_conv_14_conv.inner = (void*)(arr_conv_14 & (~1));
                arr_conv_14_conv.is_owned = (arr_conv_14 & 1) || (arr_conv_14 == 0);
-               if (arr_conv_14_conv.inner != NULL)
-                       arr_conv_14_conv = MonitorEvent_clone(&arr_conv_14_conv);
+               arr_conv_14_conv = MonitorEvent_clone(&arr_conv_14_conv);
                arg_constr.data[o] = arr_conv_14_conv;
        }
        return arg_constr;
@@ -1813,12 +1689,11 @@ uint32_t  __attribute__((visibility("default"))) TS_Watch_watch_channel(uint32_t
        LDKOutPoint funding_txo_conv;
        funding_txo_conv.inner = (void*)(funding_txo & (~1));
        funding_txo_conv.is_owned = (funding_txo & 1) || (funding_txo == 0);
-       if (funding_txo_conv.inner != NULL)
-               funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
        LDKChannelMonitor monitor_conv;
        monitor_conv.inner = (void*)(monitor & (~1));
        monitor_conv.is_owned = (monitor & 1) || (monitor == 0);
-       // Warning: we may need a move here but can't clone!
+       monitor_conv = ChannelMonitor_clone(&monitor_conv);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneChannelMonitorUpdateErrZ), "LDKCResult_NoneChannelMonitorUpdateErrZ");
        *ret_conv = (this_arg_conv->watch_channel)(this_arg_conv->this_arg, funding_txo_conv, monitor_conv);
        return (long)ret_conv;
@@ -1829,13 +1704,11 @@ uint32_t  __attribute__((visibility("default"))) TS_Watch_update_channel(uint32_
        LDKOutPoint funding_txo_conv;
        funding_txo_conv.inner = (void*)(funding_txo & (~1));
        funding_txo_conv.is_owned = (funding_txo & 1) || (funding_txo == 0);
-       if (funding_txo_conv.inner != NULL)
-               funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
        LDKChannelMonitorUpdate update_conv;
        update_conv.inner = (void*)(update & (~1));
        update_conv.is_owned = (update & 1) || (update == 0);
-       if (update_conv.inner != NULL)
-               update_conv = ChannelMonitorUpdate_clone(&update_conv);
+       update_conv = ChannelMonitorUpdate_clone(&update_conv);
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneChannelMonitorUpdateErrZ), "LDKCResult_NoneChannelMonitorUpdateErrZ");
        *ret_conv = (this_arg_conv->update_channel)(this_arg_conv->this_arg, funding_txo_conv, update_conv);
        return (long)ret_conv;
@@ -1960,7 +1833,7 @@ LDKPublicKey get_shutdown_pubkey_jcall(const void* this_arg) {
 LDKChannelKeys get_channel_keys_jcall(const void* this_arg, bool inbound, uint64_t channel_value_satoshis) {
        LDKKeysInterface_JCalls *j_calls = (LDKKeysInterface_JCalls*) this_arg;
        LDKChannelKeys* ret = (LDKChannelKeys*)js_invoke_function_2(j_calls->get_channel_keys_meth, inbound, channel_value_satoshis);
-       LDKChannelKeys ret_conv = *(LDKChannelKeys*)ret;
+       LDKChannelKeys ret_conv = *(LDKChannelKeys*)(((uint64_t)ret) & ~1);
        ret_conv = ChannelKeys_clone(ret);
        return ret_conv;
 }
@@ -1978,8 +1851,8 @@ LDKCResult_ChanKeySignerDecodeErrorZ read_chan_signer_jcall(const void* this_arg
        int8_tArray reader_arr = init_arr(reader_var.datalen, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(reader_arr + 4), reader_var.data, reader_var.datalen);
        LDKCResult_ChanKeySignerDecodeErrorZ* ret = (LDKCResult_ChanKeySignerDecodeErrorZ*)js_invoke_function_1(j_calls->read_chan_signer_meth, reader_arr);
-       LDKCResult_ChanKeySignerDecodeErrorZ ret_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_ChanKeySignerDecodeErrorZ ret_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_ChanKeySignerDecodeErrorZ_clone((LDKCResult_ChanKeySignerDecodeErrorZ*)ret);
        return ret_conv;
 }
 static void* LDKKeysInterface_JCalls_clone(const void* this_arg) {
@@ -2149,18 +2022,18 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_BlockHashChannelM
        LDKChannelManager b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelManager
        ret->b = b_conv;
        return (long)ret;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKC2Tuple_BlockHashChannelManagerZ_get_a(uint32_t ptr) {
-       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)ptr;
+       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)(ptr & ~1);
        int8_tArray a_arr = init_arr(32, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(a_arr + 4), tuple->a.data, 32);
        return a_arr;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKC2Tuple_BlockHashChannelManagerZ_get_b(uint32_t ptr) {
-       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)ptr;
+       LDKC2Tuple_BlockHashChannelManagerZ *tuple = (LDKC2Tuple_BlockHashChannelManagerZ*)(ptr & ~1);
        LDKChannelManager b_var = tuple->b;
        CHECK((((long)b_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&b_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -2171,13 +2044,13 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_BlockHash
        return ((LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = (long)(&(*val->contents.result)) | 1;
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)arg;
+       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ *val = (LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2189,34 +2062,21 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NetAddressu8Z_res
        return ((LDKCResult_NetAddressu8Z*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NetAddressu8Z_get_ok(uint32_t arg) {
-       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)arg;
+       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)(arg & ~1);
        CHECK(val->result_ok);
-       long res_ref = (long)&(*val->contents.result);
+       long res_ref = ((long)&(*val->contents.result)) | 1;
        return res_ref;
 }
 int8_t  __attribute__((visibility("default"))) TS_LDKCResult_NetAddressu8Z_get_err(uint32_t arg) {
-       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)arg;
+       LDKCResult_NetAddressu8Z *val = (LDKCResult_NetAddressu8Z*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
-static inline LDKCResult_NetAddressu8Z CResult_NetAddressu8Z_clone(const LDKCResult_NetAddressu8Z *orig) {
-       LDKCResult_NetAddressu8Z res = { .result_ok = orig->result_ok };
-       if (orig->result_ok) {
-               LDKNetAddress* contents = MALLOC(sizeof(LDKNetAddress), "LDKNetAddress result OK clone");
-               *contents = NetAddress_clone(orig->contents.result);
-               res.contents.result = contents;
-       } else {
-               int8_t* contents = MALLOC(sizeof(int8_t), "int8_t result Err clone");
-               *contents = *orig->contents.err;
-               res.contents.err = contents;
-       }
-       return res;
-}
 jboolean  __attribute__((visibility("default"))) TS_LDKCResult_CResult_NetAddressu8ZDecodeErrorZ_result_ok(uint32_t arg) {
        return ((LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_CResult_NetAddressu8ZDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)arg;
+       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKCResult_NetAddressu8Z* res_conv = MALLOC(sizeof(LDKCResult_NetAddressu8Z), "LDKCResult_NetAddressu8Z");
        *res_conv = (*val->contents.result);
@@ -2224,7 +2084,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_CResult_NetAddres
        return (long)res_conv;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_CResult_NetAddressu8ZDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)arg;
+       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ *val = (LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2264,8 +2124,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_UpdateAddHTLCZ_new(u
                        LDKUpdateAddHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateAddHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateAddHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -2291,8 +2150,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_UpdateFulfillHTLCZ_n
                        LDKUpdateFulfillHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateFulfillHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateFulfillHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -2318,8 +2176,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_UpdateFailHTLCZ_new(
                        LDKUpdateFailHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateFailHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateFailHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -2345,8 +2202,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_UpdateFailMalformedH
                        LDKUpdateFailMalformedHTLC arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = UpdateFailMalformedHTLC_clone(&arr_elem_conv);
+                       arr_elem_conv = UpdateFailMalformedHTLC_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -2363,12 +2219,12 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_boolLightningErro
        return ((LDKCResult_boolLightningErrorZ*)arg)->result_ok;
 }
 jboolean  __attribute__((visibility("default"))) TS_LDKCResult_boolLightningErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)arg;
+       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_boolLightningErrorZ_get_err(uint32_t arg) {
-       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)arg;
+       LDKCResult_boolLightningErrorZ *val = (LDKCResult_boolLightningErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKLightningError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2381,33 +2237,22 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC3Tuple_ChannelAnnounceme
        LDKChannelAnnouncement a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = ChannelAnnouncement_clone(&a_conv);
+       a_conv = ChannelAnnouncement_clone(&a_conv);
        ret->a = a_conv;
        LDKChannelUpdate b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       if (b_conv.inner != NULL)
-               b_conv = ChannelUpdate_clone(&b_conv);
+       b_conv = ChannelUpdate_clone(&b_conv);
        ret->b = b_conv;
        LDKChannelUpdate c_conv;
        c_conv.inner = (void*)(c & (~1));
        c_conv.is_owned = (c & 1) || (c == 0);
-       if (c_conv.inner != NULL)
-               c_conv = ChannelUpdate_clone(&c_conv);
+       c_conv = ChannelUpdate_clone(&c_conv);
        ret->c = c_conv;
        return (long)ret;
 }
-static inline LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(const LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *orig) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ ret = {
-               .a = ChannelAnnouncement_clone(&orig->a),
-               .b = ChannelUpdate_clone(&orig->b),
-               .c = ChannelUpdate_clone(&orig->c),
-       };
-       return ret;
-}
 uint32_t  __attribute__((visibility("default"))) TS_LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_a(uint32_t ptr) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)ptr;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(ptr & ~1);
        LDKChannelAnnouncement a_var = tuple->a;
        CHECK((((long)a_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&a_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -2415,7 +2260,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC3Tuple_ChannelAnnounceme
        return a_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_b(uint32_t ptr) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)ptr;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(ptr & ~1);
        LDKChannelUpdate b_var = tuple->b;
        CHECK((((long)b_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&b_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -2423,7 +2268,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKC3Tuple_ChannelAnnounceme
        return b_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_c(uint32_t ptr) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)ptr;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ *tuple = (LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(ptr & ~1);
        LDKChannelUpdate c_var = tuple->c;
        CHECK((((long)c_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&c_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -2440,20 +2285,13 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_C3Tuple_ChannelAnnou
                uint32_t *java_elems = (uint32_t*)(elems + 4);
                for (size_t i = 0; i < ret->datalen; i++) {
                        uint32_t arr_elem = java_elems[i];
-                       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_elem_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)arr_elem;
+                       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_elem_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)arr_elem) & ~1);
                        FREE((void*)arr_elem);
                        ret->data[i] = arr_elem_conv;
                }
        }
        return (long)ret;
 }
-static inline LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ CVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ_clone(const LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ *orig) {
-       LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ) * orig->datalen, "LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_clone(&orig->data[i]);
-       }
-       return ret;
-}
 uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_NodeAnnouncementZ_new(uint32_tArray elems) {
        LDKCVec_NodeAnnouncementZ *ret = MALLOC(sizeof(LDKCVec_NodeAnnouncementZ), "LDKCVec_NodeAnnouncementZ");
        ret->datalen = *((uint32_t*)elems);
@@ -2467,8 +2305,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_NodeAnnouncementZ_ne
                        LDKNodeAnnouncement arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = NodeAnnouncement_clone(&arr_elem_conv);
+                       arr_elem_conv = NodeAnnouncement_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -2485,12 +2322,12 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NoneLightningErro
        return ((LDKCResult_NoneLightningErrorZ*)arg)->result_ok;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_NoneLightningErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)arg;
+       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NoneLightningErrorZ_get_err(uint32_t arg) {
-       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)arg;
+       LDKCResult_NoneLightningErrorZ *val = (LDKCResult_NoneLightningErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKLightningError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2502,7 +2339,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_ChannelReestablis
        return ((LDKCResult_ChannelReestablishDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChannelReestablishDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)arg;
+       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKChannelReestablish res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2511,7 +2348,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChannelReestablis
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ChannelReestablishDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)arg;
+       LDKCResult_ChannelReestablishDecodeErrorZ *val = (LDKCResult_ChannelReestablishDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2523,7 +2360,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_InitDecodeErrorZ_
        return ((LDKCResult_InitDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_InitDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)arg;
+       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKInit res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2532,7 +2369,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_InitDecodeErrorZ_
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_InitDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)arg;
+       LDKCResult_InitDecodeErrorZ *val = (LDKCResult_InitDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2544,7 +2381,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_PingDecodeErrorZ_
        return ((LDKCResult_PingDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_PingDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)arg;
+       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKPing res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2553,7 +2390,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_PingDecodeErrorZ_
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_PingDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)arg;
+       LDKCResult_PingDecodeErrorZ *val = (LDKCResult_PingDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2565,7 +2402,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_PongDecodeErrorZ_
        return ((LDKCResult_PongDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_PongDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)arg;
+       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKPong res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2574,7 +2411,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_PongDecodeErrorZ_
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_PongDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)arg;
+       LDKCResult_PongDecodeErrorZ *val = (LDKCResult_PongDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2586,7 +2423,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelAn
        return ((LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKUnsignedChannelAnnouncement res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2595,7 +2432,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelAn
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2607,7 +2444,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelUp
        return ((LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelUpdateDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKUnsignedChannelUpdate res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2616,7 +2453,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelUp
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedChannelUpdateDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)arg;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ *val = (LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2628,7 +2465,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_ErrorMessageDecod
        return ((LDKCResult_ErrorMessageDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ErrorMessageDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)arg;
+       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKErrorMessage res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2637,7 +2474,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ErrorMessageDecod
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ErrorMessageDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)arg;
+       LDKCResult_ErrorMessageDecodeErrorZ *val = (LDKCResult_ErrorMessageDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2649,7 +2486,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedNodeAnnou
        return ((LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKUnsignedNodeAnnouncement res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2658,7 +2495,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedNodeAnnou
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)arg;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ *val = (LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2670,7 +2507,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_QueryShortChannel
        return ((LDKCResult_QueryShortChannelIdsDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_QueryShortChannelIdsDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)arg;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKQueryShortChannelIds res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2679,7 +2516,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_QueryShortChannel
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_QueryShortChannelIdsDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)arg;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ *val = (LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2691,7 +2528,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_ReplyShortChannel
        return ((LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)arg;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKReplyShortChannelIdsEnd res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2700,7 +2537,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ReplyShortChannel
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)arg;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ *val = (LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2712,7 +2549,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_QueryChannelRange
        return ((LDKCResult_QueryChannelRangeDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_QueryChannelRangeDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKQueryChannelRange res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2721,7 +2558,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_QueryChannelRange
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_QueryChannelRangeDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_QueryChannelRangeDecodeErrorZ *val = (LDKCResult_QueryChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2733,7 +2570,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_ReplyChannelRange
        return ((LDKCResult_ReplyChannelRangeDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ReplyChannelRangeDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKReplyChannelRange res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2742,7 +2579,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ReplyChannelRange
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_ReplyChannelRangeDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)arg;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ *val = (LDKCResult_ReplyChannelRangeDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2754,7 +2591,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_GossipTimestampFi
        return ((LDKCResult_GossipTimestampFilterDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_GossipTimestampFilterDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)arg;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKGossipTimestampFilter res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2763,7 +2600,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_GossipTimestampFi
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_GossipTimestampFilterDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)arg;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ *val = (LDKCResult_GossipTimestampFilterDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2775,7 +2612,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_CVec_u8ZPeerHandl
        return ((LDKCResult_CVec_u8ZPeerHandleErrorZ*)arg)->result_ok;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKCResult_CVec_u8ZPeerHandleErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)arg;
+       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKCVec_u8Z res_var = (*val->contents.result);
        int8_tArray res_arr = init_arr(res_var.datalen, sizeof(uint8_t), "Native int8_tArray Bytes");
@@ -2783,7 +2620,7 @@ int8_tArray  __attribute__((visibility("default"))) TS_LDKCResult_CVec_u8ZPeerHa
        return res_arr;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_CVec_u8ZPeerHandleErrorZ_get_err(uint32_t arg) {
-       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)arg;
+       LDKCResult_CVec_u8ZPeerHandleErrorZ *val = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPeerHandleError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2795,12 +2632,12 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NonePeerHandleErr
        return ((LDKCResult_NonePeerHandleErrorZ*)arg)->result_ok;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_NonePeerHandleErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)arg;
+       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NonePeerHandleErrorZ_get_err(uint32_t arg) {
-       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)arg;
+       LDKCResult_NonePeerHandleErrorZ *val = (LDKCResult_NonePeerHandleErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPeerHandleError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2812,12 +2649,12 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_boolPeerHandleErr
        return ((LDKCResult_boolPeerHandleErrorZ*)arg)->result_ok;
 }
 jboolean  __attribute__((visibility("default"))) TS_LDKCResult_boolPeerHandleErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)arg;
+       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        return *val->contents.result;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_boolPeerHandleErrorZ_get_err(uint32_t arg) {
-       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)arg;
+       LDKCResult_boolPeerHandleErrorZ *val = (LDKCResult_boolPeerHandleErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKPeerHandleError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2829,14 +2666,14 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_SecretKeySecpErro
        return ((LDKCResult_SecretKeySecpErrorZ*)arg)->result_ok;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKCResult_SecretKeySecpErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)arg;
+       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        int8_tArray res_arr = init_arr(32, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(res_arr + 4), (*val->contents.result).bytes, 32);
        return res_arr;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_SecretKeySecpErrorZ_get_err(uint32_t arg) {
-       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)arg;
+       LDKCResult_SecretKeySecpErrorZ *val = (LDKCResult_SecretKeySecpErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        uint32_t err_conv = LDKSecp256k1Error_to_js((*val->contents.err));
        return err_conv;
@@ -2845,14 +2682,14 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_PublicKeySecpErro
        return ((LDKCResult_PublicKeySecpErrorZ*)arg)->result_ok;
 }
 int8_tArray  __attribute__((visibility("default"))) TS_LDKCResult_PublicKeySecpErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)arg;
+       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        int8_tArray res_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(res_arr + 4), (*val->contents.result).compressed_form, 33);
        return res_arr;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_PublicKeySecpErrorZ_get_err(uint32_t arg) {
-       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)arg;
+       LDKCResult_PublicKeySecpErrorZ *val = (LDKCResult_PublicKeySecpErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        uint32_t err_conv = LDKSecp256k1Error_to_js((*val->contents.err));
        return err_conv;
@@ -2861,7 +2698,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_TxCreationKeysSec
        return ((LDKCResult_TxCreationKeysSecpErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_TxCreationKeysSecpErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)arg;
+       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKTxCreationKeys res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2870,7 +2707,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_TxCreationKeysSec
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_TxCreationKeysSecpErrorZ_get_err(uint32_t arg) {
-       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)arg;
+       LDKCResult_TxCreationKeysSecpErrorZ *val = (LDKCResult_TxCreationKeysSecpErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        uint32_t err_conv = LDKSecp256k1Error_to_js((*val->contents.err));
        return err_conv;
@@ -2879,7 +2716,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_TrustedCommitment
        return ((LDKCResult_TrustedCommitmentTransactionNoneZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_TrustedCommitmentTransactionNoneZ_get_ok(uint32_t arg) {
-       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)arg;
+       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKTrustedCommitmentTransaction res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2888,7 +2725,28 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_TrustedCommitment
        return res_ref;
 }
 void  __attribute__((visibility("default"))) TS_LDKCResult_TrustedCommitmentTransactionNoneZ_get_err(uint32_t arg) {
-       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)arg;
+       LDKCResult_TrustedCommitmentTransactionNoneZ *val = (LDKCResult_TrustedCommitmentTransactionNoneZ*)(arg & ~1);
+       CHECK(!val->result_ok);
+       return *val->contents.err;
+}
+jboolean  __attribute__((visibility("default"))) TS_LDKCResult_CVec_SignatureZNoneZ_result_ok(uint32_t arg) {
+       return ((LDKCResult_CVec_SignatureZNoneZ*)arg)->result_ok;
+}
+ptrArray  __attribute__((visibility("default"))) TS_LDKCResult_CVec_SignatureZNoneZ_get_ok(uint32_t arg) {
+       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)(arg & ~1);
+       CHECK(val->result_ok);
+       LDKCVec_SignatureZ res_var = (*val->contents.result);
+       ptrArray res_arr = init_arr(res_var.datalen, sizeof(uint32_t), "Native ptrArray Bytes");
+       int8_tArray *res_arr_ptr = (int8_tArray*)(res_arr + 4);
+       for (size_t m = 0; m < res_var.datalen; m++) {
+               int8_tArray arr_conv_12_arr = init_arr(64, sizeof(uint8_t), "Native int8_tArray Bytes");
+               memcpy((uint8_t*)(arr_conv_12_arr + 4), res_var.data[m].compact_form, 64);
+               res_arr_ptr[m] = arr_conv_12_arr;
+       }
+       return res_arr;
+}
+void  __attribute__((visibility("default"))) TS_LDKCResult_CVec_SignatureZNoneZ_get_err(uint32_t arg) {
+       LDKCResult_CVec_SignatureZNoneZ *val = (LDKCResult_CVec_SignatureZNoneZ*)(arg & ~1);
        CHECK(!val->result_ok);
        return *val->contents.err;
 }
@@ -2905,8 +2763,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_RouteHopZ_new(uint32
                        LDKRouteHop arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = RouteHop_clone(&arr_elem_conv);
+                       arr_elem_conv = RouteHop_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -2930,7 +2787,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_RouteDecodeErrorZ
        return ((LDKCResult_RouteDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RouteDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)arg;
+       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKRoute res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2939,7 +2796,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RouteDecodeErrorZ
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RouteDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)arg;
+       LDKCResult_RouteDecodeErrorZ *val = (LDKCResult_RouteDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2960,8 +2817,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCVec_RouteHintZ_new(uint3
                        LDKRouteHint arr_elem_conv;
                        arr_elem_conv.inner = (void*)(arr_elem & (~1));
                        arr_elem_conv.is_owned = (arr_elem & 1) || (arr_elem == 0);
-                       if (arr_elem_conv.inner != NULL)
-                               arr_elem_conv = RouteHint_clone(&arr_elem_conv);
+                       arr_elem_conv = RouteHint_clone(&arr_elem_conv);
                        ret->data[i] = arr_elem_conv;
                }
        }
@@ -2978,7 +2834,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_RouteLightningErr
        return ((LDKCResult_RouteLightningErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RouteLightningErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)arg;
+       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKRoute res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2987,7 +2843,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RouteLightningErr
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RouteLightningErrorZ_get_err(uint32_t arg) {
-       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)arg;
+       LDKCResult_RouteLightningErrorZ *val = (LDKCResult_RouteLightningErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKLightningError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -2999,7 +2855,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_RoutingFeesDecode
        return ((LDKCResult_RoutingFeesDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RoutingFeesDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)arg;
+       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKRoutingFees res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3008,7 +2864,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RoutingFeesDecode
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_RoutingFeesDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)arg;
+       LDKCResult_RoutingFeesDecodeErrorZ *val = (LDKCResult_RoutingFeesDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3020,7 +2876,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NodeAnnouncementI
        return ((LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKNodeAnnouncementInfo res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3029,7 +2885,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NodeAnnouncementI
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NodeAnnouncementInfoDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ *val = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3041,7 +2897,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NodeInfoDecodeErr
        return ((LDKCResult_NodeInfoDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NodeInfoDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKNodeInfo res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3050,7 +2906,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NodeInfoDecodeErr
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NodeInfoDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)arg;
+       LDKCResult_NodeInfoDecodeErrorZ *val = (LDKCResult_NodeInfoDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3062,7 +2918,7 @@ jboolean  __attribute__((visibility("default"))) TS_LDKCResult_NetworkGraphDecod
        return ((LDKCResult_NetworkGraphDecodeErrorZ*)arg)->result_ok;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NetworkGraphDecodeErrorZ_get_ok(uint32_t arg) {
-       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)arg;
+       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)(arg & ~1);
        CHECK(val->result_ok);
        LDKNetworkGraph res_var = (*val->contents.result);
        CHECK((((long)res_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3071,7 +2927,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NetworkGraphDecod
        return res_ref;
 }
 uint32_t  __attribute__((visibility("default"))) TS_LDKCResult_NetworkGraphDecodeErrorZ_get_err(uint32_t arg) {
-       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)arg;
+       LDKCResult_NetworkGraphDecodeErrorZ *val = (LDKCResult_NetworkGraphDecodeErrorZ*)(arg & ~1);
        CHECK(!val->result_ok);
        LDKDecodeError err_var = (*val->contents.err);
        CHECK((((long)err_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -3102,7 +2958,7 @@ LDKCVec_MessageSendEventZ get_and_clear_pending_msg_events_jcall(const void* thi
        uint32_t* arg_vals = (uint32_t*)(arg + 4);
        for (size_t s = 0; s < arg_constr.datalen; s++) {
                uint32_t arr_conv_18 = arg_vals[s];
-               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)arr_conv_18;
+               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)(((uint64_t)arr_conv_18) & ~1);
                FREE((void*)arr_conv_18);
                arg_constr.data[s] = arr_conv_18_conv;
        }
@@ -3168,7 +3024,7 @@ LDKCVec_EventZ get_and_clear_pending_events_jcall(const void* this_arg) {
        uint32_t* arg_vals = (uint32_t*)(arg + 4);
        for (size_t h = 0; h < arg_constr.datalen; h++) {
                uint32_t arr_conv_7 = arg_vals[h];
-               LDKEvent arr_conv_7_conv = *(LDKEvent*)arr_conv_7;
+               LDKEvent arr_conv_7_conv = *(LDKEvent*)(((uint64_t)arr_conv_7) & ~1);
                FREE((void*)arr_conv_7);
                arg_constr.data[h] = arr_conv_7_conv;
        }
@@ -3227,7 +3083,7 @@ LDKCResult_TxOutAccessErrorZ get_utxo_jcall(const void* this_arg, const uint8_t
        int8_tArray genesis_hash_arr = init_arr(32, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(genesis_hash_arr + 4), *genesis_hash, 32);
        LDKCResult_TxOutAccessErrorZ* ret = (LDKCResult_TxOutAccessErrorZ*)js_invoke_function_2(j_calls->get_utxo_meth, genesis_hash_arr, short_channel_id);
-       LDKCResult_TxOutAccessErrorZ ret_conv = *(LDKCResult_TxOutAccessErrorZ*)ret;
+       LDKCResult_TxOutAccessErrorZ ret_conv = *(LDKCResult_TxOutAccessErrorZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_TxOutAccessErrorZ_clone((LDKCResult_TxOutAccessErrorZ*)ret);
        return ret_conv;
 }
@@ -3289,8 +3145,7 @@ void register_tx_jcall(const void* this_arg, const uint8_t (* txid)[32], LDKu8sl
 void register_output_jcall(const void* this_arg, const LDKOutPoint * outpoint, LDKu8slice script_pubkey) {
        LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
        LDKOutPoint outpoint_var = *outpoint;
-       if (outpoint->inner != NULL)
-               outpoint_var = OutPoint_clone(outpoint);
+       outpoint_var = OutPoint_clone(outpoint);
        CHECK((((long)outpoint_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&outpoint_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long outpoint_ref = (long)outpoint_var.inner;
@@ -3371,7 +3226,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ persist_new_channel_jcall(const void* th
                id_ref |= 1;
        }
        LDKChannelMonitor data_var = *data;
-       // Warning: we may need a move here but can't clone!
+       data_var = ChannelMonitor_clone(data);
        CHECK((((long)data_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&data_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long data_ref = (long)data_var.inner;
@@ -3379,7 +3234,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ persist_new_channel_jcall(const void* th
                data_ref |= 1;
        }
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)js_invoke_function_2(j_calls->persist_new_channel_meth, id_ref, data_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -3393,8 +3248,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_persisted_channel_jcall(const voi
                id_ref |= 1;
        }
        LDKChannelMonitorUpdate update_var = *update;
-       if (update->inner != NULL)
-               update_var = ChannelMonitorUpdate_clone(update);
+       update_var = ChannelMonitorUpdate_clone(update);
        CHECK((((long)update_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&update_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long update_ref = (long)update_var.inner;
@@ -3402,7 +3256,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_persisted_channel_jcall(const voi
                update_ref |= 1;
        }
        LDKChannelMonitor data_var = *data;
-       // Warning: we may need a move here but can't clone!
+       data_var = ChannelMonitor_clone(data);
        CHECK((((long)data_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&data_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long data_ref = (long)data_var.inner;
@@ -3410,7 +3264,7 @@ LDKCResult_NoneChannelMonitorUpdateErrZ update_persisted_channel_jcall(const voi
                data_ref |= 1;
        }
        LDKCResult_NoneChannelMonitorUpdateErrZ* ret = (LDKCResult_NoneChannelMonitorUpdateErrZ*)js_invoke_function_3(j_calls->update_persisted_channel_meth, id_ref, update_ref, data_ref);
-       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)ret;
+       LDKCResult_NoneChannelMonitorUpdateErrZ ret_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)ret) & ~1);
        ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone((LDKCResult_NoneChannelMonitorUpdateErrZ*)ret);
        return ret_conv;
 }
@@ -3442,8 +3296,7 @@ uint32_t  __attribute__((visibility("default"))) TS_Persist_persist_new_channel(
        LDKOutPoint id_conv;
        id_conv.inner = (void*)(id & (~1));
        id_conv.is_owned = (id & 1) || (id == 0);
-       if (id_conv.inner != NULL)
-               id_conv = OutPoint_clone(&id_conv);
+       id_conv = OutPoint_clone(&id_conv);
        LDKChannelMonitor data_conv;
        data_conv.inner = (void*)(data & (~1));
        data_conv.is_owned = false;
@@ -3457,8 +3310,7 @@ uint32_t  __attribute__((visibility("default"))) TS_Persist_update_persisted_cha
        LDKOutPoint id_conv;
        id_conv.inner = (void*)(id & (~1));
        id_conv.is_owned = (id & 1) || (id == 0);
-       if (id_conv.inner != NULL)
-               id_conv = OutPoint_clone(&id_conv);
+       id_conv = OutPoint_clone(&id_conv);
        LDKChannelMonitorUpdate update_conv;
        update_conv.inner = (void*)(update & (~1));
        update_conv.is_owned = false;
@@ -3530,8 +3382,7 @@ void handle_open_channel_jcall(const void* this_arg, LDKPublicKey their_node_id,
                their_features_ref |= 1;
        }
        LDKOpenChannel msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = OpenChannel_clone(msg);
+       msg_var = OpenChannel_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3552,8 +3403,7 @@ void handle_accept_channel_jcall(const void* this_arg, LDKPublicKey their_node_i
                their_features_ref |= 1;
        }
        LDKAcceptChannel msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = AcceptChannel_clone(msg);
+       msg_var = AcceptChannel_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3567,8 +3417,7 @@ void handle_funding_created_jcall(const void* this_arg, LDKPublicKey their_node_
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKFundingCreated msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = FundingCreated_clone(msg);
+       msg_var = FundingCreated_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3582,8 +3431,7 @@ void handle_funding_signed_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKFundingSigned msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = FundingSigned_clone(msg);
+       msg_var = FundingSigned_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3597,8 +3445,7 @@ void handle_funding_locked_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKFundingLocked msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = FundingLocked_clone(msg);
+       msg_var = FundingLocked_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3612,8 +3459,7 @@ void handle_shutdown_jcall(const void* this_arg, LDKPublicKey their_node_id, con
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKShutdown msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = Shutdown_clone(msg);
+       msg_var = Shutdown_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3627,8 +3473,7 @@ void handle_closing_signed_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKClosingSigned msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ClosingSigned_clone(msg);
+       msg_var = ClosingSigned_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3642,8 +3487,7 @@ void handle_update_add_htlc_jcall(const void* this_arg, LDKPublicKey their_node_
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKUpdateAddHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateAddHTLC_clone(msg);
+       msg_var = UpdateAddHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3657,8 +3501,7 @@ void handle_update_fulfill_htlc_jcall(const void* this_arg, LDKPublicKey their_n
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKUpdateFulfillHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFulfillHTLC_clone(msg);
+       msg_var = UpdateFulfillHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3672,8 +3515,7 @@ void handle_update_fail_htlc_jcall(const void* this_arg, LDKPublicKey their_node
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKUpdateFailHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFailHTLC_clone(msg);
+       msg_var = UpdateFailHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3687,8 +3529,7 @@ void handle_update_fail_malformed_htlc_jcall(const void* this_arg, LDKPublicKey
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKUpdateFailMalformedHTLC msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFailMalformedHTLC_clone(msg);
+       msg_var = UpdateFailMalformedHTLC_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3702,8 +3543,7 @@ void handle_commitment_signed_jcall(const void* this_arg, LDKPublicKey their_nod
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKCommitmentSigned msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = CommitmentSigned_clone(msg);
+       msg_var = CommitmentSigned_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3717,8 +3557,7 @@ void handle_revoke_and_ack_jcall(const void* this_arg, LDKPublicKey their_node_i
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKRevokeAndACK msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = RevokeAndACK_clone(msg);
+       msg_var = RevokeAndACK_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3732,8 +3571,7 @@ void handle_update_fee_jcall(const void* this_arg, LDKPublicKey their_node_id, c
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKUpdateFee msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = UpdateFee_clone(msg);
+       msg_var = UpdateFee_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3747,8 +3585,7 @@ void handle_announcement_signatures_jcall(const void* this_arg, LDKPublicKey the
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKAnnouncementSignatures msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = AnnouncementSignatures_clone(msg);
+       msg_var = AnnouncementSignatures_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3768,8 +3605,7 @@ void peer_connected_jcall(const void* this_arg, LDKPublicKey their_node_id, cons
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKInit msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = Init_clone(msg);
+       msg_var = Init_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3783,8 +3619,7 @@ void handle_channel_reestablish_jcall(const void* this_arg, LDKPublicKey their_n
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKChannelReestablish msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ChannelReestablish_clone(msg);
+       msg_var = ChannelReestablish_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3798,8 +3633,7 @@ void handle_error_jcall(const void* this_arg, LDKPublicKey their_node_id, const
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKErrorMessage msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ErrorMessage_clone(msg);
+       msg_var = ErrorMessage_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -3859,7 +3693,7 @@ void  __attribute__((visibility("default"))) TS_ChannelMessageHandler_handle_ope
        LDKInitFeatures their_features_conv;
        their_features_conv.inner = (void*)(their_features & (~1));
        their_features_conv.is_owned = (their_features & 1) || (their_features == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKInitFeatures
        LDKOpenChannel msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = false;
@@ -3874,7 +3708,7 @@ void  __attribute__((visibility("default"))) TS_ChannelMessageHandler_handle_acc
        LDKInitFeatures their_features_conv;
        their_features_conv.inner = (void*)(their_features & (~1));
        their_features_conv.is_owned = (their_features & 1) || (their_features == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKInitFeatures
        LDKAcceptChannel msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = false;
@@ -4100,8 +3934,7 @@ static void LDKRoutingMessageHandler_JCalls_free(void* this_arg) {
 LDKCResult_boolLightningErrorZ handle_node_announcement_jcall(const void* this_arg, const LDKNodeAnnouncement * msg) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
        LDKNodeAnnouncement msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = NodeAnnouncement_clone(msg);
+       msg_var = NodeAnnouncement_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4109,15 +3942,14 @@ LDKCResult_boolLightningErrorZ handle_node_announcement_jcall(const void* this_a
                msg_ref |= 1;
        }
        LDKCResult_boolLightningErrorZ* ret = (LDKCResult_boolLightningErrorZ*)js_invoke_function_1(j_calls->handle_node_announcement_meth, msg_ref);
-       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_boolLightningErrorZ_clone((LDKCResult_boolLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_boolLightningErrorZ handle_channel_announcement_jcall(const void* this_arg, const LDKChannelAnnouncement * msg) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
        LDKChannelAnnouncement msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ChannelAnnouncement_clone(msg);
+       msg_var = ChannelAnnouncement_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4125,15 +3957,14 @@ LDKCResult_boolLightningErrorZ handle_channel_announcement_jcall(const void* thi
                msg_ref |= 1;
        }
        LDKCResult_boolLightningErrorZ* ret = (LDKCResult_boolLightningErrorZ*)js_invoke_function_1(j_calls->handle_channel_announcement_meth, msg_ref);
-       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_boolLightningErrorZ_clone((LDKCResult_boolLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_boolLightningErrorZ handle_channel_update_jcall(const void* this_arg, const LDKChannelUpdate * msg) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
        LDKChannelUpdate msg_var = *msg;
-       if (msg->inner != NULL)
-               msg_var = ChannelUpdate_clone(msg);
+       msg_var = ChannelUpdate_clone(msg);
        CHECK((((long)msg_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&msg_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long msg_ref = (long)msg_var.inner;
@@ -4141,8 +3972,8 @@ LDKCResult_boolLightningErrorZ handle_channel_update_jcall(const void* this_arg,
                msg_ref |= 1;
        }
        LDKCResult_boolLightningErrorZ* ret = (LDKCResult_boolLightningErrorZ*)js_invoke_function_1(j_calls->handle_channel_update_meth, msg_ref);
-       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_boolLightningErrorZ_clone((LDKCResult_boolLightningErrorZ*)ret);
        return ret_conv;
 }
 void handle_htlc_fail_channel_update_jcall(const void* this_arg, const LDKHTLCFailChannelUpdate * update) {
@@ -4162,7 +3993,7 @@ LDKCVec_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ get_next_channel
        uint32_t* arg_vals = (uint32_t*)(arg + 4);
        for (size_t l = 0; l < arg_constr.datalen; l++) {
                uint32_t arr_conv_63 = arg_vals[l];
-               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)arr_conv_63;
+               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)arr_conv_63) & ~1);
                FREE((void*)arr_conv_63);
                arg_constr.data[l] = arr_conv_63_conv;
        }
@@ -4185,8 +4016,7 @@ LDKCVec_NodeAnnouncementZ get_next_node_announcements_jcall(const void* this_arg
                LDKNodeAnnouncement arr_conv_18_conv;
                arr_conv_18_conv.inner = (void*)(arr_conv_18 & (~1));
                arr_conv_18_conv.is_owned = (arr_conv_18 & 1) || (arr_conv_18 == 0);
-               if (arr_conv_18_conv.inner != NULL)
-                       arr_conv_18_conv = NodeAnnouncement_clone(&arr_conv_18_conv);
+               arr_conv_18_conv = NodeAnnouncement_clone(&arr_conv_18_conv);
                arg_constr.data[s] = arr_conv_18_conv;
        }
        return arg_constr;
@@ -4196,8 +4026,7 @@ void sync_routing_table_jcall(const void* this_arg, LDKPublicKey their_node_id,
        int8_tArray their_node_id_arr = init_arr(33, sizeof(uint8_t), "Native int8_tArray Bytes");
        memcpy((uint8_t*)(their_node_id_arr + 4), their_node_id.compressed_form, 33);
        LDKInit init_var = *init;
-       if (init->inner != NULL)
-               init_var = Init_clone(init);
+       init_var = Init_clone(init);
        CHECK((((long)init_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&init_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
        long init_ref = (long)init_var.inner;
@@ -4218,8 +4047,8 @@ LDKCResult_NoneLightningErrorZ handle_reply_channel_range_jcall(const void* this
                msg_ref |= 1;
        }
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)js_invoke_function_2(j_calls->handle_reply_channel_range_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKReplyShortChannelIdsEnd msg) {
@@ -4234,8 +4063,8 @@ LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_jcall(const vo
                msg_ref |= 1;
        }
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)js_invoke_function_2(j_calls->handle_reply_short_channel_ids_end_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_NoneLightningErrorZ handle_query_channel_range_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryChannelRange msg) {
@@ -4250,8 +4079,8 @@ LDKCResult_NoneLightningErrorZ handle_query_channel_range_jcall(const void* this
                msg_ref |= 1;
        }
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)js_invoke_function_2(j_calls->handle_query_channel_range_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_jcall(const void* this_arg, LDKPublicKey their_node_id, LDKQueryShortChannelIds msg) {
@@ -4266,8 +4095,8 @@ LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_jcall(const void*
                msg_ref |= 1;
        }
        LDKCResult_NoneLightningErrorZ* ret = (LDKCResult_NoneLightningErrorZ*)js_invoke_function_2(j_calls->handle_query_short_channel_ids_meth, their_node_id_arr, msg_ref);
-       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)ret;
-       // Warning: we may need a move here but can't do a full clone!
+       LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)ret) & ~1);
+       ret_conv = CResult_NoneLightningErrorZ_clone((LDKCResult_NoneLightningErrorZ*)ret);
        return ret_conv;
 }
 static void* LDKRoutingMessageHandler_JCalls_clone(const void* this_arg) {
@@ -4349,9 +4178,6 @@ uint32_tArray  __attribute__((visibility("default"))) TS_RoutingMessageHandler_g
        for (size_t l = 0; l < ret_var.datalen; l++) {
                LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* arr_conv_63_ref = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
                *arr_conv_63_ref = ret_var.data[l];
-               arr_conv_63_ref->a = ChannelAnnouncement_clone(&arr_conv_63_ref->a);
-               arr_conv_63_ref->b = ChannelUpdate_clone(&arr_conv_63_ref->b);
-               arr_conv_63_ref->c = ChannelUpdate_clone(&arr_conv_63_ref->c);
                ret_arr_ptr[l] = (long)arr_conv_63_ref;
        }
        FREE(ret_var.data);
@@ -4399,8 +4225,7 @@ uint32_t  __attribute__((visibility("default"))) TS_RoutingMessageHandler_handle
        LDKReplyChannelRange msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = ReplyChannelRange_clone(&msg_conv);
+       msg_conv = ReplyChannelRange_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_reply_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -4414,8 +4239,7 @@ uint32_t  __attribute__((visibility("default"))) TS_RoutingMessageHandler_handle
        LDKReplyShortChannelIdsEnd msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = ReplyShortChannelIdsEnd_clone(&msg_conv);
+       msg_conv = ReplyShortChannelIdsEnd_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_reply_short_channel_ids_end)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -4429,8 +4253,7 @@ uint32_t  __attribute__((visibility("default"))) TS_RoutingMessageHandler_handle
        LDKQueryChannelRange msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = QueryChannelRange_clone(&msg_conv);
+       msg_conv = QueryChannelRange_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_query_channel_range)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -4444,8 +4267,7 @@ uint32_t  __attribute__((visibility("default"))) TS_RoutingMessageHandler_handle
        LDKQueryShortChannelIds msg_conv;
        msg_conv.inner = (void*)(msg & (~1));
        msg_conv.is_owned = (msg & 1) || (msg == 0);
-       if (msg_conv.inner != NULL)
-               msg_conv = QueryShortChannelIds_clone(&msg_conv);
+       msg_conv = QueryShortChannelIds_clone(&msg_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = (this_arg_conv->handle_query_short_channel_ids)(this_arg_conv->this_arg, their_node_id_ref, msg_conv);
        return (long)ret_conv;
@@ -4545,13 +4367,14 @@ void  __attribute__((visibility("default"))) TS_Transaction_free(int8_tArray _re
 }
 
 void  __attribute__((visibility("default"))) TS_TxOut_free(uint32_t _res) {
-       LDKTxOut _res_conv = *(LDKTxOut*)_res;
+       if ((_res & 1) != 0) return;
+       LDKTxOut _res_conv = *(LDKTxOut*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        TxOut_free(_res_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_TxOut_clone(uint32_t orig) {
-       LDKTxOut* orig_conv = (LDKTxOut*)orig;
+       LDKTxOut* orig_conv = (LDKTxOut*)(orig & ~1);
        LDKTxOut* ret_ref = MALLOC(sizeof(LDKTxOut), "LDKTxOut");
        *ret_ref = TxOut_clone(orig_conv);
        return (long)ret_ref;
@@ -4567,7 +4390,7 @@ void  __attribute__((visibility("default"))) TS_CVec_SpendableOutputDescriptorZ_
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t b = 0; b < _res_constr.datalen; b++) {
                uint32_t arr_conv_27 = _res_vals[b];
-               LDKSpendableOutputDescriptor arr_conv_27_conv = *(LDKSpendableOutputDescriptor*)arr_conv_27;
+               LDKSpendableOutputDescriptor arr_conv_27_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)arr_conv_27) & ~1);
                FREE((void*)arr_conv_27);
                _res_constr.data[b] = arr_conv_27_conv;
        }
@@ -4584,7 +4407,7 @@ void  __attribute__((visibility("default"))) TS_CVec_MessageSendEventZ_free(uint
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t s = 0; s < _res_constr.datalen; s++) {
                uint32_t arr_conv_18 = _res_vals[s];
-               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)arr_conv_18;
+               LDKMessageSendEvent arr_conv_18_conv = *(LDKMessageSendEvent*)(((uint64_t)arr_conv_18) & ~1);
                FREE((void*)arr_conv_18);
                _res_constr.data[s] = arr_conv_18_conv;
        }
@@ -4601,7 +4424,7 @@ void  __attribute__((visibility("default"))) TS_CVec_EventZ_free(uint32_tArray _
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t h = 0; h < _res_constr.datalen; h++) {
                uint32_t arr_conv_7 = _res_vals[h];
-               LDKEvent arr_conv_7_conv = *(LDKEvent*)arr_conv_7;
+               LDKEvent arr_conv_7_conv = *(LDKEvent*)(((uint64_t)arr_conv_7) & ~1);
                FREE((void*)arr_conv_7);
                _res_constr.data[h] = arr_conv_7_conv;
        }
@@ -4609,7 +4432,8 @@ void  __attribute__((visibility("default"))) TS_CVec_EventZ_free(uint32_tArray _
 }
 
 void  __attribute__((visibility("default"))) TS_C2Tuple_usizeTransactionZ_free(uint32_t _res) {
-       LDKC2Tuple_usizeTransactionZ _res_conv = *(LDKC2Tuple_usizeTransactionZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_usizeTransactionZ _res_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_usizeTransactionZ_free(_res_conv);
 }
@@ -4622,7 +4446,6 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_usizeTransactionZ_ne
        b_ref.data_is_owned = true;
        LDKC2Tuple_usizeTransactionZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_usizeTransactionZ), "LDKC2Tuple_usizeTransactionZ");
        *ret_ref = C2Tuple_usizeTransactionZ_new(a, b_ref);
-       // XXX: We likely need to clone here, but no _clone fn is available for Uint8Array
        return (long)ret_ref;
 }
 
@@ -4636,7 +4459,7 @@ void  __attribute__((visibility("default"))) TS_CVec_C2Tuple_usizeTransactionZZ_
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t e = 0; e < _res_constr.datalen; e++) {
                uint32_t arr_conv_30 = _res_vals[e];
-               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_30;
+               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_30) & ~1);
                FREE((void*)arr_conv_30);
                _res_constr.data[e] = arr_conv_30_conv;
        }
@@ -4657,11 +4480,19 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneChannelMonitorUp
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NoneChannelMonitorUpdateErrZ_free(uint32_t _res) {
-       LDKCResult_NoneChannelMonitorUpdateErrZ _res_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneChannelMonitorUpdateErrZ _res_conv = *(LDKCResult_NoneChannelMonitorUpdateErrZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneChannelMonitorUpdateErrZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneChannelMonitorUpdateErrZ_clone(uint32_t orig) {
+       LDKCResult_NoneChannelMonitorUpdateErrZ* orig_conv = (LDKCResult_NoneChannelMonitorUpdateErrZ*)(orig & ~1);
+       LDKCResult_NoneChannelMonitorUpdateErrZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneChannelMonitorUpdateErrZ), "LDKCResult_NoneChannelMonitorUpdateErrZ");
+       *ret_conv = CResult_NoneChannelMonitorUpdateErrZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 void  __attribute__((visibility("default"))) TS_CVec_MonitorEventZ_free(uint32_tArray _res) {
        LDKCVec_MonitorEventZ _res_constr;
        _res_constr.datalen = *((uint32_t*)_res);
@@ -4684,8 +4515,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ChannelMonitorUpdate
        LDKChannelMonitorUpdate o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ChannelMonitorUpdate_clone(&o_conv);
+       o_conv = ChannelMonitorUpdate_clone(&o_conv);
        LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
        *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -4695,14 +4525,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ChannelMonitorUpdate
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ChannelMonitorUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelMonitorUpdateDecodeErrorZ), "LDKCResult_ChannelMonitorUpdateDecodeErrorZ");
        *ret_conv = CResult_ChannelMonitorUpdateDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_ChannelMonitorUpdateDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_ChannelMonitorUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ChannelMonitorUpdateDecodeErrorZ _res_conv = *(LDKCResult_ChannelMonitorUpdateDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ChannelMonitorUpdateDecodeErrorZ_free(_res_conv);
 }
@@ -4717,20 +4548,29 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneMonitorUpdateErr
        LDKMonitorUpdateError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = MonitorUpdateError_clone(&e_conv);
        LDKCResult_NoneMonitorUpdateErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneMonitorUpdateErrorZ), "LDKCResult_NoneMonitorUpdateErrorZ");
        *ret_conv = CResult_NoneMonitorUpdateErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NoneMonitorUpdateErrorZ_free(uint32_t _res) {
-       LDKCResult_NoneMonitorUpdateErrorZ _res_conv = *(LDKCResult_NoneMonitorUpdateErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneMonitorUpdateErrorZ _res_conv = *(LDKCResult_NoneMonitorUpdateErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneMonitorUpdateErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneMonitorUpdateErrorZ_clone(uint32_t orig) {
+       LDKCResult_NoneMonitorUpdateErrorZ* orig_conv = (LDKCResult_NoneMonitorUpdateErrorZ*)(orig & ~1);
+       LDKCResult_NoneMonitorUpdateErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneMonitorUpdateErrorZ), "LDKCResult_NoneMonitorUpdateErrorZ");
+       *ret_conv = CResult_NoneMonitorUpdateErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 void  __attribute__((visibility("default"))) TS_C2Tuple_OutPointScriptZ_free(uint32_t _res) {
-       LDKC2Tuple_OutPointScriptZ _res_conv = *(LDKC2Tuple_OutPointScriptZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_OutPointScriptZ _res_conv = *(LDKC2Tuple_OutPointScriptZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_OutPointScriptZ_free(_res_conv);
 }
@@ -4739,16 +4579,13 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_OutPointScriptZ_new(
        LDKOutPoint a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = OutPoint_clone(&a_conv);
+       a_conv = OutPoint_clone(&a_conv);
        LDKCVec_u8Z b_ref;
        b_ref.datalen = *((uint32_t*)b);
        b_ref.data = MALLOC(b_ref.datalen, "LDKCVec_u8Z Bytes");
        memcpy(b_ref.data, (uint8_t*)(b + 4), b_ref.datalen);
        LDKC2Tuple_OutPointScriptZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_OutPointScriptZ), "LDKC2Tuple_OutPointScriptZ");
        *ret_ref = C2Tuple_OutPointScriptZ_new(a_conv, b_ref);
-       ret_ref->a = OutPoint_clone(&ret_ref->a);
-       ret_ref->b = CVec_u8Z_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -4772,18 +4609,25 @@ void  __attribute__((visibility("default"))) TS_CVec_TransactionZ_free(ptrArray
        CVec_TransactionZ_free(_res_constr);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_u32TxOutZ_clone(uint32_t orig) {
+       LDKC2Tuple_u32TxOutZ* orig_conv = (LDKC2Tuple_u32TxOutZ*)(orig & ~1);
+       LDKC2Tuple_u32TxOutZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
+       *ret_ref = C2Tuple_u32TxOutZ_clone(orig_conv);
+       return (long)ret_ref;
+}
+
 void  __attribute__((visibility("default"))) TS_C2Tuple_u32TxOutZ_free(uint32_t _res) {
-       LDKC2Tuple_u32TxOutZ _res_conv = *(LDKC2Tuple_u32TxOutZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_u32TxOutZ _res_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_u32TxOutZ_free(_res_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_u32TxOutZ_new(int32_t a, uint32_t b) {
-       LDKTxOut b_conv = *(LDKTxOut*)b;
+       LDKTxOut b_conv = *(LDKTxOut*)(((uint64_t)b) & ~1);
        FREE((void*)b);
        LDKC2Tuple_u32TxOutZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_u32TxOutZ), "LDKC2Tuple_u32TxOutZ");
        *ret_ref = C2Tuple_u32TxOutZ_new(a, b_conv);
-       ret_ref->b = TxOut_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -4797,7 +4641,7 @@ void  __attribute__((visibility("default"))) TS_CVec_C2Tuple_u32TxOutZZ_free(uin
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t z = 0; z < _res_constr.datalen; z++) {
                uint32_t arr_conv_25 = _res_vals[z];
-               LDKC2Tuple_u32TxOutZ arr_conv_25_conv = *(LDKC2Tuple_u32TxOutZ*)arr_conv_25;
+               LDKC2Tuple_u32TxOutZ arr_conv_25_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_conv_25) & ~1);
                FREE((void*)arr_conv_25);
                _res_constr.data[z] = arr_conv_25_conv;
        }
@@ -4805,7 +4649,8 @@ void  __attribute__((visibility("default"))) TS_CVec_C2Tuple_u32TxOutZZ_free(uin
 }
 
 void  __attribute__((visibility("default"))) TS_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_free(uint32_t _res) {
-       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ _res_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ _res_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_free(_res_conv);
 }
@@ -4823,14 +4668,12 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_TxidCVec_C2Tuple_u32
        uint32_t* b_vals = (uint32_t*)(b + 4);
        for (size_t z = 0; z < b_constr.datalen; z++) {
                uint32_t arr_conv_25 = b_vals[z];
-               LDKC2Tuple_u32TxOutZ arr_conv_25_conv = *(LDKC2Tuple_u32TxOutZ*)arr_conv_25;
+               LDKC2Tuple_u32TxOutZ arr_conv_25_conv = *(LDKC2Tuple_u32TxOutZ*)(((uint64_t)arr_conv_25) & ~1);
                FREE((void*)arr_conv_25);
                b_constr.data[z] = arr_conv_25_conv;
        }
        LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ");
        *ret_ref = C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ_new(a_ref, b_constr);
-       ret_ref->a = ThirtyTwoBytes_clone(&ret_ref->a);
-       ret_ref->b = CVec_C2Tuple_u32TxOutZZ_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -4844,7 +4687,7 @@ void  __attribute__((visibility("default"))) TS_CVec_C2Tuple_TxidCVec_C2Tuple_u3
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t x = 0; x < _res_constr.datalen; x++) {
                uint32_t arr_conv_49 = _res_vals[x];
-               LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_conv_49_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)arr_conv_49;
+               LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ arr_conv_49_conv = *(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ*)(((uint64_t)arr_conv_49) & ~1);
                FREE((void*)arr_conv_49);
                _res_constr.data[x] = arr_conv_49_conv;
        }
@@ -4852,7 +4695,8 @@ void  __attribute__((visibility("default"))) TS_CVec_C2Tuple_TxidCVec_C2Tuple_u3
 }
 
 void  __attribute__((visibility("default"))) TS_C2Tuple_BlockHashChannelMonitorZ_free(uint32_t _res) {
-       LDKC2Tuple_BlockHashChannelMonitorZ _res_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_BlockHashChannelMonitorZ _res_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_BlockHashChannelMonitorZ_free(_res_conv);
 }
@@ -4864,16 +4708,14 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_BlockHashChannelMoni
        LDKChannelMonitor b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       b_conv = ChannelMonitor_clone(&b_conv);
        LDKC2Tuple_BlockHashChannelMonitorZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_BlockHashChannelMonitorZ), "LDKC2Tuple_BlockHashChannelMonitorZ");
        *ret_ref = C2Tuple_BlockHashChannelMonitorZ_new(a_ref, b_conv);
-       ret_ref->a = ThirtyTwoBytes_clone(&ret_ref->a);
-       // XXX: We likely need to clone here, but no _clone fn is available for ChannelMonitor
        return (long)ret_ref;
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(uint32_t o) {
-       LDKC2Tuple_BlockHashChannelMonitorZ o_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)o;
+       LDKC2Tuple_BlockHashChannelMonitorZ o_conv = *(LDKC2Tuple_BlockHashChannelMonitorZ*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(o_conv);
@@ -4884,20 +4726,29 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_C2Tuple_BlockHashCha
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_u64u64Z_clone(uint32_t orig) {
+       LDKC2Tuple_u64u64Z* orig_conv = (LDKC2Tuple_u64u64Z*)(orig & ~1);
+       LDKC2Tuple_u64u64Z* ret_ref = MALLOC(sizeof(LDKC2Tuple_u64u64Z), "LDKC2Tuple_u64u64Z");
+       *ret_ref = C2Tuple_u64u64Z_clone(orig_conv);
+       return (long)ret_ref;
+}
+
 void  __attribute__((visibility("default"))) TS_C2Tuple_u64u64Z_free(uint32_t _res) {
-       LDKC2Tuple_u64u64Z _res_conv = *(LDKC2Tuple_u64u64Z*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_u64u64Z _res_conv = *(LDKC2Tuple_u64u64Z*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_u64u64Z_free(_res_conv);
 }
@@ -4909,7 +4760,7 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_u64u64Z_new(int64_t
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_SpendableOutputDescriptorDecodeErrorZ_ok(uint32_t o) {
-       LDKSpendableOutputDescriptor o_conv = *(LDKSpendableOutputDescriptor*)o;
+       LDKSpendableOutputDescriptor o_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
        *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_ok(o_conv);
@@ -4920,18 +4771,26 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_SpendableOutputDescr
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
        *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_SpendableOutputDescriptorDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_SpendableOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ _res_conv = *(LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_SpendableOutputDescriptorDecodeErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_SpendableOutputDescriptorDecodeErrorZ_clone(uint32_t orig) {
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* orig_conv = (LDKCResult_SpendableOutputDescriptorDecodeErrorZ*)(orig & ~1);
+       LDKCResult_SpendableOutputDescriptorDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpendableOutputDescriptorDecodeErrorZ), "LDKCResult_SpendableOutputDescriptorDecodeErrorZ");
+       *ret_conv = CResult_SpendableOutputDescriptorDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 void  __attribute__((visibility("default"))) TS_CVec_SignatureZ_free(ptrArray _res) {
        LDKCVec_SignatureZ _res_constr;
        _res_constr.datalen = *((uint32_t*)_res);
@@ -4950,8 +4809,16 @@ void  __attribute__((visibility("default"))) TS_CVec_SignatureZ_free(ptrArray _r
        CVec_SignatureZ_free(_res_constr);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_SignatureCVec_SignatureZZ_clone(uint32_t orig) {
+       LDKC2Tuple_SignatureCVec_SignatureZZ* orig_conv = (LDKC2Tuple_SignatureCVec_SignatureZZ*)(orig & ~1);
+       LDKC2Tuple_SignatureCVec_SignatureZZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_SignatureCVec_SignatureZZ), "LDKC2Tuple_SignatureCVec_SignatureZZ");
+       *ret_ref = C2Tuple_SignatureCVec_SignatureZZ_clone(orig_conv);
+       return (long)ret_ref;
+}
+
 void  __attribute__((visibility("default"))) TS_C2Tuple_SignatureCVec_SignatureZZ_free(uint32_t _res) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ _res_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_SignatureCVec_SignatureZZ _res_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_SignatureCVec_SignatureZZ_free(_res_conv);
 }
@@ -4976,13 +4843,11 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_SignatureCVec_Signat
        }
        LDKC2Tuple_SignatureCVec_SignatureZZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_SignatureCVec_SignatureZZ), "LDKC2Tuple_SignatureCVec_SignatureZZ");
        *ret_ref = C2Tuple_SignatureCVec_SignatureZZ_new(a_ref, b_constr);
-       // XXX: We likely need to clone here, but no _clone fn is available for Uint8Array
-       // XXX: We likely need to clone here, but no _clone fn is available for Uint8Array[]
        return (long)ret_ref;
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_ok(uint32_t o) {
-       LDKC2Tuple_SignatureCVec_SignatureZZ o_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)o;
+       LDKC2Tuple_SignatureCVec_SignatureZZ o_conv = *(LDKC2Tuple_SignatureCVec_SignatureZZ*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ), "LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ");
        *ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_ok(o_conv);
@@ -4996,13 +4861,14 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_C2Tuple_SignatureCVe
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_free(uint32_t _res) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_free(_res_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone(uint32_t orig) {
-       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)orig;
+       LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ*)(orig & ~1);
        LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ), "LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ");
        *ret_conv = CResult_C2Tuple_SignatureCVec_SignatureZZNoneZ_clone(orig_conv);
        return (long)ret_conv;
@@ -5024,59 +4890,21 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_SignatureNoneZ_err()
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_SignatureNoneZ_free(uint32_t _res) {
-       LDKCResult_SignatureNoneZ _res_conv = *(LDKCResult_SignatureNoneZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_SignatureNoneZ _res_conv = *(LDKCResult_SignatureNoneZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_SignatureNoneZ_free(_res_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_SignatureNoneZ_clone(uint32_t orig) {
-       LDKCResult_SignatureNoneZ* orig_conv = (LDKCResult_SignatureNoneZ*)orig;
+       LDKCResult_SignatureNoneZ* orig_conv = (LDKCResult_SignatureNoneZ*)(orig & ~1);
        LDKCResult_SignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_SignatureNoneZ), "LDKCResult_SignatureNoneZ");
        *ret_conv = CResult_SignatureNoneZ_clone(orig_conv);
        return (long)ret_conv;
 }
 
-uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_ok(ptrArray o) {
-       LDKCVec_SignatureZ o_constr;
-       o_constr.datalen = *((uint32_t*)o);
-       if (o_constr.datalen > 0)
-               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKSignature), "LDKCVec_SignatureZ Elements");
-       else
-               o_constr.data = NULL;
-       int8_tArray* o_vals = (int8_tArray*)(o + 4);
-       for (size_t m = 0; m < o_constr.datalen; m++) {
-               int8_tArray arr_conv_12 = o_vals[m];
-               LDKSignature arr_conv_12_ref;
-               CHECK(*((uint32_t*)arr_conv_12) == 64);
-               memcpy(arr_conv_12_ref.compact_form, (uint8_t*)(arr_conv_12 + 4), 64);
-               o_constr.data[m] = arr_conv_12_ref;
-       }
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = CResult_CVec_SignatureZNoneZ_ok(o_constr);
-       return (long)ret_conv;
-}
-
-uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_err() {
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = CResult_CVec_SignatureZNoneZ_err();
-       return (long)ret_conv;
-}
-
-void  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_free(uint32_t _res) {
-       LDKCResult_CVec_SignatureZNoneZ _res_conv = *(LDKCResult_CVec_SignatureZNoneZ*)_res;
-       FREE((void*)_res);
-       CResult_CVec_SignatureZNoneZ_free(_res_conv);
-}
-
-uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_clone(uint32_t orig) {
-       LDKCResult_CVec_SignatureZNoneZ* orig_conv = (LDKCResult_CVec_SignatureZNoneZ*)orig;
-       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
-       *ret_conv = CResult_CVec_SignatureZNoneZ_clone(orig_conv);
-       return (long)ret_conv;
-}
-
 uint32_t  __attribute__((visibility("default"))) TS_CResult_ChanKeySignerDecodeErrorZ_ok(uint32_t o) {
-       LDKChannelKeys o_conv = *(LDKChannelKeys*)o;
+       LDKChannelKeys o_conv = *(LDKChannelKeys*)(((uint64_t)o) & ~1);
        LDKCResult_ChanKeySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChanKeySignerDecodeErrorZ), "LDKCResult_ChanKeySignerDecodeErrorZ");
        *ret_conv = CResult_ChanKeySignerDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5086,24 +4914,31 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ChanKeySignerDecodeE
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ChanKeySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChanKeySignerDecodeErrorZ), "LDKCResult_ChanKeySignerDecodeErrorZ");
        *ret_conv = CResult_ChanKeySignerDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_ChanKeySignerDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_ChanKeySignerDecodeErrorZ _res_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ChanKeySignerDecodeErrorZ _res_conv = *(LDKCResult_ChanKeySignerDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ChanKeySignerDecodeErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_ChanKeySignerDecodeErrorZ_clone(uint32_t orig) {
+       LDKCResult_ChanKeySignerDecodeErrorZ* orig_conv = (LDKCResult_ChanKeySignerDecodeErrorZ*)(orig & ~1);
+       LDKCResult_ChanKeySignerDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChanKeySignerDecodeErrorZ), "LDKCResult_ChanKeySignerDecodeErrorZ");
+       *ret_conv = CResult_ChanKeySignerDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_InMemoryChannelKeysDecodeErrorZ_ok(uint32_t o) {
        LDKInMemoryChannelKeys o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = InMemoryChannelKeys_clone(&o_conv);
+       o_conv = InMemoryChannelKeys_clone(&o_conv);
        LDKCResult_InMemoryChannelKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemoryChannelKeysDecodeErrorZ), "LDKCResult_InMemoryChannelKeysDecodeErrorZ");
        *ret_conv = CResult_InMemoryChannelKeysDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5113,20 +4948,21 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_InMemoryChannelKeysD
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_InMemoryChannelKeysDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InMemoryChannelKeysDecodeErrorZ), "LDKCResult_InMemoryChannelKeysDecodeErrorZ");
        *ret_conv = CResult_InMemoryChannelKeysDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_InMemoryChannelKeysDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_InMemoryChannelKeysDecodeErrorZ _res_conv = *(LDKCResult_InMemoryChannelKeysDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_InMemoryChannelKeysDecodeErrorZ _res_conv = *(LDKCResult_InMemoryChannelKeysDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_InMemoryChannelKeysDecodeErrorZ_free(_res_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_TxOutAccessErrorZ_ok(uint32_t o) {
-       LDKTxOut o_conv = *(LDKTxOut*)o;
+       LDKTxOut o_conv = *(LDKTxOut*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_TxOutAccessErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutAccessErrorZ), "LDKCResult_TxOutAccessErrorZ");
        *ret_conv = CResult_TxOutAccessErrorZ_ok(o_conv);
@@ -5141,11 +4977,19 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_TxOutAccessErrorZ_er
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_TxOutAccessErrorZ_free(uint32_t _res) {
-       LDKCResult_TxOutAccessErrorZ _res_conv = *(LDKCResult_TxOutAccessErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_TxOutAccessErrorZ _res_conv = *(LDKCResult_TxOutAccessErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_TxOutAccessErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_TxOutAccessErrorZ_clone(uint32_t orig) {
+       LDKCResult_TxOutAccessErrorZ* orig_conv = (LDKCResult_TxOutAccessErrorZ*)(orig & ~1);
+       LDKCResult_TxOutAccessErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxOutAccessErrorZ), "LDKCResult_TxOutAccessErrorZ");
+       *ret_conv = CResult_TxOutAccessErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneAPIErrorZ_ok() {
        LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
        *ret_conv = CResult_NoneAPIErrorZ_ok();
@@ -5153,7 +4997,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneAPIErrorZ_ok() {
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneAPIErrorZ_err(uint32_t e) {
-       LDKAPIError e_conv = *(LDKAPIError*)e;
+       LDKAPIError e_conv = *(LDKAPIError*)(((uint64_t)e) & ~1);
        FREE((void*)e);
        LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
        *ret_conv = CResult_NoneAPIErrorZ_err(e_conv);
@@ -5161,7 +5005,8 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneAPIErrorZ_err(ui
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NoneAPIErrorZ_free(uint32_t _res) {
-       LDKCResult_NoneAPIErrorZ _res_conv = *(LDKCResult_NoneAPIErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneAPIErrorZ _res_conv = *(LDKCResult_NoneAPIErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneAPIErrorZ_free(_res_conv);
 }
@@ -5194,18 +5039,26 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NonePaymentSendFailu
        LDKPaymentSendFailure e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PaymentSendFailure_clone(&e_conv);
        LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
        *ret_conv = CResult_NonePaymentSendFailureZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NonePaymentSendFailureZ_free(uint32_t _res) {
-       LDKCResult_NonePaymentSendFailureZ _res_conv = *(LDKCResult_NonePaymentSendFailureZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NonePaymentSendFailureZ _res_conv = *(LDKCResult_NonePaymentSendFailureZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NonePaymentSendFailureZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NonePaymentSendFailureZ_clone(uint32_t orig) {
+       LDKCResult_NonePaymentSendFailureZ* orig_conv = (LDKCResult_NonePaymentSendFailureZ*)(orig & ~1);
+       LDKCResult_NonePaymentSendFailureZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentSendFailureZ), "LDKCResult_NonePaymentSendFailureZ");
+       *ret_conv = CResult_NonePaymentSendFailureZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 void  __attribute__((visibility("default"))) TS_CVec_NetAddressZ_free(uint32_tArray _res) {
        LDKCVec_NetAddressZ _res_constr;
        _res_constr.datalen = *((uint32_t*)_res);
@@ -5216,7 +5069,7 @@ void  __attribute__((visibility("default"))) TS_CVec_NetAddressZ_free(uint32_tAr
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t m = 0; m < _res_constr.datalen; m++) {
                uint32_t arr_conv_12 = _res_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                _res_constr.data[m] = arr_conv_12_conv;
        }
@@ -5242,7 +5095,8 @@ void  __attribute__((visibility("default"))) TS_CVec_ChannelMonitorZ_free(uint32
 }
 
 void  __attribute__((visibility("default"))) TS_C2Tuple_BlockHashChannelManagerZ_free(uint32_t _res) {
-       LDKC2Tuple_BlockHashChannelManagerZ _res_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC2Tuple_BlockHashChannelManagerZ _res_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C2Tuple_BlockHashChannelManagerZ_free(_res_conv);
 }
@@ -5254,16 +5108,14 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_BlockHashChannelMana
        LDKChannelManager b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelManager
        LDKC2Tuple_BlockHashChannelManagerZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_BlockHashChannelManagerZ), "LDKC2Tuple_BlockHashChannelManagerZ");
        *ret_ref = C2Tuple_BlockHashChannelManagerZ_new(a_ref, b_conv);
-       ret_ref->a = ThirtyTwoBytes_clone(&ret_ref->a);
-       // XXX: We likely need to clone here, but no _clone fn is available for ChannelManager
        return (long)ret_ref;
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(uint32_t o) {
-       LDKC2Tuple_BlockHashChannelManagerZ o_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)o;
+       LDKC2Tuple_BlockHashChannelManagerZ o_conv = *(LDKC2Tuple_BlockHashChannelManagerZ*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(o_conv);
@@ -5274,20 +5126,21 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_C2Tuple_BlockHashCha
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ");
        *ret_conv = CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ _res_conv = *(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_free(_res_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_CResult_NetAddressu8Z_ok(uint32_t o) {
-       LDKNetAddress o_conv = *(LDKNetAddress*)o;
+       LDKNetAddress o_conv = *(LDKNetAddress*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_NetAddressu8Z* ret_conv = MALLOC(sizeof(LDKCResult_NetAddressu8Z), "LDKCResult_NetAddressu8Z");
        *ret_conv = CResult_NetAddressu8Z_ok(o_conv);
@@ -5301,13 +5154,21 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NetAddressu8Z_err(in
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NetAddressu8Z_free(uint32_t _res) {
-       LDKCResult_NetAddressu8Z _res_conv = *(LDKCResult_NetAddressu8Z*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NetAddressu8Z _res_conv = *(LDKCResult_NetAddressu8Z*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NetAddressu8Z_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NetAddressu8Z_clone(uint32_t orig) {
+       LDKCResult_NetAddressu8Z* orig_conv = (LDKCResult_NetAddressu8Z*)(orig & ~1);
+       LDKCResult_NetAddressu8Z* ret_conv = MALLOC(sizeof(LDKCResult_NetAddressu8Z), "LDKCResult_NetAddressu8Z");
+       *ret_conv = CResult_NetAddressu8Z_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_CResult_NetAddressu8ZDecodeErrorZ_ok(uint32_t o) {
-       LDKCResult_NetAddressu8Z o_conv = *(LDKCResult_NetAddressu8Z*)o;
+       LDKCResult_NetAddressu8Z o_conv = *(LDKCResult_NetAddressu8Z*)(((uint64_t)o) & ~1);
        FREE((void*)o);
        LDKCResult_CResult_NetAddressu8ZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ), "LDKCResult_CResult_NetAddressu8ZDecodeErrorZ");
        *ret_conv = CResult_CResult_NetAddressu8ZDecodeErrorZ_ok(o_conv);
@@ -5318,14 +5179,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_CResult_NetAddressu8
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_CResult_NetAddressu8ZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ), "LDKCResult_CResult_NetAddressu8ZDecodeErrorZ");
        *ret_conv = CResult_CResult_NetAddressu8ZDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_CResult_NetAddressu8ZDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ _res_conv = *(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_CResult_NetAddressu8ZDecodeErrorZ _res_conv = *(LDKCResult_CResult_NetAddressu8ZDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_CResult_NetAddressu8ZDecodeErrorZ_free(_res_conv);
 }
@@ -5427,20 +5289,29 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_boolLightningErrorZ_
        LDKLightningError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = LightningError_clone(&e_conv);
        LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
        *ret_conv = CResult_boolLightningErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_boolLightningErrorZ_free(uint32_t _res) {
-       LDKCResult_boolLightningErrorZ _res_conv = *(LDKCResult_boolLightningErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_boolLightningErrorZ _res_conv = *(LDKCResult_boolLightningErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_boolLightningErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_boolLightningErrorZ_clone(uint32_t orig) {
+       LDKCResult_boolLightningErrorZ* orig_conv = (LDKCResult_boolLightningErrorZ*)(orig & ~1);
+       LDKCResult_boolLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolLightningErrorZ), "LDKCResult_boolLightningErrorZ");
+       *ret_conv = CResult_boolLightningErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 void  __attribute__((visibility("default"))) TS_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(uint32_t _res) {
-       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(_res_conv);
 }
@@ -5449,23 +5320,17 @@ uint32_t  __attribute__((visibility("default"))) TS_C3Tuple_ChannelAnnouncementC
        LDKChannelAnnouncement a_conv;
        a_conv.inner = (void*)(a & (~1));
        a_conv.is_owned = (a & 1) || (a == 0);
-       if (a_conv.inner != NULL)
-               a_conv = ChannelAnnouncement_clone(&a_conv);
+       a_conv = ChannelAnnouncement_clone(&a_conv);
        LDKChannelUpdate b_conv;
        b_conv.inner = (void*)(b & (~1));
        b_conv.is_owned = (b & 1) || (b == 0);
-       if (b_conv.inner != NULL)
-               b_conv = ChannelUpdate_clone(&b_conv);
+       b_conv = ChannelUpdate_clone(&b_conv);
        LDKChannelUpdate c_conv;
        c_conv.inner = (void*)(c & (~1));
        c_conv.is_owned = (c & 1) || (c == 0);
-       if (c_conv.inner != NULL)
-               c_conv = ChannelUpdate_clone(&c_conv);
+       c_conv = ChannelUpdate_clone(&c_conv);
        LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ* ret_ref = MALLOC(sizeof(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ), "LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ");
        *ret_ref = C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(a_conv, b_conv, c_conv);
-       ret_ref->a = ChannelAnnouncement_clone(&ret_ref->a);
-       ret_ref->b = ChannelUpdate_clone(&ret_ref->b);
-       ret_ref->c = ChannelUpdate_clone(&ret_ref->c);
        return (long)ret_ref;
 }
 
@@ -5479,7 +5344,7 @@ void  __attribute__((visibility("default"))) TS_CVec_C3Tuple_ChannelAnnouncement
        uint32_t* _res_vals = (uint32_t*)(_res + 4);
        for (size_t l = 0; l < _res_constr.datalen; l++) {
                uint32_t arr_conv_63 = _res_vals[l];
-               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)arr_conv_63;
+               LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ arr_conv_63_conv = *(LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ*)(((uint64_t)arr_conv_63) & ~1);
                FREE((void*)arr_conv_63);
                _res_constr.data[l] = arr_conv_63_conv;
        }
@@ -5514,24 +5379,31 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneLightningErrorZ_
        LDKLightningError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = LightningError_clone(&e_conv);
        LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
        *ret_conv = CResult_NoneLightningErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NoneLightningErrorZ_free(uint32_t _res) {
-       LDKCResult_NoneLightningErrorZ _res_conv = *(LDKCResult_NoneLightningErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NoneLightningErrorZ _res_conv = *(LDKCResult_NoneLightningErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NoneLightningErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NoneLightningErrorZ_clone(uint32_t orig) {
+       LDKCResult_NoneLightningErrorZ* orig_conv = (LDKCResult_NoneLightningErrorZ*)(orig & ~1);
+       LDKCResult_NoneLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneLightningErrorZ), "LDKCResult_NoneLightningErrorZ");
+       *ret_conv = CResult_NoneLightningErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_ChannelReestablishDecodeErrorZ_ok(uint32_t o) {
        LDKChannelReestablish o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ChannelReestablish_clone(&o_conv);
+       o_conv = ChannelReestablish_clone(&o_conv);
        LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
        *ret_conv = CResult_ChannelReestablishDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5541,14 +5413,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ChannelReestablishDe
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ChannelReestablishDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelReestablishDecodeErrorZ), "LDKCResult_ChannelReestablishDecodeErrorZ");
        *ret_conv = CResult_ChannelReestablishDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_ChannelReestablishDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_ChannelReestablishDecodeErrorZ _res_conv = *(LDKCResult_ChannelReestablishDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ChannelReestablishDecodeErrorZ _res_conv = *(LDKCResult_ChannelReestablishDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ChannelReestablishDecodeErrorZ_free(_res_conv);
 }
@@ -5557,8 +5430,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_InitDecodeErrorZ_ok(
        LDKInit o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Init_clone(&o_conv);
+       o_conv = Init_clone(&o_conv);
        LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
        *ret_conv = CResult_InitDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5568,14 +5440,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_InitDecodeErrorZ_err
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_InitDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_InitDecodeErrorZ), "LDKCResult_InitDecodeErrorZ");
        *ret_conv = CResult_InitDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_InitDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_InitDecodeErrorZ _res_conv = *(LDKCResult_InitDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_InitDecodeErrorZ _res_conv = *(LDKCResult_InitDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_InitDecodeErrorZ_free(_res_conv);
 }
@@ -5584,8 +5457,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_PingDecodeErrorZ_ok(
        LDKPing o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Ping_clone(&o_conv);
+       o_conv = Ping_clone(&o_conv);
        LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
        *ret_conv = CResult_PingDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5595,14 +5467,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_PingDecodeErrorZ_err
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_PingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PingDecodeErrorZ), "LDKCResult_PingDecodeErrorZ");
        *ret_conv = CResult_PingDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_PingDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_PingDecodeErrorZ _res_conv = *(LDKCResult_PingDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_PingDecodeErrorZ _res_conv = *(LDKCResult_PingDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_PingDecodeErrorZ_free(_res_conv);
 }
@@ -5611,8 +5484,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_PongDecodeErrorZ_ok(
        LDKPong o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Pong_clone(&o_conv);
+       o_conv = Pong_clone(&o_conv);
        LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
        *ret_conv = CResult_PongDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5622,14 +5494,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_PongDecodeErrorZ_err
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_PongDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PongDecodeErrorZ), "LDKCResult_PongDecodeErrorZ");
        *ret_conv = CResult_PongDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_PongDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_PongDecodeErrorZ _res_conv = *(LDKCResult_PongDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_PongDecodeErrorZ _res_conv = *(LDKCResult_PongDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_PongDecodeErrorZ_free(_res_conv);
 }
@@ -5638,8 +5511,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_UnsignedChannelAnnou
        LDKUnsignedChannelAnnouncement o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = UnsignedChannelAnnouncement_clone(&o_conv);
+       o_conv = UnsignedChannelAnnouncement_clone(&o_conv);
        LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5649,14 +5521,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_UnsignedChannelAnnou
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ), "LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelAnnouncementDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_UnsignedChannelAnnouncementDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_UnsignedChannelAnnouncementDecodeErrorZ_free(_res_conv);
 }
@@ -5665,8 +5538,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_UnsignedChannelUpdat
        LDKUnsignedChannelUpdate o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = UnsignedChannelUpdate_clone(&o_conv);
+       o_conv = UnsignedChannelUpdate_clone(&o_conv);
        LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5676,14 +5548,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_UnsignedChannelUpdat
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_UnsignedChannelUpdateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedChannelUpdateDecodeErrorZ), "LDKCResult_UnsignedChannelUpdateDecodeErrorZ");
        *ret_conv = CResult_UnsignedChannelUpdateDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_UnsignedChannelUpdateDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_UnsignedChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_UnsignedChannelUpdateDecodeErrorZ _res_conv = *(LDKCResult_UnsignedChannelUpdateDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_UnsignedChannelUpdateDecodeErrorZ_free(_res_conv);
 }
@@ -5692,8 +5565,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ErrorMessageDecodeEr
        LDKErrorMessage o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ErrorMessage_clone(&o_conv);
+       o_conv = ErrorMessage_clone(&o_conv);
        LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
        *ret_conv = CResult_ErrorMessageDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5703,14 +5575,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ErrorMessageDecodeEr
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ErrorMessageDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ErrorMessageDecodeErrorZ), "LDKCResult_ErrorMessageDecodeErrorZ");
        *ret_conv = CResult_ErrorMessageDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_ErrorMessageDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_ErrorMessageDecodeErrorZ _res_conv = *(LDKCResult_ErrorMessageDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ErrorMessageDecodeErrorZ _res_conv = *(LDKCResult_ErrorMessageDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ErrorMessageDecodeErrorZ_free(_res_conv);
 }
@@ -5719,8 +5592,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_UnsignedNodeAnnounce
        LDKUnsignedNodeAnnouncement o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = UnsignedNodeAnnouncement_clone(&o_conv);
+       o_conv = UnsignedNodeAnnouncement_clone(&o_conv);
        LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5730,14 +5602,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_UnsignedNodeAnnounce
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ), "LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ");
        *ret_conv = CResult_UnsignedNodeAnnouncementDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_UnsignedNodeAnnouncementDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ _res_conv = *(LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_UnsignedNodeAnnouncementDecodeErrorZ_free(_res_conv);
 }
@@ -5746,8 +5619,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_QueryShortChannelIds
        LDKQueryShortChannelIds o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = QueryShortChannelIds_clone(&o_conv);
+       o_conv = QueryShortChannelIds_clone(&o_conv);
        LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
        *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5757,14 +5629,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_QueryShortChannelIds
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_QueryShortChannelIdsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryShortChannelIdsDecodeErrorZ), "LDKCResult_QueryShortChannelIdsDecodeErrorZ");
        *ret_conv = CResult_QueryShortChannelIdsDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_QueryShortChannelIdsDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_QueryShortChannelIdsDecodeErrorZ _res_conv = *(LDKCResult_QueryShortChannelIdsDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_QueryShortChannelIdsDecodeErrorZ _res_conv = *(LDKCResult_QueryShortChannelIdsDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_QueryShortChannelIdsDecodeErrorZ_free(_res_conv);
 }
@@ -5773,8 +5646,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ReplyShortChannelIds
        LDKReplyShortChannelIdsEnd o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ReplyShortChannelIdsEnd_clone(&o_conv);
+       o_conv = ReplyShortChannelIdsEnd_clone(&o_conv);
        LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
        *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5784,14 +5656,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ReplyShortChannelIds
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ), "LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ");
        *ret_conv = CResult_ReplyShortChannelIdsEndDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_ReplyShortChannelIdsEndDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ _res_conv = *(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ _res_conv = *(LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ReplyShortChannelIdsEndDecodeErrorZ_free(_res_conv);
 }
@@ -5800,8 +5673,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_QueryChannelRangeDec
        LDKQueryChannelRange o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = QueryChannelRange_clone(&o_conv);
+       o_conv = QueryChannelRange_clone(&o_conv);
        LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
        *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5811,14 +5683,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_QueryChannelRangeDec
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_QueryChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_QueryChannelRangeDecodeErrorZ), "LDKCResult_QueryChannelRangeDecodeErrorZ");
        *ret_conv = CResult_QueryChannelRangeDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_QueryChannelRangeDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_QueryChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_QueryChannelRangeDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_QueryChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_QueryChannelRangeDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_QueryChannelRangeDecodeErrorZ_free(_res_conv);
 }
@@ -5827,8 +5700,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ReplyChannelRangeDec
        LDKReplyChannelRange o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = ReplyChannelRange_clone(&o_conv);
+       o_conv = ReplyChannelRange_clone(&o_conv);
        LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
        *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5838,14 +5710,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_ReplyChannelRangeDec
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_ReplyChannelRangeDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReplyChannelRangeDecodeErrorZ), "LDKCResult_ReplyChannelRangeDecodeErrorZ");
        *ret_conv = CResult_ReplyChannelRangeDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_ReplyChannelRangeDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_ReplyChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_ReplyChannelRangeDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_ReplyChannelRangeDecodeErrorZ _res_conv = *(LDKCResult_ReplyChannelRangeDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_ReplyChannelRangeDecodeErrorZ_free(_res_conv);
 }
@@ -5854,8 +5727,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_GossipTimestampFilte
        LDKGossipTimestampFilter o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = GossipTimestampFilter_clone(&o_conv);
+       o_conv = GossipTimestampFilter_clone(&o_conv);
        LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
        *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -5865,14 +5737,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_GossipTimestampFilte
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_GossipTimestampFilterDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_GossipTimestampFilterDecodeErrorZ), "LDKCResult_GossipTimestampFilterDecodeErrorZ");
        *ret_conv = CResult_GossipTimestampFilterDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_GossipTimestampFilterDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_GossipTimestampFilterDecodeErrorZ _res_conv = *(LDKCResult_GossipTimestampFilterDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_GossipTimestampFilterDecodeErrorZ _res_conv = *(LDKCResult_GossipTimestampFilterDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_GossipTimestampFilterDecodeErrorZ_free(_res_conv);
 }
@@ -5917,18 +5790,26 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_u8ZPeerHandleEr
        LDKPeerHandleError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PeerHandleError_clone(&e_conv);
        LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
        *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_CVec_u8ZPeerHandleErrorZ_free(uint32_t _res) {
-       LDKCResult_CVec_u8ZPeerHandleErrorZ _res_conv = *(LDKCResult_CVec_u8ZPeerHandleErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_CVec_u8ZPeerHandleErrorZ _res_conv = *(LDKCResult_CVec_u8ZPeerHandleErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_CVec_u8ZPeerHandleErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_u8ZPeerHandleErrorZ_clone(uint32_t orig) {
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* orig_conv = (LDKCResult_CVec_u8ZPeerHandleErrorZ*)(orig & ~1);
+       LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
+       *ret_conv = CResult_CVec_u8ZPeerHandleErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_NonePeerHandleErrorZ_ok() {
        LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
        *ret_conv = CResult_NonePeerHandleErrorZ_ok();
@@ -5939,18 +5820,26 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NonePeerHandleErrorZ
        LDKPeerHandleError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PeerHandleError_clone(&e_conv);
        LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
        *ret_conv = CResult_NonePeerHandleErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NonePeerHandleErrorZ_free(uint32_t _res) {
-       LDKCResult_NonePeerHandleErrorZ _res_conv = *(LDKCResult_NonePeerHandleErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NonePeerHandleErrorZ _res_conv = *(LDKCResult_NonePeerHandleErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NonePeerHandleErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NonePeerHandleErrorZ_clone(uint32_t orig) {
+       LDKCResult_NonePeerHandleErrorZ* orig_conv = (LDKCResult_NonePeerHandleErrorZ*)(orig & ~1);
+       LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
+       *ret_conv = CResult_NonePeerHandleErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_boolPeerHandleErrorZ_ok(jboolean o) {
        LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
        *ret_conv = CResult_boolPeerHandleErrorZ_ok(o);
@@ -5961,18 +5850,26 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_boolPeerHandleErrorZ
        LDKPeerHandleError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = PeerHandleError_clone(&e_conv);
        LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
        *ret_conv = CResult_boolPeerHandleErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_boolPeerHandleErrorZ_free(uint32_t _res) {
-       LDKCResult_boolPeerHandleErrorZ _res_conv = *(LDKCResult_boolPeerHandleErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_boolPeerHandleErrorZ _res_conv = *(LDKCResult_boolPeerHandleErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_boolPeerHandleErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_boolPeerHandleErrorZ_clone(uint32_t orig) {
+       LDKCResult_boolPeerHandleErrorZ* orig_conv = (LDKCResult_boolPeerHandleErrorZ*)(orig & ~1);
+       LDKCResult_boolPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_boolPeerHandleErrorZ), "LDKCResult_boolPeerHandleErrorZ");
+       *ret_conv = CResult_boolPeerHandleErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_SecretKeySecpErrorZ_ok(int8_tArray o) {
        LDKSecretKey o_ref;
        CHECK(*((uint32_t*)o) == 32);
@@ -5990,7 +5887,8 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_SecretKeySecpErrorZ_
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_SecretKeySecpErrorZ_free(uint32_t _res) {
-       LDKCResult_SecretKeySecpErrorZ _res_conv = *(LDKCResult_SecretKeySecpErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_SecretKeySecpErrorZ _res_conv = *(LDKCResult_SecretKeySecpErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_SecretKeySecpErrorZ_free(_res_conv);
 }
@@ -6012,7 +5910,8 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_PublicKeySecpErrorZ_
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_PublicKeySecpErrorZ_free(uint32_t _res) {
-       LDKCResult_PublicKeySecpErrorZ _res_conv = *(LDKCResult_PublicKeySecpErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_PublicKeySecpErrorZ _res_conv = *(LDKCResult_PublicKeySecpErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_PublicKeySecpErrorZ_free(_res_conv);
 }
@@ -6021,8 +5920,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_TxCreationKeysSecpEr
        LDKTxCreationKeys o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = TxCreationKeys_clone(&o_conv);
+       o_conv = TxCreationKeys_clone(&o_conv);
        LDKCResult_TxCreationKeysSecpErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_TxCreationKeysSecpErrorZ), "LDKCResult_TxCreationKeysSecpErrorZ");
        *ret_conv = CResult_TxCreationKeysSecpErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6036,7 +5934,8 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_TxCreationKeysSecpEr
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_TxCreationKeysSecpErrorZ_free(uint32_t _res) {
-       LDKCResult_TxCreationKeysSecpErrorZ _res_conv = *(LDKCResult_TxCreationKeysSecpErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_TxCreationKeysSecpErrorZ _res_conv = *(LDKCResult_TxCreationKeysSecpErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_TxCreationKeysSecpErrorZ_free(_res_conv);
 }
@@ -6045,7 +5944,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_TrustedCommitmentTra
        LDKTrustedCommitmentTransaction o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKTrustedCommitmentTransaction
        LDKCResult_TrustedCommitmentTransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TrustedCommitmentTransactionNoneZ), "LDKCResult_TrustedCommitmentTransactionNoneZ");
        *ret_conv = CResult_TrustedCommitmentTransactionNoneZ_ok(o_conv);
        return (long)ret_conv;
@@ -6058,11 +5957,52 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_TrustedCommitmentTra
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_TrustedCommitmentTransactionNoneZ_free(uint32_t _res) {
-       LDKCResult_TrustedCommitmentTransactionNoneZ _res_conv = *(LDKCResult_TrustedCommitmentTransactionNoneZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_TrustedCommitmentTransactionNoneZ _res_conv = *(LDKCResult_TrustedCommitmentTransactionNoneZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_TrustedCommitmentTransactionNoneZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_ok(ptrArray o) {
+       LDKCVec_SignatureZ o_constr;
+       o_constr.datalen = *((uint32_t*)o);
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKSignature), "LDKCVec_SignatureZ Elements");
+       else
+               o_constr.data = NULL;
+       int8_tArray* o_vals = (int8_tArray*)(o + 4);
+       for (size_t m = 0; m < o_constr.datalen; m++) {
+               int8_tArray arr_conv_12 = o_vals[m];
+               LDKSignature arr_conv_12_ref;
+               CHECK(*((uint32_t*)arr_conv_12) == 64);
+               memcpy(arr_conv_12_ref.compact_form, (uint8_t*)(arr_conv_12 + 4), 64);
+               o_constr.data[m] = arr_conv_12_ref;
+       }
+       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
+       *ret_conv = CResult_CVec_SignatureZNoneZ_ok(o_constr);
+       return (long)ret_conv;
+}
+
+uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_err() {
+       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
+       *ret_conv = CResult_CVec_SignatureZNoneZ_err();
+       return (long)ret_conv;
+}
+
+void  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_free(uint32_t _res) {
+       if ((_res & 1) != 0) return;
+       LDKCResult_CVec_SignatureZNoneZ _res_conv = *(LDKCResult_CVec_SignatureZNoneZ*)(((uint64_t)_res) & ~1);
+       FREE((void*)_res);
+       CResult_CVec_SignatureZNoneZ_free(_res_conv);
+}
+
+uint32_t  __attribute__((visibility("default"))) TS_CResult_CVec_SignatureZNoneZ_clone(uint32_t orig) {
+       LDKCResult_CVec_SignatureZNoneZ* orig_conv = (LDKCResult_CVec_SignatureZNoneZ*)(orig & ~1);
+       LDKCResult_CVec_SignatureZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_SignatureZNoneZ), "LDKCResult_CVec_SignatureZNoneZ");
+       *ret_conv = CResult_CVec_SignatureZNoneZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 void  __attribute__((visibility("default"))) TS_CVec_RouteHopZ_free(uint32_tArray _res) {
        LDKCVec_RouteHopZ _res_constr;
        _res_constr.datalen = *((uint32_t*)_res);
@@ -6114,8 +6054,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_RouteDecodeErrorZ_ok
        LDKRoute o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Route_clone(&o_conv);
+       o_conv = Route_clone(&o_conv);
        LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
        *ret_conv = CResult_RouteDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6125,14 +6064,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_RouteDecodeErrorZ_er
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_RouteDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteDecodeErrorZ), "LDKCResult_RouteDecodeErrorZ");
        *ret_conv = CResult_RouteDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_RouteDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_RouteDecodeErrorZ _res_conv = *(LDKCResult_RouteDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_RouteDecodeErrorZ _res_conv = *(LDKCResult_RouteDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_RouteDecodeErrorZ_free(_res_conv);
 }
@@ -6159,8 +6099,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_RouteLightningErrorZ
        LDKRoute o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = Route_clone(&o_conv);
+       o_conv = Route_clone(&o_conv);
        LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
        *ret_conv = CResult_RouteLightningErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6170,14 +6109,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_RouteLightningErrorZ
        LDKLightningError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = LightningError_clone(&e_conv);
        LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
        *ret_conv = CResult_RouteLightningErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_RouteLightningErrorZ_free(uint32_t _res) {
-       LDKCResult_RouteLightningErrorZ _res_conv = *(LDKCResult_RouteLightningErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_RouteLightningErrorZ _res_conv = *(LDKCResult_RouteLightningErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_RouteLightningErrorZ_free(_res_conv);
 }
@@ -6186,8 +6126,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_RoutingFeesDecodeErr
        LDKRoutingFees o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       if (o_conv.inner != NULL)
-               o_conv = RoutingFees_clone(&o_conv);
+       o_conv = RoutingFees_clone(&o_conv);
        LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
        *ret_conv = CResult_RoutingFeesDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6197,14 +6136,15 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_RoutingFeesDecodeErr
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_RoutingFeesDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RoutingFeesDecodeErrorZ), "LDKCResult_RoutingFeesDecodeErrorZ");
        *ret_conv = CResult_RoutingFeesDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_RoutingFeesDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_RoutingFeesDecodeErrorZ _res_conv = *(LDKCResult_RoutingFeesDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_RoutingFeesDecodeErrorZ _res_conv = *(LDKCResult_RoutingFeesDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_RoutingFeesDecodeErrorZ_free(_res_conv);
 }
@@ -6213,7 +6153,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NodeAnnouncementInfo
        LDKNodeAnnouncementInfo o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       o_conv = NodeAnnouncementInfo_clone(&o_conv);
        LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
        *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6223,23 +6163,31 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NodeAnnouncementInfo
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
        *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NodeAnnouncementInfoDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_NodeAnnouncementInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NodeAnnouncementInfoDecodeErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NodeAnnouncementInfoDecodeErrorZ_clone(uint32_t orig) {
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeAnnouncementInfoDecodeErrorZ*)(orig & ~1);
+       LDKCResult_NodeAnnouncementInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeAnnouncementInfoDecodeErrorZ), "LDKCResult_NodeAnnouncementInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeAnnouncementInfoDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_NodeInfoDecodeErrorZ_ok(uint32_t o) {
        LDKNodeInfo o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       o_conv = NodeInfo_clone(&o_conv);
        LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
        *ret_conv = CResult_NodeInfoDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6249,23 +6197,31 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NodeInfoDecodeErrorZ
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
        *ret_conv = CResult_NodeInfoDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NodeInfoDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_NodeInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeInfoDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NodeInfoDecodeErrorZ _res_conv = *(LDKCResult_NodeInfoDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NodeInfoDecodeErrorZ_free(_res_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_CResult_NodeInfoDecodeErrorZ_clone(uint32_t orig) {
+       LDKCResult_NodeInfoDecodeErrorZ* orig_conv = (LDKCResult_NodeInfoDecodeErrorZ*)(orig & ~1);
+       LDKCResult_NodeInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NodeInfoDecodeErrorZ), "LDKCResult_NodeInfoDecodeErrorZ");
+       *ret_conv = CResult_NodeInfoDecodeErrorZ_clone(orig_conv);
+       return (long)ret_conv;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_CResult_NetworkGraphDecodeErrorZ_ok(uint32_t o) {
        LDKNetworkGraph o_conv;
        o_conv.inner = (void*)(o & (~1));
        o_conv.is_owned = (o & 1) || (o == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNetworkGraph
        LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
        *ret_conv = CResult_NetworkGraphDecodeErrorZ_ok(o_conv);
        return (long)ret_conv;
@@ -6275,20 +6231,22 @@ uint32_t  __attribute__((visibility("default"))) TS_CResult_NetworkGraphDecodeEr
        LDKDecodeError e_conv;
        e_conv.inner = (void*)(e & (~1));
        e_conv.is_owned = (e & 1) || (e == 0);
-       // Warning: we may need a move here but can't clone!
+       e_conv = DecodeError_clone(&e_conv);
        LDKCResult_NetworkGraphDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NetworkGraphDecodeErrorZ), "LDKCResult_NetworkGraphDecodeErrorZ");
        *ret_conv = CResult_NetworkGraphDecodeErrorZ_err(e_conv);
        return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_CResult_NetworkGraphDecodeErrorZ_free(uint32_t _res) {
-       LDKCResult_NetworkGraphDecodeErrorZ _res_conv = *(LDKCResult_NetworkGraphDecodeErrorZ*)_res;
+       if ((_res & 1) != 0) return;
+       LDKCResult_NetworkGraphDecodeErrorZ _res_conv = *(LDKCResult_NetworkGraphDecodeErrorZ*)(((uint64_t)_res) & ~1);
        FREE((void*)_res);
        CResult_NetworkGraphDecodeErrorZ_free(_res_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_Event_free(uint32_t this_ptr) {
-       LDKEvent this_ptr_conv = *(LDKEvent*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKEvent this_ptr_conv = *(LDKEvent*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Event_free(this_ptr_conv);
 }
@@ -6311,7 +6269,8 @@ int8_tArray  __attribute__((visibility("default"))) TS_Event_write(uint32_t obj)
 }
 
 void  __attribute__((visibility("default"))) TS_MessageSendEvent_free(uint32_t this_ptr) {
-       LDKMessageSendEvent this_ptr_conv = *(LDKMessageSendEvent*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKMessageSendEvent this_ptr_conv = *(LDKMessageSendEvent*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        MessageSendEvent_free(this_ptr_conv);
 }
@@ -6325,19 +6284,22 @@ uint32_t  __attribute__((visibility("default"))) TS_MessageSendEvent_clone(uint3
 }
 
 void  __attribute__((visibility("default"))) TS_MessageSendEventsProvider_free(uint32_t this_ptr) {
-       LDKMessageSendEventsProvider this_ptr_conv = *(LDKMessageSendEventsProvider*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKMessageSendEventsProvider this_ptr_conv = *(LDKMessageSendEventsProvider*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        MessageSendEventsProvider_free(this_ptr_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_EventsProvider_free(uint32_t this_ptr) {
-       LDKEventsProvider this_ptr_conv = *(LDKEventsProvider*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKEventsProvider this_ptr_conv = *(LDKEventsProvider*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        EventsProvider_free(this_ptr_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_APIError_free(uint32_t this_ptr) {
-       LDKAPIError this_ptr_conv = *(LDKAPIError*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKAPIError this_ptr_conv = *(LDKAPIError*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        APIError_free(this_ptr_conv);
 }
@@ -6351,7 +6313,7 @@ uint32_t  __attribute__((visibility("default"))) TS_APIError_clone(uint32_t orig
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_Level_clone(uint32_t orig) {
-       LDKLevel* orig_conv = (LDKLevel*)orig;
+       LDKLevel* orig_conv = (LDKLevel*)(orig & ~1);
        uint32_t ret_conv = LDKLevel_to_js(Level_clone(orig_conv));
        return ret_conv;
 }
@@ -6362,7 +6324,8 @@ uint32_t  __attribute__((visibility("default"))) TS_Level_max() {
 }
 
 void  __attribute__((visibility("default"))) TS_Logger_free(uint32_t this_ptr) {
-       LDKLogger this_ptr_conv = *(LDKLogger*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKLogger this_ptr_conv = *(LDKLogger*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Logger_free(this_ptr_conv);
 }
@@ -6803,8 +6766,7 @@ void  __attribute__((visibility("default"))) TS_UserConfig_set_own_channel_confi
        LDKChannelHandshakeConfig val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelHandshakeConfig_clone(&val_conv);
+       val_conv = ChannelHandshakeConfig_clone(&val_conv);
        UserConfig_set_own_channel_config(&this_ptr_conv, val_conv);
 }
 
@@ -6829,8 +6791,7 @@ void  __attribute__((visibility("default"))) TS_UserConfig_set_peer_channel_conf
        LDKChannelHandshakeLimits val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelHandshakeLimits_clone(&val_conv);
+       val_conv = ChannelHandshakeLimits_clone(&val_conv);
        UserConfig_set_peer_channel_config_limits(&this_ptr_conv, val_conv);
 }
 
@@ -6855,8 +6816,7 @@ void  __attribute__((visibility("default"))) TS_UserConfig_set_channel_options(u
        LDKChannelConfig val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelConfig_clone(&val_conv);
+       val_conv = ChannelConfig_clone(&val_conv);
        UserConfig_set_channel_options(&this_ptr_conv, val_conv);
 }
 
@@ -6864,18 +6824,15 @@ uint32_t  __attribute__((visibility("default"))) TS_UserConfig_new(uint32_t own_
        LDKChannelHandshakeConfig own_channel_config_arg_conv;
        own_channel_config_arg_conv.inner = (void*)(own_channel_config_arg & (~1));
        own_channel_config_arg_conv.is_owned = (own_channel_config_arg & 1) || (own_channel_config_arg == 0);
-       if (own_channel_config_arg_conv.inner != NULL)
-               own_channel_config_arg_conv = ChannelHandshakeConfig_clone(&own_channel_config_arg_conv);
+       own_channel_config_arg_conv = ChannelHandshakeConfig_clone(&own_channel_config_arg_conv);
        LDKChannelHandshakeLimits peer_channel_config_limits_arg_conv;
        peer_channel_config_limits_arg_conv.inner = (void*)(peer_channel_config_limits_arg & (~1));
        peer_channel_config_limits_arg_conv.is_owned = (peer_channel_config_limits_arg & 1) || (peer_channel_config_limits_arg == 0);
-       if (peer_channel_config_limits_arg_conv.inner != NULL)
-               peer_channel_config_limits_arg_conv = ChannelHandshakeLimits_clone(&peer_channel_config_limits_arg_conv);
+       peer_channel_config_limits_arg_conv = ChannelHandshakeLimits_clone(&peer_channel_config_limits_arg_conv);
        LDKChannelConfig channel_options_arg_conv;
        channel_options_arg_conv.inner = (void*)(channel_options_arg & (~1));
        channel_options_arg_conv.is_owned = (channel_options_arg & 1) || (channel_options_arg == 0);
-       if (channel_options_arg_conv.inner != NULL)
-               channel_options_arg_conv = ChannelConfig_clone(&channel_options_arg_conv);
+       channel_options_arg_conv = ChannelConfig_clone(&channel_options_arg_conv);
        LDKUserConfig ret_var = UserConfig_new(own_channel_config_arg_conv, peer_channel_config_limits_arg_conv, channel_options_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -6898,43 +6855,48 @@ uint32_t  __attribute__((visibility("default"))) TS_UserConfig_default() {
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_AccessError_clone(uint32_t orig) {
-       LDKAccessError* orig_conv = (LDKAccessError*)orig;
+       LDKAccessError* orig_conv = (LDKAccessError*)(orig & ~1);
        uint32_t ret_conv = LDKAccessError_to_js(AccessError_clone(orig_conv));
        return ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_Access_free(uint32_t this_ptr) {
-       LDKAccess this_ptr_conv = *(LDKAccess*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKAccess this_ptr_conv = *(LDKAccess*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Access_free(this_ptr_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_Watch_free(uint32_t this_ptr) {
-       LDKWatch this_ptr_conv = *(LDKWatch*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKWatch this_ptr_conv = *(LDKWatch*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Watch_free(this_ptr_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_Filter_free(uint32_t this_ptr) {
-       LDKFilter this_ptr_conv = *(LDKFilter*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKFilter this_ptr_conv = *(LDKFilter*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Filter_free(this_ptr_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_BroadcasterInterface_free(uint32_t this_ptr) {
-       LDKBroadcasterInterface this_ptr_conv = *(LDKBroadcasterInterface*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKBroadcasterInterface this_ptr_conv = *(LDKBroadcasterInterface*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        BroadcasterInterface_free(this_ptr_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_ConfirmationTarget_clone(uint32_t orig) {
-       LDKConfirmationTarget* orig_conv = (LDKConfirmationTarget*)orig;
+       LDKConfirmationTarget* orig_conv = (LDKConfirmationTarget*)(orig & ~1);
        uint32_t ret_conv = LDKConfirmationTarget_to_js(ConfirmationTarget_clone(orig_conv));
        return ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_FeeEstimator_free(uint32_t this_ptr) {
-       LDKFeeEstimator this_ptr_conv = *(LDKFeeEstimator*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKFeeEstimator this_ptr_conv = *(LDKFeeEstimator*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        FeeEstimator_free(this_ptr_conv);
 }
@@ -6963,7 +6925,7 @@ void  __attribute__((visibility("default"))) TS_ChainMonitor_block_connected(uin
        uint32_t* txdata_vals = (uint32_t*)(txdata + 4);
        for (size_t e = 0; e < txdata_constr.datalen; e++) {
                uint32_t arr_conv_30 = txdata_vals[e];
-               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_30;
+               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_30) & ~1);
                FREE((void*)arr_conv_30);
                txdata_constr.data[e] = arr_conv_30_conv;
        }
@@ -6983,10 +6945,10 @@ void  __attribute__((visibility("default"))) TS_ChainMonitor_block_disconnected(
 
 uint32_t  __attribute__((visibility("default"))) TS_ChainMonitor_new(uint32_t chain_source, uint32_t broadcaster, uint32_t logger, uint32_t feeest, uint32_t persister) {
        LDKFilter* chain_source_conv = (LDKFilter*)chain_source;
-       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)broadcaster;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
-       LDKFeeEstimator feeest_conv = *(LDKFeeEstimator*)feeest;
-       LDKPersist persister_conv = *(LDKPersist*)persister;
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)broadcaster) & ~1);
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
+       LDKFeeEstimator feeest_conv = *(LDKFeeEstimator*)(((uint64_t)feeest) & ~1);
+       LDKPersist persister_conv = *(LDKPersist*)(((uint64_t)persister) & ~1);
        LDKChainMonitor ret_var = ChainMonitor_new(chain_source_conv, broadcaster_conv, logger_conv, feeest_conv, persister_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -7072,7 +7034,7 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelMonitorUpdate_read(in
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_ChannelMonitorUpdateErr_clone(uint32_t orig) {
-       LDKChannelMonitorUpdateErr* orig_conv = (LDKChannelMonitorUpdateErr*)orig;
+       LDKChannelMonitorUpdateErr* orig_conv = (LDKChannelMonitorUpdateErr*)(orig & ~1);
        uint32_t ret_conv = LDKChannelMonitorUpdateErr_to_js(ChannelMonitorUpdateErr_clone(orig_conv));
        return ret_conv;
 }
@@ -7084,6 +7046,20 @@ void  __attribute__((visibility("default"))) TS_MonitorUpdateError_free(uint32_t
        MonitorUpdateError_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_MonitorUpdateError_clone(uint32_t orig) {
+       LDKMonitorUpdateError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKMonitorUpdateError ret_var = MonitorUpdateError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 void  __attribute__((visibility("default"))) TS_MonitorEvent_free(uint32_t this_ptr) {
        LDKMonitorEvent this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -7158,6 +7134,20 @@ void  __attribute__((visibility("default"))) TS_ChannelMonitor_free(uint32_t thi
        ChannelMonitor_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_ChannelMonitor_clone(uint32_t orig) {
+       LDKChannelMonitor orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKChannelMonitor ret_var = ChannelMonitor_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 int8_tArray  __attribute__((visibility("default"))) TS_ChannelMonitor_write(uint32_t obj) {
        LDKChannelMonitor obj_conv;
        obj_conv.inner = (void*)(obj & (~1));
@@ -7198,8 +7188,6 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelMonitor_get_funding_t
        this_arg_conv.is_owned = false;
        LDKC2Tuple_OutPointScriptZ* ret_ref = MALLOC(sizeof(LDKC2Tuple_OutPointScriptZ), "LDKC2Tuple_OutPointScriptZ");
        *ret_ref = ChannelMonitor_get_funding_txo(&this_arg_conv);
-       ret_ref->a = OutPoint_clone(&ret_ref->a);
-       ret_ref->b = CVec_u8Z_clone(&ret_ref->b);
        return (long)ret_ref;
 }
 
@@ -7277,21 +7265,19 @@ uint32_tArray  __attribute__((visibility("default"))) TS_ChannelMonitor_block_co
        uint32_t* txdata_vals = (uint32_t*)(txdata + 4);
        for (size_t e = 0; e < txdata_constr.datalen; e++) {
                uint32_t arr_conv_30 = txdata_vals[e];
-               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_30;
+               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_30) & ~1);
                FREE((void*)arr_conv_30);
                txdata_constr.data[e] = arr_conv_30_conv;
        }
-       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)broadcaster;
-       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)fee_estimator;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)broadcaster) & ~1);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(((uint64_t)fee_estimator) & ~1);
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ ret_var = ChannelMonitor_block_connected(&this_arg_conv, header_ref, txdata_constr, height, broadcaster_conv, fee_estimator_conv, logger_conv);
        uint32_tArray ret_arr = init_arr(ret_var.datalen, sizeof(uint32_t), "Native uint32_tArray Bytes");
        uint32_t *ret_arr_ptr = (uint32_t*)(ret_arr + 4);
        for (size_t x = 0; x < ret_var.datalen; x++) {
                LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ* arr_conv_49_ref = MALLOC(sizeof(LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ), "LDKC2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ");
                *arr_conv_49_ref = ret_var.data[x];
-               arr_conv_49_ref->a = ThirtyTwoBytes_clone(&arr_conv_49_ref->a);
-               arr_conv_49_ref->b = CVec_C2Tuple_u32TxOutZZ_clone(&arr_conv_49_ref->b);
                ret_arr_ptr[x] = (long)arr_conv_49_ref;
        }
        FREE(ret_var.data);
@@ -7306,14 +7292,15 @@ void  __attribute__((visibility("default"))) TS_ChannelMonitor_block_disconnecte
        CHECK(*((uint32_t*)header) == 80);
        memcpy(header_arr, (uint8_t*)(header + 4), 80);
        unsigned char (*header_ref)[80] = &header_arr;
-       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)broadcaster;
-       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)fee_estimator;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKBroadcasterInterface broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)broadcaster) & ~1);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(((uint64_t)fee_estimator) & ~1);
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        ChannelMonitor_block_disconnected(&this_arg_conv, header_ref, height, broadcaster_conv, fee_estimator_conv, logger_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_Persist_free(uint32_t this_ptr) {
-       LDKPersist this_ptr_conv = *(LDKPersist*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKPersist this_ptr_conv = *(LDKPersist*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        Persist_free(this_ptr_conv);
 }
@@ -7432,7 +7419,8 @@ uint32_t  __attribute__((visibility("default"))) TS_OutPoint_read(int8_tArray se
 }
 
 void  __attribute__((visibility("default"))) TS_SpendableOutputDescriptor_free(uint32_t this_ptr) {
-       LDKSpendableOutputDescriptor this_ptr_conv = *(LDKSpendableOutputDescriptor*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKSpendableOutputDescriptor this_ptr_conv = *(LDKSpendableOutputDescriptor*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        SpendableOutputDescriptor_free(this_ptr_conv);
 }
@@ -7471,13 +7459,15 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelKeys_clone(uint32_t o
 }
 
 void  __attribute__((visibility("default"))) TS_ChannelKeys_free(uint32_t this_ptr) {
-       LDKChannelKeys this_ptr_conv = *(LDKChannelKeys*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKChannelKeys this_ptr_conv = *(LDKChannelKeys*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        ChannelKeys_free(this_ptr_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_KeysInterface_free(uint32_t this_ptr) {
-       LDKKeysInterface this_ptr_conv = *(LDKKeysInterface*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKKeysInterface this_ptr_conv = *(LDKKeysInterface*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        KeysInterface_free(this_ptr_conv);
 }
@@ -7636,7 +7626,7 @@ uint32_t  __attribute__((visibility("default"))) TS_InMemoryChannelKeys_new(int8
        LDKThirtyTwoBytes commitment_seed_ref;
        CHECK(*((uint32_t*)commitment_seed) == 32);
        memcpy(commitment_seed_ref.data, (uint8_t*)(commitment_seed + 4), 32);
-       LDKC2Tuple_u64u64Z key_derivation_params_conv = *(LDKC2Tuple_u64u64Z*)key_derivation_params;
+       LDKC2Tuple_u64u64Z key_derivation_params_conv = *(LDKC2Tuple_u64u64Z*)(((uint64_t)key_derivation_params) & ~1);
        FREE((void*)key_derivation_params);
        LDKInMemoryChannelKeys ret_var = InMemoryChannelKeys_new(funding_key_ref, revocation_base_key_ref, payment_key_ref, delayed_payment_base_key_ref, htlc_base_key_ref, commitment_seed_ref, channel_value_satoshis, key_derivation_params_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -7876,7 +7866,7 @@ void  __attribute__((visibility("default"))) TS_ChannelDetails_set_counterparty_
        LDKInitFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKInitFeatures
        ChannelDetails_set_counterparty_features(&this_ptr_conv, val_conv);
 }
 
@@ -7962,18 +7952,31 @@ void  __attribute__((visibility("default"))) TS_PaymentSendFailure_free(uint32_t
        PaymentSendFailure_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_PaymentSendFailure_clone(uint32_t orig) {
+       LDKPaymentSendFailure orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKPaymentSendFailure ret_var = PaymentSendFailure_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_ChannelManager_new(uint32_t network, uint32_t fee_est, uint32_t chain_monitor, uint32_t tx_broadcaster, uint32_t logger, uint32_t keys_manager, uint32_t config, intptr_t current_blockchain_height) {
        LDKNetwork network_conv = LDKNetwork_from_js(network);
-       LDKFeeEstimator fee_est_conv = *(LDKFeeEstimator*)fee_est;
-       LDKWatch chain_monitor_conv = *(LDKWatch*)chain_monitor;
-       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)tx_broadcaster;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
-       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)keys_manager;
+       LDKFeeEstimator fee_est_conv = *(LDKFeeEstimator*)(((uint64_t)fee_est) & ~1);
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(((uint64_t)chain_monitor) & ~1);
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)tx_broadcaster) & ~1);
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
+       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)(((uint64_t)keys_manager) & ~1);
        LDKUserConfig config_conv;
        config_conv.inner = (void*)(config & (~1));
        config_conv.is_owned = (config & 1) || (config == 0);
-       if (config_conv.inner != NULL)
-               config_conv = UserConfig_clone(&config_conv);
+       config_conv = UserConfig_clone(&config_conv);
        LDKChannelManager ret_var = ChannelManager_new(network_conv, fee_est_conv, chain_monitor_conv, tx_broadcaster_conv, logger_conv, keys_manager_conv, config_conv, current_blockchain_height);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -7994,8 +7997,7 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelManager_create_channe
        LDKUserConfig override_config_conv;
        override_config_conv.inner = (void*)(override_config & (~1));
        override_config_conv.is_owned = (override_config & 1) || (override_config == 0);
-       if (override_config_conv.inner != NULL)
-               override_config_conv = UserConfig_clone(&override_config_conv);
+       override_config_conv = UserConfig_clone(&override_config_conv);
        LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
        *ret_conv = ChannelManager_create_channel(&this_arg_conv, their_network_key_ref, channel_value_satoshis, push_msat, user_id, override_config_conv);
        return (long)ret_conv;
@@ -8056,7 +8058,7 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelManager_close_channel
        return (long)ret_conv;
 }
 
-void  __attribute__((visibility("default"))) TS_ChannelManager_force_close_channel(uint32_t this_arg, int8_tArray channel_id) {
+uint32_t  __attribute__((visibility("default"))) TS_ChannelManager_force_close_channel(uint32_t this_arg, int8_tArray channel_id) {
        LDKChannelManager this_arg_conv;
        this_arg_conv.inner = (void*)(this_arg & (~1));
        this_arg_conv.is_owned = false;
@@ -8064,7 +8066,9 @@ void  __attribute__((visibility("default"))) TS_ChannelManager_force_close_chann
        CHECK(*((uint32_t*)channel_id) == 32);
        memcpy(channel_id_arr, (uint8_t*)(channel_id + 4), 32);
        unsigned char (*channel_id_ref)[32] = &channel_id_arr;
-       ChannelManager_force_close_channel(&this_arg_conv, channel_id_ref);
+       LDKCResult_NoneAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneAPIErrorZ), "LDKCResult_NoneAPIErrorZ");
+       *ret_conv = ChannelManager_force_close_channel(&this_arg_conv, channel_id_ref);
+       return (long)ret_conv;
 }
 
 void  __attribute__((visibility("default"))) TS_ChannelManager_force_close_all_channels(uint32_t this_arg) {
@@ -8103,8 +8107,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManager_funding_transacti
        LDKOutPoint funding_txo_conv;
        funding_txo_conv.inner = (void*)(funding_txo & (~1));
        funding_txo_conv.is_owned = (funding_txo & 1) || (funding_txo == 0);
-       if (funding_txo_conv.inner != NULL)
-               funding_txo_conv = OutPoint_clone(&funding_txo_conv);
+       funding_txo_conv = OutPoint_clone(&funding_txo_conv);
        ChannelManager_funding_transaction_generated(&this_arg_conv, temporary_channel_id_ref, funding_txo_conv);
 }
 
@@ -8127,7 +8130,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManager_broadcast_node_an
        uint32_t* addresses_vals = (uint32_t*)(addresses + 4);
        for (size_t m = 0; m < addresses_constr.datalen; m++) {
                uint32_t arr_conv_12 = addresses_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                addresses_constr.data[m] = arr_conv_12_conv;
        }
@@ -8231,7 +8234,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManager_block_connected(u
        uint32_t* txdata_vals = (uint32_t*)(txdata + 4);
        for (size_t e = 0; e < txdata_constr.datalen; e++) {
                uint32_t arr_conv_30 = txdata_vals[e];
-               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)arr_conv_30;
+               LDKC2Tuple_usizeTransactionZ arr_conv_30_conv = *(LDKC2Tuple_usizeTransactionZ*)(((uint64_t)arr_conv_30) & ~1);
                FREE((void*)arr_conv_30);
                txdata_constr.data[e] = arr_conv_30_conv;
        }
@@ -8288,7 +8291,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_set_keys_
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKKeysInterface val_conv = *(LDKKeysInterface*)val;
+       LDKKeysInterface val_conv = *(LDKKeysInterface*)(((uint64_t)val) & ~1);
        ChannelManagerReadArgs_set_keys_manager(&this_ptr_conv, val_conv);
 }
 
@@ -8304,7 +8307,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_set_fee_e
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKFeeEstimator val_conv = *(LDKFeeEstimator*)val;
+       LDKFeeEstimator val_conv = *(LDKFeeEstimator*)(((uint64_t)val) & ~1);
        ChannelManagerReadArgs_set_fee_estimator(&this_ptr_conv, val_conv);
 }
 
@@ -8320,7 +8323,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_set_chain
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKWatch val_conv = *(LDKWatch*)val;
+       LDKWatch val_conv = *(LDKWatch*)(((uint64_t)val) & ~1);
        ChannelManagerReadArgs_set_chain_monitor(&this_ptr_conv, val_conv);
 }
 
@@ -8336,7 +8339,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_set_tx_br
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKBroadcasterInterface val_conv = *(LDKBroadcasterInterface*)val;
+       LDKBroadcasterInterface val_conv = *(LDKBroadcasterInterface*)(((uint64_t)val) & ~1);
        ChannelManagerReadArgs_set_tx_broadcaster(&this_ptr_conv, val_conv);
 }
 
@@ -8352,7 +8355,7 @@ void  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_set_logge
        LDKChannelManagerReadArgs this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKLogger val_conv = *(LDKLogger*)val;
+       LDKLogger val_conv = *(LDKLogger*)(((uint64_t)val) & ~1);
        ChannelManagerReadArgs_set_logger(&this_ptr_conv, val_conv);
 }
 
@@ -8377,22 +8380,20 @@ void  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_set_defau
        LDKUserConfig val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UserConfig_clone(&val_conv);
+       val_conv = UserConfig_clone(&val_conv);
        ChannelManagerReadArgs_set_default_config(&this_ptr_conv, val_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_new(uint32_t keys_manager, uint32_t fee_estimator, uint32_t chain_monitor, uint32_t tx_broadcaster, uint32_t logger, uint32_t default_config, uint32_tArray channel_monitors) {
-       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)keys_manager;
-       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)fee_estimator;
-       LDKWatch chain_monitor_conv = *(LDKWatch*)chain_monitor;
-       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)tx_broadcaster;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKKeysInterface keys_manager_conv = *(LDKKeysInterface*)(((uint64_t)keys_manager) & ~1);
+       LDKFeeEstimator fee_estimator_conv = *(LDKFeeEstimator*)(((uint64_t)fee_estimator) & ~1);
+       LDKWatch chain_monitor_conv = *(LDKWatch*)(((uint64_t)chain_monitor) & ~1);
+       LDKBroadcasterInterface tx_broadcaster_conv = *(LDKBroadcasterInterface*)(((uint64_t)tx_broadcaster) & ~1);
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        LDKUserConfig default_config_conv;
        default_config_conv.inner = (void*)(default_config & (~1));
        default_config_conv.is_owned = (default_config & 1) || (default_config == 0);
-       if (default_config_conv.inner != NULL)
-               default_config_conv = UserConfig_clone(&default_config_conv);
+       default_config_conv = UserConfig_clone(&default_config_conv);
        LDKCVec_ChannelMonitorZ channel_monitors_constr;
        channel_monitors_constr.datalen = *((uint32_t*)channel_monitors);
        if (channel_monitors_constr.datalen > 0)
@@ -8405,7 +8406,6 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelManagerReadArgs_new(u
                LDKChannelMonitor arr_conv_16_conv;
                arr_conv_16_conv.inner = (void*)(arr_conv_16 & (~1));
                arr_conv_16_conv.is_owned = (arr_conv_16 & 1) || (arr_conv_16 == 0);
-               // Warning: we may need a move here but can't clone!
                channel_monitors_constr.data[q] = arr_conv_16_conv;
        }
        LDKChannelManagerReadArgs ret_var = ChannelManagerReadArgs_new(keys_manager_conv, fee_estimator_conv, chain_monitor_conv, tx_broadcaster_conv, logger_conv, default_config_conv, channel_monitors_constr);
@@ -8425,7 +8425,7 @@ uint32_t  __attribute__((visibility("default"))) TS_C2Tuple_BlockHashChannelMana
        LDKChannelManagerReadArgs arg_conv;
        arg_conv.inner = (void*)(arg & (~1));
        arg_conv.is_owned = (arg & 1) || (arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelManagerReadArgs
        LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ), "LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ");
        *ret_conv = C2Tuple_BlockHashChannelManagerZ_read(ser_ref, arg_conv);
        return (long)ret_conv;
@@ -8438,6 +8438,20 @@ void  __attribute__((visibility("default"))) TS_DecodeError_free(uint32_t this_p
        DecodeError_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_DecodeError_clone(uint32_t orig) {
+       LDKDecodeError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKDecodeError ret_var = DecodeError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 void  __attribute__((visibility("default"))) TS_Init_free(uint32_t this_ptr) {
        LDKInit this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -10521,7 +10535,8 @@ uint32_t  __attribute__((visibility("default"))) TS_AnnouncementSignatures_new(i
 }
 
 void  __attribute__((visibility("default"))) TS_NetAddress_free(uint32_t this_ptr) {
-       LDKNetAddress this_ptr_conv = *(LDKNetAddress*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKNetAddress this_ptr_conv = *(LDKNetAddress*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        NetAddress_free(this_ptr_conv);
 }
@@ -10594,7 +10609,7 @@ void  __attribute__((visibility("default"))) TS_UnsignedNodeAnnouncement_set_fea
        LDKNodeFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        UnsignedNodeAnnouncement_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -10683,7 +10698,7 @@ void  __attribute__((visibility("default"))) TS_UnsignedNodeAnnouncement_set_add
        uint32_t* val_vals = (uint32_t*)(val + 4);
        for (size_t m = 0; m < val_constr.datalen; m++) {
                uint32_t arr_conv_12 = val_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                val_constr.data[m] = arr_conv_12_conv;
        }
@@ -10751,8 +10766,7 @@ void  __attribute__((visibility("default"))) TS_NodeAnnouncement_set_contents(ui
        LDKUnsignedNodeAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UnsignedNodeAnnouncement_clone(&val_conv);
+       val_conv = UnsignedNodeAnnouncement_clone(&val_conv);
        NodeAnnouncement_set_contents(&this_ptr_conv, val_conv);
 }
 
@@ -10763,8 +10777,7 @@ uint32_t  __attribute__((visibility("default"))) TS_NodeAnnouncement_new(int8_tA
        LDKUnsignedNodeAnnouncement contents_arg_conv;
        contents_arg_conv.inner = (void*)(contents_arg & (~1));
        contents_arg_conv.is_owned = (contents_arg & 1) || (contents_arg == 0);
-       if (contents_arg_conv.inner != NULL)
-               contents_arg_conv = UnsignedNodeAnnouncement_clone(&contents_arg_conv);
+       contents_arg_conv = UnsignedNodeAnnouncement_clone(&contents_arg_conv);
        LDKNodeAnnouncement ret_var = NodeAnnouncement_new(signature_arg_ref, contents_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -10817,7 +10830,7 @@ void  __attribute__((visibility("default"))) TS_UnsignedChannelAnnouncement_set_
        LDKChannelFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        UnsignedChannelAnnouncement_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -11049,8 +11062,7 @@ void  __attribute__((visibility("default"))) TS_ChannelAnnouncement_set_contents
        LDKUnsignedChannelAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UnsignedChannelAnnouncement_clone(&val_conv);
+       val_conv = UnsignedChannelAnnouncement_clone(&val_conv);
        ChannelAnnouncement_set_contents(&this_ptr_conv, val_conv);
 }
 
@@ -11070,8 +11082,7 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelAnnouncement_new(int8
        LDKUnsignedChannelAnnouncement contents_arg_conv;
        contents_arg_conv.inner = (void*)(contents_arg & (~1));
        contents_arg_conv.is_owned = (contents_arg & 1) || (contents_arg == 0);
-       if (contents_arg_conv.inner != NULL)
-               contents_arg_conv = UnsignedChannelAnnouncement_clone(&contents_arg_conv);
+       contents_arg_conv = UnsignedChannelAnnouncement_clone(&contents_arg_conv);
        LDKChannelAnnouncement ret_var = ChannelAnnouncement_new(node_signature_1_arg_ref, node_signature_2_arg_ref, bitcoin_signature_1_arg_ref, bitcoin_signature_2_arg_ref, contents_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -11288,8 +11299,7 @@ void  __attribute__((visibility("default"))) TS_ChannelUpdate_set_contents(uint3
        LDKUnsignedChannelUpdate val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UnsignedChannelUpdate_clone(&val_conv);
+       val_conv = UnsignedChannelUpdate_clone(&val_conv);
        ChannelUpdate_set_contents(&this_ptr_conv, val_conv);
 }
 
@@ -11300,8 +11310,7 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelUpdate_new(int8_tArra
        LDKUnsignedChannelUpdate contents_arg_conv;
        contents_arg_conv.inner = (void*)(contents_arg & (~1));
        contents_arg_conv.is_owned = (contents_arg & 1) || (contents_arg == 0);
-       if (contents_arg_conv.inner != NULL)
-               contents_arg_conv = UnsignedChannelUpdate_clone(&contents_arg_conv);
+       contents_arg_conv = UnsignedChannelUpdate_clone(&contents_arg_conv);
        LDKChannelUpdate ret_var = ChannelUpdate_new(signature_arg_ref, contents_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -11761,7 +11770,8 @@ uint32_t  __attribute__((visibility("default"))) TS_GossipTimestampFilter_new(in
 }
 
 void  __attribute__((visibility("default"))) TS_ErrorAction_free(uint32_t this_ptr) {
-       LDKErrorAction this_ptr_conv = *(LDKErrorAction*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKErrorAction this_ptr_conv = *(LDKErrorAction*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        ErrorAction_free(this_ptr_conv);
 }
@@ -11781,6 +11791,20 @@ void  __attribute__((visibility("default"))) TS_LightningError_free(uint32_t thi
        LightningError_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_LightningError_clone(uint32_t orig) {
+       LDKLightningError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKLightningError ret_var = LightningError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 jstring  __attribute__((visibility("default"))) TS_LightningError_get_err(uint32_t this_ptr) {
        LDKLightningError this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -11815,7 +11839,7 @@ void  __attribute__((visibility("default"))) TS_LightningError_set_action(uint32
        LDKLightningError this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKErrorAction val_conv = *(LDKErrorAction*)val;
+       LDKErrorAction val_conv = *(LDKErrorAction*)(((uint64_t)val) & ~1);
        FREE((void*)val);
        LightningError_set_action(&this_ptr_conv, val_conv);
 }
@@ -11825,7 +11849,7 @@ uint32_t  __attribute__((visibility("default"))) TS_LightningError_new(int8_tArr
        err_arg_ref.datalen = *((uint32_t*)err_arg);
        err_arg_ref.data = MALLOC(err_arg_ref.datalen, "LDKCVec_u8Z Bytes");
        memcpy(err_arg_ref.data, (uint8_t*)(err_arg + 4), err_arg_ref.datalen);
-       LDKErrorAction action_arg_conv = *(LDKErrorAction*)action_arg;
+       LDKErrorAction action_arg_conv = *(LDKErrorAction*)(((uint64_t)action_arg) & ~1);
        FREE((void*)action_arg);
        LDKLightningError ret_var = LightningError_new(err_arg_ref, action_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
@@ -11874,8 +11898,7 @@ void  __attribute__((visibility("default"))) TS_CommitmentUpdate_set_update_add_
                LDKUpdateAddHTLC arr_conv_15_conv;
                arr_conv_15_conv.inner = (void*)(arr_conv_15 & (~1));
                arr_conv_15_conv.is_owned = (arr_conv_15 & 1) || (arr_conv_15 == 0);
-               if (arr_conv_15_conv.inner != NULL)
-                       arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
+               arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
                val_constr.data[p] = arr_conv_15_conv;
        }
        CommitmentUpdate_set_update_add_htlcs(&this_ptr_conv, val_constr);
@@ -11897,8 +11920,7 @@ void  __attribute__((visibility("default"))) TS_CommitmentUpdate_set_update_fulf
                LDKUpdateFulfillHTLC arr_conv_19_conv;
                arr_conv_19_conv.inner = (void*)(arr_conv_19 & (~1));
                arr_conv_19_conv.is_owned = (arr_conv_19 & 1) || (arr_conv_19 == 0);
-               if (arr_conv_19_conv.inner != NULL)
-                       arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
+               arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
                val_constr.data[t] = arr_conv_19_conv;
        }
        CommitmentUpdate_set_update_fulfill_htlcs(&this_ptr_conv, val_constr);
@@ -11920,8 +11942,7 @@ void  __attribute__((visibility("default"))) TS_CommitmentUpdate_set_update_fail
                LDKUpdateFailHTLC arr_conv_16_conv;
                arr_conv_16_conv.inner = (void*)(arr_conv_16 & (~1));
                arr_conv_16_conv.is_owned = (arr_conv_16 & 1) || (arr_conv_16 == 0);
-               if (arr_conv_16_conv.inner != NULL)
-                       arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
+               arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
                val_constr.data[q] = arr_conv_16_conv;
        }
        CommitmentUpdate_set_update_fail_htlcs(&this_ptr_conv, val_constr);
@@ -11943,8 +11964,7 @@ void  __attribute__((visibility("default"))) TS_CommitmentUpdate_set_update_fail
                LDKUpdateFailMalformedHTLC arr_conv_25_conv;
                arr_conv_25_conv.inner = (void*)(arr_conv_25 & (~1));
                arr_conv_25_conv.is_owned = (arr_conv_25 & 1) || (arr_conv_25 == 0);
-               if (arr_conv_25_conv.inner != NULL)
-                       arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
+               arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
                val_constr.data[z] = arr_conv_25_conv;
        }
        CommitmentUpdate_set_update_fail_malformed_htlcs(&this_ptr_conv, val_constr);
@@ -11971,8 +11991,7 @@ void  __attribute__((visibility("default"))) TS_CommitmentUpdate_set_update_fee(
        LDKUpdateFee val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = UpdateFee_clone(&val_conv);
+       val_conv = UpdateFee_clone(&val_conv);
        CommitmentUpdate_set_update_fee(&this_ptr_conv, val_conv);
 }
 
@@ -11997,8 +12016,7 @@ void  __attribute__((visibility("default"))) TS_CommitmentUpdate_set_commitment_
        LDKCommitmentSigned val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = CommitmentSigned_clone(&val_conv);
+       val_conv = CommitmentSigned_clone(&val_conv);
        CommitmentUpdate_set_commitment_signed(&this_ptr_conv, val_conv);
 }
 
@@ -12015,8 +12033,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CommitmentUpdate_new(uint32_
                LDKUpdateAddHTLC arr_conv_15_conv;
                arr_conv_15_conv.inner = (void*)(arr_conv_15 & (~1));
                arr_conv_15_conv.is_owned = (arr_conv_15 & 1) || (arr_conv_15 == 0);
-               if (arr_conv_15_conv.inner != NULL)
-                       arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
+               arr_conv_15_conv = UpdateAddHTLC_clone(&arr_conv_15_conv);
                update_add_htlcs_arg_constr.data[p] = arr_conv_15_conv;
        }
        LDKCVec_UpdateFulfillHTLCZ update_fulfill_htlcs_arg_constr;
@@ -12031,8 +12048,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CommitmentUpdate_new(uint32_
                LDKUpdateFulfillHTLC arr_conv_19_conv;
                arr_conv_19_conv.inner = (void*)(arr_conv_19 & (~1));
                arr_conv_19_conv.is_owned = (arr_conv_19 & 1) || (arr_conv_19 == 0);
-               if (arr_conv_19_conv.inner != NULL)
-                       arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
+               arr_conv_19_conv = UpdateFulfillHTLC_clone(&arr_conv_19_conv);
                update_fulfill_htlcs_arg_constr.data[t] = arr_conv_19_conv;
        }
        LDKCVec_UpdateFailHTLCZ update_fail_htlcs_arg_constr;
@@ -12047,8 +12063,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CommitmentUpdate_new(uint32_
                LDKUpdateFailHTLC arr_conv_16_conv;
                arr_conv_16_conv.inner = (void*)(arr_conv_16 & (~1));
                arr_conv_16_conv.is_owned = (arr_conv_16 & 1) || (arr_conv_16 == 0);
-               if (arr_conv_16_conv.inner != NULL)
-                       arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
+               arr_conv_16_conv = UpdateFailHTLC_clone(&arr_conv_16_conv);
                update_fail_htlcs_arg_constr.data[q] = arr_conv_16_conv;
        }
        LDKCVec_UpdateFailMalformedHTLCZ update_fail_malformed_htlcs_arg_constr;
@@ -12063,20 +12078,17 @@ uint32_t  __attribute__((visibility("default"))) TS_CommitmentUpdate_new(uint32_
                LDKUpdateFailMalformedHTLC arr_conv_25_conv;
                arr_conv_25_conv.inner = (void*)(arr_conv_25 & (~1));
                arr_conv_25_conv.is_owned = (arr_conv_25 & 1) || (arr_conv_25 == 0);
-               if (arr_conv_25_conv.inner != NULL)
-                       arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
+               arr_conv_25_conv = UpdateFailMalformedHTLC_clone(&arr_conv_25_conv);
                update_fail_malformed_htlcs_arg_constr.data[z] = arr_conv_25_conv;
        }
        LDKUpdateFee update_fee_arg_conv;
        update_fee_arg_conv.inner = (void*)(update_fee_arg & (~1));
        update_fee_arg_conv.is_owned = (update_fee_arg & 1) || (update_fee_arg == 0);
-       if (update_fee_arg_conv.inner != NULL)
-               update_fee_arg_conv = UpdateFee_clone(&update_fee_arg_conv);
+       update_fee_arg_conv = UpdateFee_clone(&update_fee_arg_conv);
        LDKCommitmentSigned commitment_signed_arg_conv;
        commitment_signed_arg_conv.inner = (void*)(commitment_signed_arg & (~1));
        commitment_signed_arg_conv.is_owned = (commitment_signed_arg & 1) || (commitment_signed_arg == 0);
-       if (commitment_signed_arg_conv.inner != NULL)
-               commitment_signed_arg_conv = CommitmentSigned_clone(&commitment_signed_arg_conv);
+       commitment_signed_arg_conv = CommitmentSigned_clone(&commitment_signed_arg_conv);
        LDKCommitmentUpdate ret_var = CommitmentUpdate_new(update_add_htlcs_arg_constr, update_fulfill_htlcs_arg_constr, update_fail_htlcs_arg_constr, update_fail_malformed_htlcs_arg_constr, update_fee_arg_conv, commitment_signed_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -12088,7 +12100,8 @@ uint32_t  __attribute__((visibility("default"))) TS_CommitmentUpdate_new(uint32_
 }
 
 void  __attribute__((visibility("default"))) TS_HTLCFailChannelUpdate_free(uint32_t this_ptr) {
-       LDKHTLCFailChannelUpdate this_ptr_conv = *(LDKHTLCFailChannelUpdate*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKHTLCFailChannelUpdate this_ptr_conv = *(LDKHTLCFailChannelUpdate*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        HTLCFailChannelUpdate_free(this_ptr_conv);
 }
@@ -12102,13 +12115,15 @@ uint32_t  __attribute__((visibility("default"))) TS_HTLCFailChannelUpdate_clone(
 }
 
 void  __attribute__((visibility("default"))) TS_ChannelMessageHandler_free(uint32_t this_ptr) {
-       LDKChannelMessageHandler this_ptr_conv = *(LDKChannelMessageHandler*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKChannelMessageHandler this_ptr_conv = *(LDKChannelMessageHandler*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        ChannelMessageHandler_free(this_ptr_conv);
 }
 
 void  __attribute__((visibility("default"))) TS_RoutingMessageHandler_free(uint32_t this_ptr) {
-       LDKRoutingMessageHandler this_ptr_conv = *(LDKRoutingMessageHandler*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKRoutingMessageHandler this_ptr_conv = *(LDKRoutingMessageHandler*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        RoutingMessageHandler_free(this_ptr_conv);
 }
@@ -12842,7 +12857,7 @@ void  __attribute__((visibility("default"))) TS_MessageHandler_set_chan_handler(
        LDKMessageHandler this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKChannelMessageHandler val_conv = *(LDKChannelMessageHandler*)val;
+       LDKChannelMessageHandler val_conv = *(LDKChannelMessageHandler*)(((uint64_t)val) & ~1);
        MessageHandler_set_chan_handler(&this_ptr_conv, val_conv);
 }
 
@@ -12858,13 +12873,13 @@ void  __attribute__((visibility("default"))) TS_MessageHandler_set_route_handler
        LDKMessageHandler this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
        this_ptr_conv.is_owned = false;
-       LDKRoutingMessageHandler val_conv = *(LDKRoutingMessageHandler*)val;
+       LDKRoutingMessageHandler val_conv = *(LDKRoutingMessageHandler*)(((uint64_t)val) & ~1);
        MessageHandler_set_route_handler(&this_ptr_conv, val_conv);
 }
 
 uint32_t  __attribute__((visibility("default"))) TS_MessageHandler_new(uint32_t chan_handler_arg, uint32_t route_handler_arg) {
-       LDKChannelMessageHandler chan_handler_arg_conv = *(LDKChannelMessageHandler*)chan_handler_arg;
-       LDKRoutingMessageHandler route_handler_arg_conv = *(LDKRoutingMessageHandler*)route_handler_arg;
+       LDKChannelMessageHandler chan_handler_arg_conv = *(LDKChannelMessageHandler*)(((uint64_t)chan_handler_arg) & ~1);
+       LDKRoutingMessageHandler route_handler_arg_conv = *(LDKRoutingMessageHandler*)(((uint64_t)route_handler_arg) & ~1);
        LDKMessageHandler ret_var = MessageHandler_new(chan_handler_arg_conv, route_handler_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -12883,7 +12898,8 @@ uint32_t  __attribute__((visibility("default"))) TS_SocketDescriptor_clone(uint3
 }
 
 void  __attribute__((visibility("default"))) TS_SocketDescriptor_free(uint32_t this_ptr) {
-       LDKSocketDescriptor this_ptr_conv = *(LDKSocketDescriptor*)this_ptr;
+       if ((this_ptr & 1) != 0) return;
+       LDKSocketDescriptor this_ptr_conv = *(LDKSocketDescriptor*)(((uint64_t)this_ptr) & ~1);
        FREE((void*)this_ptr);
        SocketDescriptor_free(this_ptr_conv);
 }
@@ -12895,6 +12911,20 @@ void  __attribute__((visibility("default"))) TS_PeerHandleError_free(uint32_t th
        PeerHandleError_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_PeerHandleError_clone(uint32_t orig) {
+       LDKPeerHandleError orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKPeerHandleError ret_var = PeerHandleError_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 jboolean  __attribute__((visibility("default"))) TS_PeerHandleError_get_no_connection_possible(uint32_t this_ptr) {
        LDKPeerHandleError this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -12932,7 +12962,7 @@ uint32_t  __attribute__((visibility("default"))) TS_PeerManager_new(uint32_t mes
        LDKMessageHandler message_handler_conv;
        message_handler_conv.inner = (void*)(message_handler & (~1));
        message_handler_conv.is_owned = (message_handler & 1) || (message_handler == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKMessageHandler
        LDKSecretKey our_node_secret_ref;
        CHECK(*((uint32_t*)our_node_secret) == 32);
        memcpy(our_node_secret_ref.bytes, (uint8_t*)(our_node_secret + 4), 32);
@@ -12940,7 +12970,7 @@ uint32_t  __attribute__((visibility("default"))) TS_PeerManager_new(uint32_t mes
        CHECK(*((uint32_t*)ephemeral_random_data) == 32);
        memcpy(ephemeral_random_data_arr, (uint8_t*)(ephemeral_random_data + 4), 32);
        unsigned char (*ephemeral_random_data_ref)[32] = &ephemeral_random_data_arr;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        LDKPeerManager ret_var = PeerManager_new(message_handler_conv, our_node_secret_ref, ephemeral_random_data_ref, logger_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -12974,7 +13004,7 @@ uint32_t  __attribute__((visibility("default"))) TS_PeerManager_new_outbound_con
        LDKPublicKey their_node_id_ref;
        CHECK(*((uint32_t*)their_node_id) == 33);
        memcpy(their_node_id_ref.compressed_form, (uint8_t*)(their_node_id + 4), 33);
-       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)descriptor;
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(((uint64_t)descriptor) & ~1);
        LDKCResult_CVec_u8ZPeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZPeerHandleErrorZ), "LDKCResult_CVec_u8ZPeerHandleErrorZ");
        *ret_conv = PeerManager_new_outbound_connection(&this_arg_conv, their_node_id_ref, descriptor_conv);
        return (long)ret_conv;
@@ -12984,7 +13014,7 @@ uint32_t  __attribute__((visibility("default"))) TS_PeerManager_new_inbound_conn
        LDKPeerManager this_arg_conv;
        this_arg_conv.inner = (void*)(this_arg & (~1));
        this_arg_conv.is_owned = false;
-       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)descriptor;
+       LDKSocketDescriptor descriptor_conv = *(LDKSocketDescriptor*)(((uint64_t)descriptor) & ~1);
        LDKCResult_NonePeerHandleErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePeerHandleErrorZ), "LDKCResult_NonePeerHandleErrorZ");
        *ret_conv = PeerManager_new_inbound_connection(&this_arg_conv, descriptor_conv);
        return (long)ret_conv;
@@ -13681,8 +13711,7 @@ void  __attribute__((visibility("default"))) TS_ChannelTransactionParameters_set
        LDKChannelPublicKeys val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelPublicKeys_clone(&val_conv);
+       val_conv = ChannelPublicKeys_clone(&val_conv);
        ChannelTransactionParameters_set_holder_pubkeys(&this_ptr_conv, val_conv);
 }
 
@@ -13737,8 +13766,7 @@ void  __attribute__((visibility("default"))) TS_ChannelTransactionParameters_set
        LDKCounterpartyChannelTransactionParameters val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = CounterpartyChannelTransactionParameters_clone(&val_conv);
+       val_conv = CounterpartyChannelTransactionParameters_clone(&val_conv);
        ChannelTransactionParameters_set_counterparty_parameters(&this_ptr_conv, val_conv);
 }
 
@@ -13763,8 +13791,7 @@ void  __attribute__((visibility("default"))) TS_ChannelTransactionParameters_set
        LDKOutPoint val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = OutPoint_clone(&val_conv);
+       val_conv = OutPoint_clone(&val_conv);
        ChannelTransactionParameters_set_funding_outpoint(&this_ptr_conv, val_conv);
 }
 
@@ -13772,18 +13799,15 @@ uint32_t  __attribute__((visibility("default"))) TS_ChannelTransactionParameters
        LDKChannelPublicKeys holder_pubkeys_arg_conv;
        holder_pubkeys_arg_conv.inner = (void*)(holder_pubkeys_arg & (~1));
        holder_pubkeys_arg_conv.is_owned = (holder_pubkeys_arg & 1) || (holder_pubkeys_arg == 0);
-       if (holder_pubkeys_arg_conv.inner != NULL)
-               holder_pubkeys_arg_conv = ChannelPublicKeys_clone(&holder_pubkeys_arg_conv);
+       holder_pubkeys_arg_conv = ChannelPublicKeys_clone(&holder_pubkeys_arg_conv);
        LDKCounterpartyChannelTransactionParameters counterparty_parameters_arg_conv;
        counterparty_parameters_arg_conv.inner = (void*)(counterparty_parameters_arg & (~1));
        counterparty_parameters_arg_conv.is_owned = (counterparty_parameters_arg & 1) || (counterparty_parameters_arg == 0);
-       if (counterparty_parameters_arg_conv.inner != NULL)
-               counterparty_parameters_arg_conv = CounterpartyChannelTransactionParameters_clone(&counterparty_parameters_arg_conv);
+       counterparty_parameters_arg_conv = CounterpartyChannelTransactionParameters_clone(&counterparty_parameters_arg_conv);
        LDKOutPoint funding_outpoint_arg_conv;
        funding_outpoint_arg_conv.inner = (void*)(funding_outpoint_arg & (~1));
        funding_outpoint_arg_conv.is_owned = (funding_outpoint_arg & 1) || (funding_outpoint_arg == 0);
-       if (funding_outpoint_arg_conv.inner != NULL)
-               funding_outpoint_arg_conv = OutPoint_clone(&funding_outpoint_arg_conv);
+       funding_outpoint_arg_conv = OutPoint_clone(&funding_outpoint_arg_conv);
        LDKChannelTransactionParameters ret_var = ChannelTransactionParameters_new(holder_pubkeys_arg_conv, holder_selected_contest_delay_arg, is_outbound_from_holder_arg, counterparty_parameters_arg_conv, funding_outpoint_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -13836,8 +13860,7 @@ void  __attribute__((visibility("default"))) TS_CounterpartyChannelTransactionPa
        LDKChannelPublicKeys val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelPublicKeys_clone(&val_conv);
+       val_conv = ChannelPublicKeys_clone(&val_conv);
        CounterpartyChannelTransactionParameters_set_pubkeys(&this_ptr_conv, val_conv);
 }
 
@@ -13860,8 +13883,7 @@ uint32_t  __attribute__((visibility("default"))) TS_CounterpartyChannelTransacti
        LDKChannelPublicKeys pubkeys_arg_conv;
        pubkeys_arg_conv.inner = (void*)(pubkeys_arg & (~1));
        pubkeys_arg_conv.is_owned = (pubkeys_arg & 1) || (pubkeys_arg == 0);
-       if (pubkeys_arg_conv.inner != NULL)
-               pubkeys_arg_conv = ChannelPublicKeys_clone(&pubkeys_arg_conv);
+       pubkeys_arg_conv = ChannelPublicKeys_clone(&pubkeys_arg_conv);
        LDKCounterpartyChannelTransactionParameters ret_var = CounterpartyChannelTransactionParameters_new(pubkeys_arg_conv, selected_contest_delay_arg);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -14113,8 +14135,7 @@ uint32_t  __attribute__((visibility("default"))) TS_HolderCommitmentTransaction_
        LDKCommitmentTransaction commitment_tx_conv;
        commitment_tx_conv.inner = (void*)(commitment_tx & (~1));
        commitment_tx_conv.is_owned = (commitment_tx & 1) || (commitment_tx == 0);
-       if (commitment_tx_conv.inner != NULL)
-               commitment_tx_conv = CommitmentTransaction_clone(&commitment_tx_conv);
+       commitment_tx_conv = CommitmentTransaction_clone(&commitment_tx_conv);
        LDKSignature counterparty_sig_ref;
        CHECK(*((uint32_t*)counterparty_sig) == 64);
        memcpy(counterparty_sig_ref.compact_form, (uint8_t*)(counterparty_sig + 4), 64);
@@ -14546,7 +14567,7 @@ void  __attribute__((visibility("default"))) TS_RouteHop_set_node_features(uint3
        LDKNodeFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        RouteHop_set_node_features(&this_ptr_conv, val_conv);
 }
 
@@ -14586,7 +14607,7 @@ void  __attribute__((visibility("default"))) TS_RouteHop_set_channel_features(ui
        LDKChannelFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        RouteHop_set_channel_features(&this_ptr_conv, val_conv);
 }
 
@@ -14627,11 +14648,11 @@ uint32_t  __attribute__((visibility("default"))) TS_RouteHop_new(int8_tArray pub
        LDKNodeFeatures node_features_arg_conv;
        node_features_arg_conv.inner = (void*)(node_features_arg & (~1));
        node_features_arg_conv.is_owned = (node_features_arg & 1) || (node_features_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        LDKChannelFeatures channel_features_arg_conv;
        channel_features_arg_conv.inner = (void*)(channel_features_arg & (~1));
        channel_features_arg_conv.is_owned = (channel_features_arg & 1) || (channel_features_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        LDKRouteHop ret_var = RouteHop_new(pubkey_arg_ref, node_features_arg_conv, short_channel_id_arg, channel_features_arg_conv, fee_msat_arg, cltv_expiry_delta_arg);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -14688,8 +14709,7 @@ void  __attribute__((visibility("default"))) TS_Route_set_paths(uint32_t this_pt
                        LDKRouteHop arr_conv_10_conv;
                        arr_conv_10_conv.inner = (void*)(arr_conv_10 & (~1));
                        arr_conv_10_conv.is_owned = (arr_conv_10 & 1) || (arr_conv_10 == 0);
-                       if (arr_conv_10_conv.inner != NULL)
-                               arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
+                       arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
                        arr_conv_12_constr.data[k] = arr_conv_10_conv;
                }
                val_constr.data[m] = arr_conv_12_constr;
@@ -14719,8 +14739,7 @@ uint32_t  __attribute__((visibility("default"))) TS_Route_new(ptrArray paths_arg
                        LDKRouteHop arr_conv_10_conv;
                        arr_conv_10_conv.inner = (void*)(arr_conv_10 & (~1));
                        arr_conv_10_conv.is_owned = (arr_conv_10 & 1) || (arr_conv_10 == 0);
-                       if (arr_conv_10_conv.inner != NULL)
-                               arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
+                       arr_conv_10_conv = RouteHop_clone(&arr_conv_10_conv);
                        arr_conv_12_constr.data[k] = arr_conv_10_conv;
                }
                paths_arg_constr.data[m] = arr_conv_12_constr;
@@ -14831,8 +14850,7 @@ void  __attribute__((visibility("default"))) TS_RouteHint_set_fees(uint32_t this
        LDKRoutingFees val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = RoutingFees_clone(&val_conv);
+       val_conv = RoutingFees_clone(&val_conv);
        RouteHint_set_fees(&this_ptr_conv, val_conv);
 }
 
@@ -14873,8 +14891,7 @@ uint32_t  __attribute__((visibility("default"))) TS_RouteHint_new(int8_tArray sr
        LDKRoutingFees fees_arg_conv;
        fees_arg_conv.inner = (void*)(fees_arg & (~1));
        fees_arg_conv.is_owned = (fees_arg & 1) || (fees_arg == 0);
-       if (fees_arg_conv.inner != NULL)
-               fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
+       fees_arg_conv = RoutingFees_clone(&fees_arg_conv);
        LDKRouteHint ret_var = RouteHint_new(src_node_id_arg_ref, short_channel_id_arg, fees_arg_conv, cltv_expiry_delta_arg, htlc_minimum_msat_arg);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -14921,11 +14938,10 @@ uint32_t  __attribute__((visibility("default"))) TS_get_route(int8_tArray our_no
                LDKRouteHint arr_conv_11_conv;
                arr_conv_11_conv.inner = (void*)(arr_conv_11 & (~1));
                arr_conv_11_conv.is_owned = (arr_conv_11 & 1) || (arr_conv_11 == 0);
-               if (arr_conv_11_conv.inner != NULL)
-                       arr_conv_11_conv = RouteHint_clone(&arr_conv_11_conv);
+               arr_conv_11_conv = RouteHint_clone(&arr_conv_11_conv);
                last_hops_constr.data[l] = arr_conv_11_conv;
        }
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        LDKCResult_RouteLightningErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RouteLightningErrorZ), "LDKCResult_RouteLightningErrorZ");
        *ret_conv = get_route(our_node_id_ref, &network_conv, target_ref, &first_hops_constr, last_hops_constr, final_value_msat, final_cltv, logger_conv);
        FREE(first_hops_constr.data);
@@ -14958,7 +14974,7 @@ uint32_t  __attribute__((visibility("default"))) TS_NetGraphMsgHandler_new(int8_
        CHECK(*((uint32_t*)genesis_hash) == 32);
        memcpy(genesis_hash_ref.data, (uint8_t*)(genesis_hash + 4), 32);
        LDKAccess* chain_access_conv = (LDKAccess*)chain_access;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        LDKNetGraphMsgHandler ret_var = NetGraphMsgHandler_new(genesis_hash_ref, chain_access_conv, logger_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -14971,11 +14987,11 @@ uint32_t  __attribute__((visibility("default"))) TS_NetGraphMsgHandler_new(int8_
 
 uint32_t  __attribute__((visibility("default"))) TS_NetGraphMsgHandler_from_net_graph(uint32_t chain_access, uint32_t logger, uint32_t network_graph) {
        LDKAccess* chain_access_conv = (LDKAccess*)chain_access;
-       LDKLogger logger_conv = *(LDKLogger*)logger;
+       LDKLogger logger_conv = *(LDKLogger*)(((uint64_t)logger) & ~1);
        LDKNetworkGraph network_graph_conv;
        network_graph_conv.inner = (void*)(network_graph & (~1));
        network_graph_conv.is_owned = (network_graph & 1) || (network_graph == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNetworkGraph
        LDKNetGraphMsgHandler ret_var = NetGraphMsgHandler_from_net_graph(chain_access_conv, logger_conv, network_graph_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -15039,6 +15055,20 @@ void  __attribute__((visibility("default"))) TS_DirectionalChannelInfo_free(uint
        DirectionalChannelInfo_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_DirectionalChannelInfo_clone(uint32_t orig) {
+       LDKDirectionalChannelInfo orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKDirectionalChannelInfo ret_var = DirectionalChannelInfo_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 int32_t  __attribute__((visibility("default"))) TS_DirectionalChannelInfo_get_last_update(uint32_t this_ptr) {
        LDKDirectionalChannelInfo this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -15120,8 +15150,7 @@ void  __attribute__((visibility("default"))) TS_DirectionalChannelInfo_set_fees(
        LDKRoutingFees val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = RoutingFees_clone(&val_conv);
+       val_conv = RoutingFees_clone(&val_conv);
        DirectionalChannelInfo_set_fees(&this_ptr_conv, val_conv);
 }
 
@@ -15146,8 +15175,7 @@ void  __attribute__((visibility("default"))) TS_DirectionalChannelInfo_set_last_
        LDKChannelUpdate val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelUpdate_clone(&val_conv);
+       val_conv = ChannelUpdate_clone(&val_conv);
        DirectionalChannelInfo_set_last_update_message(&this_ptr_conv, val_conv);
 }
 
@@ -15204,7 +15232,7 @@ void  __attribute__((visibility("default"))) TS_ChannelInfo_set_features(uint32_
        LDKChannelFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKChannelFeatures
        ChannelInfo_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -15248,7 +15276,7 @@ void  __attribute__((visibility("default"))) TS_ChannelInfo_set_one_to_two(uint3
        LDKDirectionalChannelInfo val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       val_conv = DirectionalChannelInfo_clone(&val_conv);
        ChannelInfo_set_one_to_two(&this_ptr_conv, val_conv);
 }
 
@@ -15292,7 +15320,7 @@ void  __attribute__((visibility("default"))) TS_ChannelInfo_set_two_to_one(uint3
        LDKDirectionalChannelInfo val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       val_conv = DirectionalChannelInfo_clone(&val_conv);
        ChannelInfo_set_two_to_one(&this_ptr_conv, val_conv);
 }
 
@@ -15317,8 +15345,7 @@ void  __attribute__((visibility("default"))) TS_ChannelInfo_set_announcement_mes
        LDKChannelAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = ChannelAnnouncement_clone(&val_conv);
+       val_conv = ChannelAnnouncement_clone(&val_conv);
        ChannelInfo_set_announcement_message(&this_ptr_conv, val_conv);
 }
 
@@ -15436,6 +15463,20 @@ void  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_free(uint32
        NodeAnnouncementInfo_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_clone(uint32_t orig) {
+       LDKNodeAnnouncementInfo orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 uint32_t  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_get_features(uint32_t this_ptr) {
        LDKNodeAnnouncementInfo this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -15457,7 +15498,7 @@ void  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_set_feature
        LDKNodeFeatures val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        NodeAnnouncementInfo_set_features(&this_ptr_conv, val_conv);
 }
 
@@ -15527,7 +15568,7 @@ void  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_set_address
        uint32_t* val_vals = (uint32_t*)(val + 4);
        for (size_t m = 0; m < val_constr.datalen; m++) {
                uint32_t arr_conv_12 = val_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                val_constr.data[m] = arr_conv_12_conv;
        }
@@ -15555,8 +15596,7 @@ void  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_set_announc
        LDKNodeAnnouncement val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = NodeAnnouncement_clone(&val_conv);
+       val_conv = NodeAnnouncement_clone(&val_conv);
        NodeAnnouncementInfo_set_announcement_message(&this_ptr_conv, val_conv);
 }
 
@@ -15564,7 +15604,7 @@ uint32_t  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_new(uin
        LDKNodeFeatures features_arg_conv;
        features_arg_conv.inner = (void*)(features_arg & (~1));
        features_arg_conv.is_owned = (features_arg & 1) || (features_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       // Warning: we need a move here but no clone is available for LDKNodeFeatures
        LDKThreeBytes rgb_arg_ref;
        CHECK(*((uint32_t*)rgb_arg) == 3);
        memcpy(rgb_arg_ref.data, (uint8_t*)(rgb_arg + 4), 3);
@@ -15580,15 +15620,14 @@ uint32_t  __attribute__((visibility("default"))) TS_NodeAnnouncementInfo_new(uin
        uint32_t* addresses_arg_vals = (uint32_t*)(addresses_arg + 4);
        for (size_t m = 0; m < addresses_arg_constr.datalen; m++) {
                uint32_t arr_conv_12 = addresses_arg_vals[m];
-               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)arr_conv_12;
+               LDKNetAddress arr_conv_12_conv = *(LDKNetAddress*)(((uint64_t)arr_conv_12) & ~1);
                FREE((void*)arr_conv_12);
                addresses_arg_constr.data[m] = arr_conv_12_conv;
        }
        LDKNodeAnnouncement announcement_message_arg_conv;
        announcement_message_arg_conv.inner = (void*)(announcement_message_arg & (~1));
        announcement_message_arg_conv.is_owned = (announcement_message_arg & 1) || (announcement_message_arg == 0);
-       if (announcement_message_arg_conv.inner != NULL)
-               announcement_message_arg_conv = NodeAnnouncement_clone(&announcement_message_arg_conv);
+       announcement_message_arg_conv = NodeAnnouncement_clone(&announcement_message_arg_conv);
        LDKNodeAnnouncementInfo ret_var = NodeAnnouncementInfo_new(features_arg_conv, last_update_arg, rgb_arg_ref, alias_arg_ref, addresses_arg_constr, announcement_message_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
@@ -15626,6 +15665,20 @@ void  __attribute__((visibility("default"))) TS_NodeInfo_free(uint32_t this_ptr)
        NodeInfo_free(this_ptr_conv);
 }
 
+uint32_t  __attribute__((visibility("default"))) TS_NodeInfo_clone(uint32_t orig) {
+       LDKNodeInfo orig_conv;
+       orig_conv.inner = (void*)(orig & (~1));
+       orig_conv.is_owned = false;
+       LDKNodeInfo ret_var = NodeInfo_clone(&orig_conv);
+       CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
+       CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
+       long ret_ref = (long)ret_var.inner;
+       if (ret_var.is_owned) {
+               ret_ref |= 1;
+       }
+       return ret_ref;
+}
+
 void  __attribute__((visibility("default"))) TS_NodeInfo_set_channels(uint32_t this_ptr, int64_tArray val) {
        LDKNodeInfo this_ptr_conv;
        this_ptr_conv.inner = (void*)(this_ptr & (~1));
@@ -15665,8 +15718,7 @@ void  __attribute__((visibility("default"))) TS_NodeInfo_set_lowest_inbound_chan
        LDKRoutingFees val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       if (val_conv.inner != NULL)
-               val_conv = RoutingFees_clone(&val_conv);
+       val_conv = RoutingFees_clone(&val_conv);
        NodeInfo_set_lowest_inbound_channel_fees(&this_ptr_conv, val_conv);
 }
 
@@ -15691,7 +15743,7 @@ void  __attribute__((visibility("default"))) TS_NodeInfo_set_announcement_info(u
        LDKNodeAnnouncementInfo val_conv;
        val_conv.inner = (void*)(val & (~1));
        val_conv.is_owned = (val & 1) || (val == 0);
-       // Warning: we may need a move here but can't clone!
+       val_conv = NodeAnnouncementInfo_clone(&val_conv);
        NodeInfo_set_announcement_info(&this_ptr_conv, val_conv);
 }
 
@@ -15710,12 +15762,11 @@ uint32_t  __attribute__((visibility("default"))) TS_NodeInfo_new(int64_tArray ch
        LDKRoutingFees lowest_inbound_channel_fees_arg_conv;
        lowest_inbound_channel_fees_arg_conv.inner = (void*)(lowest_inbound_channel_fees_arg & (~1));
        lowest_inbound_channel_fees_arg_conv.is_owned = (lowest_inbound_channel_fees_arg & 1) || (lowest_inbound_channel_fees_arg == 0);
-       if (lowest_inbound_channel_fees_arg_conv.inner != NULL)
-               lowest_inbound_channel_fees_arg_conv = RoutingFees_clone(&lowest_inbound_channel_fees_arg_conv);
+       lowest_inbound_channel_fees_arg_conv = RoutingFees_clone(&lowest_inbound_channel_fees_arg_conv);
        LDKNodeAnnouncementInfo announcement_info_arg_conv;
        announcement_info_arg_conv.inner = (void*)(announcement_info_arg & (~1));
        announcement_info_arg_conv.is_owned = (announcement_info_arg & 1) || (announcement_info_arg == 0);
-       // Warning: we may need a move here but can't clone!
+       announcement_info_arg_conv = NodeAnnouncementInfo_clone(&announcement_info_arg_conv);
        LDKNodeInfo ret_var = NodeInfo_new(channels_arg_constr, lowest_inbound_channel_fees_arg_conv, announcement_info_arg_conv);
        CHECK((((long)ret_var.inner) & 1) == 0); // We rely on a free low bit, malloc guarantees this.
        CHECK((((long)&ret_var) & 1) == 0); // We rely on a free low bit, pointer alignment guarantees this.
index 330dde75fe5f18a14aea726191bdc8611d49882f..942649ebb7d55d07065425ca05b1d975366347f0 100644 (file)
@@ -389,9 +389,6 @@ public static native long new_empty_slice_vec();
        public static native boolean LDKCResult_SignatureNoneZ_result_ok(long arg);
        public static native Uint8Array LDKCResult_SignatureNoneZ_get_ok(long arg);
        public static native void LDKCResult_SignatureNoneZ_get_err(long arg);
-       public static native boolean LDKCResult_CVec_SignatureZNoneZ_result_ok(long arg);
-       public static native Uint8Array[] LDKCResult_CVec_SignatureZNoneZ_get_ok(long arg);
-       public static native void LDKCResult_CVec_SignatureZNoneZ_get_err(long arg);
 
 
 
@@ -402,8 +399,7 @@ public static native long new_empty_slice_vec();
                        release_commitment_secret (idx: number): Uint8Array;
                        key_derivation_params (): number;
                        sign_counterparty_commitment (commitment_tx: number): number;
-                       sign_holder_commitment (commitment_tx: number): number;
-                       sign_holder_commitment_htlc_transactions (commitment_tx: number): number;
+                       sign_holder_commitment_and_htlcs (commitment_tx: number): number;
                        sign_justice_transaction (justice_tx: Uint8Array, input: number, amount: number, per_commitment_key: Uint8Array, htlc: number): number;
                        sign_counterparty_htlc_transaction (htlc_tx: Uint8Array, input: number, amount: number, per_commitment_point: Uint8Array, htlc: number): number;
                        sign_closing_transaction (closing_tx: Uint8Array): number;
@@ -451,20 +447,12 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.ChannelKeys_sign_counterparty_commitment(this_arg, commitment_tx);
                return nativeResponseValue;
        }
-       // LDKCResult_SignatureNoneZ ChannelKeys_sign_holder_commitment LDKChannelKeys* this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
-       export function ChannelKeys_sign_holder_commitment(this_arg: number, commitment_tx: number): number {
+       // LDKCResult_C2Tuple_SignatureCVec_SignatureZZNoneZ ChannelKeys_sign_holder_commitment_and_htlcs LDKChannelKeys* this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
+       export function ChannelKeys_sign_holder_commitment_and_htlcs(this_arg: number, commitment_tx: number): number {
                if(!isWasmInitialized) {
                        throw new Error("initializeWasm() must be awaited first!");
                }
-               const nativeResponseValue = wasm.ChannelKeys_sign_holder_commitment(this_arg, commitment_tx);
-               return nativeResponseValue;
-       }
-       // LDKCResult_CVec_SignatureZNoneZ ChannelKeys_sign_holder_commitment_htlc_transactions LDKChannelKeys* this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
-       export function ChannelKeys_sign_holder_commitment_htlc_transactions(this_arg: number, commitment_tx: number): number {
-               if(!isWasmInitialized) {
-                       throw new Error("initializeWasm() must be awaited first!");
-               }
-               const nativeResponseValue = wasm.ChannelKeys_sign_holder_commitment_htlc_transactions(this_arg, commitment_tx);
+               const nativeResponseValue = wasm.ChannelKeys_sign_holder_commitment_and_htlcs(this_arg, commitment_tx);
                return nativeResponseValue;
        }
        // LDKCResult_SignatureNoneZ ChannelKeys_sign_justice_transaction LDKChannelKeys* this_arg, struct LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (*per_commitment_key)[32], const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc
@@ -868,6 +856,9 @@ public static native long new_empty_slice_vec();
        public static native boolean LDKCResult_TrustedCommitmentTransactionNoneZ_result_ok(long arg);
        public static native number LDKCResult_TrustedCommitmentTransactionNoneZ_get_ok(long arg);
        public static native void LDKCResult_TrustedCommitmentTransactionNoneZ_get_err(long arg);
+       public static native boolean LDKCResult_CVec_SignatureZNoneZ_result_ok(long arg);
+       public static native Uint8Array[] LDKCResult_CVec_SignatureZNoneZ_get_ok(long arg);
+       public static native void LDKCResult_CVec_SignatureZNoneZ_get_err(long arg);
        public static native long LDKCVec_RouteHopZ_new(number[] elems);
        public static native boolean LDKCResult_RouteDecodeErrorZ_result_ok(long arg);
        public static native number LDKCResult_RouteDecodeErrorZ_get_ok(long arg);
@@ -1465,6 +1456,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NoneChannelMonitorUpdateErrZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NoneChannelMonitorUpdateErrZ CResult_NoneChannelMonitorUpdateErrZ_clone(const struct LDKCResult_NoneChannelMonitorUpdateErrZ *NONNULL_PTR orig);
+       export function CResult_NoneChannelMonitorUpdateErrZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NoneChannelMonitorUpdateErrZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void CVec_MonitorEventZ_free(struct LDKCVec_MonitorEventZ _res);
        export function CVec_MonitorEventZ_free(_res: number[]): void {
                if(!isWasmInitialized) {
@@ -1521,6 +1520,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NoneMonitorUpdateErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NoneMonitorUpdateErrorZ CResult_NoneMonitorUpdateErrorZ_clone(const struct LDKCResult_NoneMonitorUpdateErrorZ *NONNULL_PTR orig);
+       export function CResult_NoneMonitorUpdateErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NoneMonitorUpdateErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void C2Tuple_OutPointScriptZ_free(struct LDKC2Tuple_OutPointScriptZ _res);
        export function C2Tuple_OutPointScriptZ_free(_res: number): void {
                if(!isWasmInitialized) {
@@ -1545,6 +1552,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CVec_TransactionZ_free(_res);
                // debug statements here
        }
+       // struct LDKC2Tuple_u32TxOutZ C2Tuple_u32TxOutZ_clone(const struct LDKC2Tuple_u32TxOutZ *NONNULL_PTR orig);
+       export function C2Tuple_u32TxOutZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.C2Tuple_u32TxOutZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void C2Tuple_u32TxOutZ_free(struct LDKC2Tuple_u32TxOutZ _res);
        export function C2Tuple_u32TxOutZ_free(_res: number): void {
                if(!isWasmInitialized) {
@@ -1633,6 +1648,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKC2Tuple_u64u64Z C2Tuple_u64u64Z_clone(const struct LDKC2Tuple_u64u64Z *NONNULL_PTR orig);
+       export function C2Tuple_u64u64Z_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.C2Tuple_u64u64Z_clone(orig);
+               return nativeResponseValue;
+       }
        // void C2Tuple_u64u64Z_free(struct LDKC2Tuple_u64u64Z _res);
        export function C2Tuple_u64u64Z_free(_res: number): void {
                if(!isWasmInitialized) {
@@ -1673,6 +1696,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_SpendableOutputDescriptorDecodeErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ CResult_SpendableOutputDescriptorDecodeErrorZ_clone(const struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR orig);
+       export function CResult_SpendableOutputDescriptorDecodeErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_SpendableOutputDescriptorDecodeErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void CVec_SignatureZ_free(struct LDKCVec_SignatureZ _res);
        export function CVec_SignatureZ_free(_res: Uint8Array[]): void {
                if(!isWasmInitialized) {
@@ -1681,6 +1712,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CVec_SignatureZ_free(_res);
                // debug statements here
        }
+       // struct LDKC2Tuple_SignatureCVec_SignatureZZ C2Tuple_SignatureCVec_SignatureZZ_clone(const struct LDKC2Tuple_SignatureCVec_SignatureZZ *NONNULL_PTR orig);
+       export function C2Tuple_SignatureCVec_SignatureZZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.C2Tuple_SignatureCVec_SignatureZZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void C2Tuple_SignatureCVec_SignatureZZ_free(struct LDKC2Tuple_SignatureCVec_SignatureZZ _res);
        export function C2Tuple_SignatureCVec_SignatureZZ_free(_res: number): void {
                if(!isWasmInitialized) {
@@ -1761,38 +1800,6 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_SignatureNoneZ_clone(orig);
                return nativeResponseValue;
        }
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_ok(struct LDKCVec_SignatureZ o);
-       export function CResult_CVec_SignatureZNoneZ_ok(o: Uint8Array[]): number {
-               if(!isWasmInitialized) {
-                       throw new Error("initializeWasm() must be awaited first!");
-               }
-               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_ok(o);
-               return nativeResponseValue;
-       }
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_err(void);
-       export function CResult_CVec_SignatureZNoneZ_err(): number {
-               if(!isWasmInitialized) {
-                       throw new Error("initializeWasm() must be awaited first!");
-               }
-               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_err();
-               return nativeResponseValue;
-       }
-       // void CResult_CVec_SignatureZNoneZ_free(struct LDKCResult_CVec_SignatureZNoneZ _res);
-       export function CResult_CVec_SignatureZNoneZ_free(_res: number): void {
-               if(!isWasmInitialized) {
-                       throw new Error("initializeWasm() must be awaited first!");
-               }
-               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_free(_res);
-               // debug statements here
-       }
-       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_clone(const struct LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR orig);
-       export function CResult_CVec_SignatureZNoneZ_clone(orig: number): number {
-               if(!isWasmInitialized) {
-                       throw new Error("initializeWasm() must be awaited first!");
-               }
-               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_clone(orig);
-               return nativeResponseValue;
-       }
        // struct LDKCResult_ChanKeySignerDecodeErrorZ CResult_ChanKeySignerDecodeErrorZ_ok(struct LDKChannelKeys o);
        export function CResult_ChanKeySignerDecodeErrorZ_ok(o: number): number {
                if(!isWasmInitialized) {
@@ -1817,6 +1824,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_ChanKeySignerDecodeErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_ChanKeySignerDecodeErrorZ CResult_ChanKeySignerDecodeErrorZ_clone(const struct LDKCResult_ChanKeySignerDecodeErrorZ *NONNULL_PTR orig);
+       export function CResult_ChanKeySignerDecodeErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_ChanKeySignerDecodeErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_InMemoryChannelKeysDecodeErrorZ CResult_InMemoryChannelKeysDecodeErrorZ_ok(struct LDKInMemoryChannelKeys o);
        export function CResult_InMemoryChannelKeysDecodeErrorZ_ok(o: number): number {
                if(!isWasmInitialized) {
@@ -1865,6 +1880,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_TxOutAccessErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_TxOutAccessErrorZ CResult_TxOutAccessErrorZ_clone(const struct LDKCResult_TxOutAccessErrorZ *NONNULL_PTR orig);
+       export function CResult_TxOutAccessErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_TxOutAccessErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_NoneAPIErrorZ CResult_NoneAPIErrorZ_ok(void);
        export function CResult_NoneAPIErrorZ_ok(): number {
                if(!isWasmInitialized) {
@@ -1921,6 +1944,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NonePaymentSendFailureZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NonePaymentSendFailureZ CResult_NonePaymentSendFailureZ_clone(const struct LDKCResult_NonePaymentSendFailureZ *NONNULL_PTR orig);
+       export function CResult_NonePaymentSendFailureZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NonePaymentSendFailureZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void CVec_NetAddressZ_free(struct LDKCVec_NetAddressZ _res);
        export function CVec_NetAddressZ_free(_res: number[]): void {
                if(!isWasmInitialized) {
@@ -2001,6 +2032,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NetAddressu8Z_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NetAddressu8Z CResult_NetAddressu8Z_clone(const struct LDKCResult_NetAddressu8Z *NONNULL_PTR orig);
+       export function CResult_NetAddressu8Z_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NetAddressu8Z_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_CResult_NetAddressu8ZDecodeErrorZ CResult_CResult_NetAddressu8ZDecodeErrorZ_ok(struct LDKCResult_NetAddressu8Z o);
        export function CResult_CResult_NetAddressu8ZDecodeErrorZ_ok(o: number): number {
                if(!isWasmInitialized) {
@@ -2089,6 +2128,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_boolLightningErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_boolLightningErrorZ CResult_boolLightningErrorZ_clone(const struct LDKCResult_boolLightningErrorZ *NONNULL_PTR orig);
+       export function CResult_boolLightningErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_boolLightningErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(struct LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ _res);
        export function C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_free(_res: number): void {
                if(!isWasmInitialized) {
@@ -2145,6 +2192,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NoneLightningErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NoneLightningErrorZ CResult_NoneLightningErrorZ_clone(const struct LDKCResult_NoneLightningErrorZ *NONNULL_PTR orig);
+       export function CResult_NoneLightningErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NoneLightningErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_ChannelReestablishDecodeErrorZ CResult_ChannelReestablishDecodeErrorZ_ok(struct LDKChannelReestablish o);
        export function CResult_ChannelReestablishDecodeErrorZ_ok(o: number): number {
                if(!isWasmInitialized) {
@@ -2497,6 +2552,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_CVec_u8ZPeerHandleErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_CVec_u8ZPeerHandleErrorZ CResult_CVec_u8ZPeerHandleErrorZ_clone(const struct LDKCResult_CVec_u8ZPeerHandleErrorZ *NONNULL_PTR orig);
+       export function CResult_CVec_u8ZPeerHandleErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_CVec_u8ZPeerHandleErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_NonePeerHandleErrorZ CResult_NonePeerHandleErrorZ_ok(void);
        export function CResult_NonePeerHandleErrorZ_ok(): number {
                if(!isWasmInitialized) {
@@ -2521,6 +2584,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NonePeerHandleErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NonePeerHandleErrorZ CResult_NonePeerHandleErrorZ_clone(const struct LDKCResult_NonePeerHandleErrorZ *NONNULL_PTR orig);
+       export function CResult_NonePeerHandleErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NonePeerHandleErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_boolPeerHandleErrorZ CResult_boolPeerHandleErrorZ_ok(bool o);
        export function CResult_boolPeerHandleErrorZ_ok(o: boolean): number {
                if(!isWasmInitialized) {
@@ -2545,6 +2616,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_boolPeerHandleErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_boolPeerHandleErrorZ CResult_boolPeerHandleErrorZ_clone(const struct LDKCResult_boolPeerHandleErrorZ *NONNULL_PTR orig);
+       export function CResult_boolPeerHandleErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_boolPeerHandleErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_SecretKeySecpErrorZ CResult_SecretKeySecpErrorZ_ok(struct LDKSecretKey o);
        export function CResult_SecretKeySecpErrorZ_ok(o: Uint8Array): number {
                if(!isWasmInitialized) {
@@ -2641,6 +2720,38 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_TrustedCommitmentTransactionNoneZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_ok(struct LDKCVec_SignatureZ o);
+       export function CResult_CVec_SignatureZNoneZ_ok(o: Uint8Array[]): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_ok(o);
+               return nativeResponseValue;
+       }
+       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_err(void);
+       export function CResult_CVec_SignatureZNoneZ_err(): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_err();
+               return nativeResponseValue;
+       }
+       // void CResult_CVec_SignatureZNoneZ_free(struct LDKCResult_CVec_SignatureZNoneZ _res);
+       export function CResult_CVec_SignatureZNoneZ_free(_res: number): void {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_free(_res);
+               // debug statements here
+       }
+       // struct LDKCResult_CVec_SignatureZNoneZ CResult_CVec_SignatureZNoneZ_clone(const struct LDKCResult_CVec_SignatureZNoneZ *NONNULL_PTR orig);
+       export function CResult_CVec_SignatureZNoneZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_CVec_SignatureZNoneZ_clone(orig);
+               return nativeResponseValue;
+       }
        // void CVec_RouteHopZ_free(struct LDKCVec_RouteHopZ _res);
        export function CVec_RouteHopZ_free(_res: number[]): void {
                if(!isWasmInitialized) {
@@ -2761,6 +2872,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NodeAnnouncementInfoDecodeErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ CResult_NodeAnnouncementInfoDecodeErrorZ_clone(const struct LDKCResult_NodeAnnouncementInfoDecodeErrorZ *NONNULL_PTR orig);
+       export function CResult_NodeAnnouncementInfoDecodeErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NodeAnnouncementInfoDecodeErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_NodeInfoDecodeErrorZ CResult_NodeInfoDecodeErrorZ_ok(struct LDKNodeInfo o);
        export function CResult_NodeInfoDecodeErrorZ_ok(o: number): number {
                if(!isWasmInitialized) {
@@ -2785,6 +2904,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.CResult_NodeInfoDecodeErrorZ_free(_res);
                // debug statements here
        }
+       // struct LDKCResult_NodeInfoDecodeErrorZ CResult_NodeInfoDecodeErrorZ_clone(const struct LDKCResult_NodeInfoDecodeErrorZ *NONNULL_PTR orig);
+       export function CResult_NodeInfoDecodeErrorZ_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.CResult_NodeInfoDecodeErrorZ_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCResult_NetworkGraphDecodeErrorZ CResult_NetworkGraphDecodeErrorZ_ok(struct LDKNetworkGraph o);
        export function CResult_NetworkGraphDecodeErrorZ_ok(o: number): number {
                if(!isWasmInitialized) {
@@ -3521,6 +3648,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.MonitorUpdateError_free(this_ptr);
                // debug statements here
        }
+       // struct LDKMonitorUpdateError MonitorUpdateError_clone(const struct LDKMonitorUpdateError *NONNULL_PTR orig);
+       export function MonitorUpdateError_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.MonitorUpdateError_clone(orig);
+               return nativeResponseValue;
+       }
        // void MonitorEvent_free(struct LDKMonitorEvent this_ptr);
        export function MonitorEvent_free(this_ptr: number): void {
                if(!isWasmInitialized) {
@@ -3577,6 +3712,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.ChannelMonitor_free(this_ptr);
                // debug statements here
        }
+       // struct LDKChannelMonitor ChannelMonitor_clone(const struct LDKChannelMonitor *NONNULL_PTR orig);
+       export function ChannelMonitor_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.ChannelMonitor_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKCVec_u8Z ChannelMonitor_write(const struct LDKChannelMonitor *NONNULL_PTR obj);
        export function ChannelMonitor_write(obj: number): Uint8Array {
                if(!isWasmInitialized) {
@@ -4185,6 +4328,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.PaymentSendFailure_free(this_ptr);
                // debug statements here
        }
+       // struct LDKPaymentSendFailure PaymentSendFailure_clone(const struct LDKPaymentSendFailure *NONNULL_PTR orig);
+       export function PaymentSendFailure_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.PaymentSendFailure_clone(orig);
+               return nativeResponseValue;
+       }
        // MUST_USE_RES struct LDKChannelManager ChannelManager_new(enum LDKNetwork network, struct LDKFeeEstimator fee_est, struct LDKWatch chain_monitor, struct LDKBroadcasterInterface tx_broadcaster, struct LDKLogger logger, struct LDKKeysInterface keys_manager, struct LDKUserConfig config, uintptr_t current_blockchain_height);
        export function ChannelManager_new(network: LDKNetwork, fee_est: number, chain_monitor: number, tx_broadcaster: number, logger: number, keys_manager: number, config: number, current_blockchain_height: number): number {
                if(!isWasmInitialized) {
@@ -4225,13 +4376,13 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.ChannelManager_close_channel(this_arg, encodeArray(channel_id));
                return nativeResponseValue;
        }
-       // void ChannelManager_force_close_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32]);
-       export function ChannelManager_force_close_channel(this_arg: number, channel_id: Uint8Array): void {
+       // MUST_USE_RES struct LDKCResult_NoneAPIErrorZ ChannelManager_force_close_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, const uint8_t (*channel_id)[32]);
+       export function ChannelManager_force_close_channel(this_arg: number, channel_id: Uint8Array): number {
                if(!isWasmInitialized) {
                        throw new Error("initializeWasm() must be awaited first!");
                }
                const nativeResponseValue = wasm.ChannelManager_force_close_channel(this_arg, encodeArray(channel_id));
-               // debug statements here
+               return nativeResponseValue;
        }
        // void ChannelManager_force_close_all_channels(const struct LDKChannelManager *NONNULL_PTR this_arg);
        export function ChannelManager_force_close_all_channels(this_arg: number): void {
@@ -4489,6 +4640,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.DecodeError_free(this_ptr);
                // debug statements here
        }
+       // struct LDKDecodeError DecodeError_clone(const struct LDKDecodeError *NONNULL_PTR orig);
+       export function DecodeError_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.DecodeError_clone(orig);
+               return nativeResponseValue;
+       }
        // void Init_free(struct LDKInit this_ptr);
        export function Init_free(this_ptr: number): void {
                if(!isWasmInitialized) {
@@ -7201,6 +7360,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.LightningError_free(this_ptr);
                // debug statements here
        }
+       // struct LDKLightningError LightningError_clone(const struct LDKLightningError *NONNULL_PTR orig);
+       export function LightningError_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.LightningError_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKStr LightningError_get_err(const struct LDKLightningError *NONNULL_PTR this_ptr);
        export function LightningError_get_err(this_ptr: number): String {
                if(!isWasmInitialized) {
@@ -7929,6 +8096,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.PeerHandleError_free(this_ptr);
                // debug statements here
        }
+       // struct LDKPeerHandleError PeerHandleError_clone(const struct LDKPeerHandleError *NONNULL_PTR orig);
+       export function PeerHandleError_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.PeerHandleError_clone(orig);
+               return nativeResponseValue;
+       }
        // bool PeerHandleError_get_no_connection_possible(const struct LDKPeerHandleError *NONNULL_PTR this_ptr);
        export function PeerHandleError_get_no_connection_possible(this_ptr: number): boolean {
                if(!isWasmInitialized) {
@@ -9385,6 +9560,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.DirectionalChannelInfo_free(this_ptr);
                // debug statements here
        }
+       // struct LDKDirectionalChannelInfo DirectionalChannelInfo_clone(const struct LDKDirectionalChannelInfo *NONNULL_PTR orig);
+       export function DirectionalChannelInfo_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.DirectionalChannelInfo_clone(orig);
+               return nativeResponseValue;
+       }
        // uint32_t DirectionalChannelInfo_get_last_update(const struct LDKDirectionalChannelInfo *NONNULL_PTR this_ptr);
        export function DirectionalChannelInfo_get_last_update(this_ptr: number): number {
                if(!isWasmInitialized) {
@@ -9697,6 +9880,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.NodeAnnouncementInfo_free(this_ptr);
                // debug statements here
        }
+       // struct LDKNodeAnnouncementInfo NodeAnnouncementInfo_clone(const struct LDKNodeAnnouncementInfo *NONNULL_PTR orig);
+       export function NodeAnnouncementInfo_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.NodeAnnouncementInfo_clone(orig);
+               return nativeResponseValue;
+       }
        // struct LDKNodeFeatures NodeAnnouncementInfo_get_features(const struct LDKNodeAnnouncementInfo *NONNULL_PTR this_ptr);
        export function NodeAnnouncementInfo_get_features(this_ptr: number): number {
                if(!isWasmInitialized) {
@@ -9817,6 +10008,14 @@ public static native long new_empty_slice_vec();
                const nativeResponseValue = wasm.NodeInfo_free(this_ptr);
                // debug statements here
        }
+       // struct LDKNodeInfo NodeInfo_clone(const struct LDKNodeInfo *NONNULL_PTR orig);
+       export function NodeInfo_clone(orig: number): number {
+               if(!isWasmInitialized) {
+                       throw new Error("initializeWasm() must be awaited first!");
+               }
+               const nativeResponseValue = wasm.NodeInfo_clone(orig);
+               return nativeResponseValue;
+       }
        // void NodeInfo_set_channels(struct LDKNodeInfo *NONNULL_PTR this_ptr, struct LDKCVec_u64Z val);
        export function NodeInfo_set_channels(this_ptr: number, val: number[]): void {
                if(!isWasmInitialized) {
index bcd54516bfab8732647fe558d425068d44d692fb..e9719e48e7f96741cc26c17f7265badf62c07185 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public AcceptChannel clone() {
                number ret = bindings.AcceptChannel_clone(this.ptr);
                const ret_hu_conv: AcceptChannel = new AcceptChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -158,6 +159,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static AcceptChannel constructor_read(Uint8Array ser) {
                number ret = bindings.AcceptChannel_read(ser);
                const ret_hu_conv: AcceptChannel = new AcceptChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index bf41f671dca13258f7eaa19d401e0c422fc71802..85625d72b52e0a4d5945b9d3bea5d9fcf91298de 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public AnnouncementSignatures clone() {
                number ret = bindings.AnnouncementSignatures_clone(this.ptr);
                const ret_hu_conv: AnnouncementSignatures = new AnnouncementSignatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -63,6 +64,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static AnnouncementSignatures constructor_new(Uint8Array channel_id_arg, number short_channel_id_arg, Uint8Array node_signature_arg, Uint8Array bitcoin_signature_arg) {
                number ret = bindings.AnnouncementSignatures_new(channel_id_arg, short_channel_id_arg, node_signature_arg, bitcoin_signature_arg);
                const ret_hu_conv: AnnouncementSignatures = new AnnouncementSignatures(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -74,6 +76,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static AnnouncementSignatures constructor_read(Uint8Array ser) {
                number ret = bindings.AnnouncementSignatures_read(ser);
                const ret_hu_conv: AnnouncementSignatures = new AnnouncementSignatures(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index cbd675951ef51f80902b720705f62faa29baf8ed..56f9977848cfd9374656f6b676dd593d1df2d143 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public BuiltCommitmentTransaction clone() {
                number ret = bindings.BuiltCommitmentTransaction_clone(this.ptr);
                const ret_hu_conv: BuiltCommitmentTransaction = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static BuiltCommitmentTransaction constructor_new(Uint8Array transaction_arg, Uint8Array txid_arg) {
                number ret = bindings.BuiltCommitmentTransaction_new(transaction_arg, txid_arg);
                const ret_hu_conv: BuiltCommitmentTransaction = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -56,6 +58,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static BuiltCommitmentTransaction constructor_read(Uint8Array ser) {
                number ret = bindings.BuiltCommitmentTransaction_read(ser);
                const ret_hu_conv: BuiltCommitmentTransaction = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 6cbc46219235cb86ee76e7f710f63022a6c84af9..a8312b90c213dab9349da25a2857f5b1cb933c82 100644 (file)
@@ -30,6 +30,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChainMonitor constructor_new(Filter chain_source, BroadcasterInterface broadcaster, Logger logger, FeeEstimator feeest, Persist persister) {
                number ret = bindings.ChainMonitor_new(chain_source == null ? 0 : chain_source.ptr, broadcaster == null ? 0 : broadcaster.ptr, logger == null ? 0 : logger.ptr, feeest == null ? 0 : feeest.ptr, persister == null ? 0 : persister.ptr);
                const ret_hu_conv: ChainMonitor = new ChainMonitor(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chain_source);
                ret_hu_conv.ptrs_to.add(broadcaster);
                ret_hu_conv.ptrs_to.add(logger);
index 9dc8d745165e2450f1a30f768cebf746b2e157e9..0ab592e29cf1be95791d9aa80c59e3f348c32acd 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelAnnouncement clone() {
                number ret = bindings.ChannelAnnouncement_clone(this.ptr);
                const ret_hu_conv: ChannelAnnouncement = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -63,6 +64,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UnsignedChannelAnnouncement get_contents() {
                number ret = bindings.ChannelAnnouncement_get_contents(this.ptr);
                const ret_hu_conv: UnsignedChannelAnnouncement = new UnsignedChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -74,6 +76,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelAnnouncement constructor_new(Uint8Array node_signature_1_arg, Uint8Array node_signature_2_arg, Uint8Array bitcoin_signature_1_arg, Uint8Array bitcoin_signature_2_arg, UnsignedChannelAnnouncement contents_arg) {
                number ret = bindings.ChannelAnnouncement_new(node_signature_1_arg, node_signature_2_arg, bitcoin_signature_1_arg, bitcoin_signature_2_arg, contents_arg == null ? 0 : contents_arg.ptr & ~1);
                const ret_hu_conv: ChannelAnnouncement = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(contents_arg);
                return ret_hu_conv;
        }
@@ -86,6 +89,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelAnnouncement constructor_read(Uint8Array ser) {
                number ret = bindings.ChannelAnnouncement_read(ser);
                const ret_hu_conv: ChannelAnnouncement = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 3f07d5c92b8873f0865fc0ad3d60bafe7b2ddb36..85d0fa73ceacdf290f3009cb742e7b7e2477b2e7 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelConfig clone() {
                number ret = bindings.ChannelConfig_clone(this.ptr);
                const ret_hu_conv: ChannelConfig = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,12 +55,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelConfig constructor_new(number fee_proportional_millionths_arg, boolean announced_channel_arg, boolean commit_upfront_shutdown_pubkey_arg) {
                number ret = bindings.ChannelConfig_new(fee_proportional_millionths_arg, announced_channel_arg, commit_upfront_shutdown_pubkey_arg);
                const ret_hu_conv: ChannelConfig = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static ChannelConfig constructor_default() {
                number ret = bindings.ChannelConfig_default();
                const ret_hu_conv: ChannelConfig = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -71,6 +74,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelConfig constructor_read(Uint8Array ser) {
                number ret = bindings.ChannelConfig_read(ser);
                const ret_hu_conv: ChannelConfig = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 3643d2a1dfb24f525ca869fb675576948a4752c9..5e8c88a20fcfd3e28d452c802a7e40f626d6d734 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelDetails clone() {
                number ret = bindings.ChannelDetails_clone(this.ptr);
                const ret_hu_conv: ChannelDetails = new ChannelDetails(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,12 +46,21 @@ import * as bindings from '../bindings' // TODO: figure out location
        public InitFeatures get_counterparty_features() {
                number ret = bindings.ChannelDetails_get_counterparty_features(this.ptr);
                const ret_hu_conv: InitFeatures = new InitFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_counterparty_features(InitFeatures val) {
                bindings.ChannelDetails_set_counterparty_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public number get_channel_value_satoshis() {
index 96cb4d85f2073dd2b94e533b7e52cc1df28a1245..e199a1e30f95f44647ddcd60f1e1911d33919d0b 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelHandshakeConfig clone() {
                number ret = bindings.ChannelHandshakeConfig_clone(this.ptr);
                const ret_hu_conv: ChannelHandshakeConfig = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,12 +55,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelHandshakeConfig constructor_new(number minimum_depth_arg, number our_to_self_delay_arg, number our_htlc_minimum_msat_arg) {
                number ret = bindings.ChannelHandshakeConfig_new(minimum_depth_arg, our_to_self_delay_arg, our_htlc_minimum_msat_arg);
                const ret_hu_conv: ChannelHandshakeConfig = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static ChannelHandshakeConfig constructor_default() {
                number ret = bindings.ChannelHandshakeConfig_default();
                const ret_hu_conv: ChannelHandshakeConfig = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index c65a6294702cc913219b07206b3c391c12ba788b..f0c549ba18375e19f1ed8f9680a47ef6737554a4 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelHandshakeLimits clone() {
                number ret = bindings.ChannelHandshakeLimits_clone(this.ptr);
                const ret_hu_conv: ChannelHandshakeLimits = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -117,12 +118,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelHandshakeLimits constructor_new(number min_funding_satoshis_arg, number max_htlc_minimum_msat_arg, number min_max_htlc_value_in_flight_msat_arg, number max_channel_reserve_satoshis_arg, number min_max_accepted_htlcs_arg, number min_dust_limit_satoshis_arg, number max_dust_limit_satoshis_arg, number max_minimum_depth_arg, boolean force_announced_channel_preference_arg, number their_to_self_delay_arg) {
                number ret = bindings.ChannelHandshakeLimits_new(min_funding_satoshis_arg, max_htlc_minimum_msat_arg, min_max_htlc_value_in_flight_msat_arg, max_channel_reserve_satoshis_arg, min_max_accepted_htlcs_arg, min_dust_limit_satoshis_arg, max_dust_limit_satoshis_arg, max_minimum_depth_arg, force_announced_channel_preference_arg, their_to_self_delay_arg);
                const ret_hu_conv: ChannelHandshakeLimits = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static ChannelHandshakeLimits constructor_default() {
                number ret = bindings.ChannelHandshakeLimits_default();
                const ret_hu_conv: ChannelHandshakeLimits = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index cbbdfba14f75a8731ef1f77d96a1d43e6696ceb8..b99fd456af0890c858f1bafd247cd8a476d95d17 100644 (file)
@@ -21,12 +21,21 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelFeatures get_features() {
                number ret = bindings.ChannelInfo_get_features(this.ptr);
                const ret_hu_conv: ChannelFeatures = new ChannelFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(ChannelFeatures val) {
                bindings.ChannelInfo_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public Uint8Array get_node_one() {
@@ -41,6 +50,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public DirectionalChannelInfo get_one_to_two() {
                number ret = bindings.ChannelInfo_get_one_to_two(this.ptr);
                const ret_hu_conv: DirectionalChannelInfo = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -61,6 +71,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public DirectionalChannelInfo get_two_to_one() {
                number ret = bindings.ChannelInfo_get_two_to_one(this.ptr);
                const ret_hu_conv: DirectionalChannelInfo = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -72,6 +83,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelAnnouncement get_announcement_message() {
                number ret = bindings.ChannelInfo_get_announcement_message(this.ptr);
                const ret_hu_conv: ChannelAnnouncement = new ChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -88,6 +100,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelInfo constructor_read(Uint8Array ser) {
                number ret = bindings.ChannelInfo_read(ser);
                const ret_hu_conv: ChannelInfo = new ChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 746ff660e3ac0e3a0f21fc55702827074321211d..957dc512f372b5d836e2b00ca93db6c76007554d 100644 (file)
@@ -56,16 +56,9 @@ import * as bindings from '../bindings' // TODO: figure out location
                                return result;
                                                },
 
-                                               sign_holder_commitment (commitment_tx: number): number {
+                                               sign_holder_commitment_and_htlcs (commitment_tx: number): number {
                                                        const commitment_tx_hu_conv: HolderCommitmentTransaction = new HolderCommitmentTransaction(null, commitment_tx);
-                                                       Result_SignatureNoneZ ret = arg.sign_holder_commitment(commitment_tx_hu_conv);
-                               result: number = ret != null ? ret.ptr : 0;
-                               return result;
-                                               },
-
-                                               sign_holder_commitment_htlc_transactions (commitment_tx: number): number {
-                                                       const commitment_tx_hu_conv: HolderCommitmentTransaction = new HolderCommitmentTransaction(null, commitment_tx);
-                                                       Result_CVec_SignatureZNoneZ ret = arg.sign_holder_commitment_htlc_transactions(commitment_tx_hu_conv);
+                                                       Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret = arg.sign_holder_commitment_and_htlcs(commitment_tx_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
                                return result;
                                                },
@@ -118,8 +111,7 @@ import * as bindings from '../bindings' // TODO: figure out location
                                release_commitment_secret(idx: number): Uint8Array;
                                key_derivation_params(): TwoTuple<Number, Number>;
                                sign_counterparty_commitment(commitment_tx: CommitmentTransaction): Result_C2Tuple_SignatureCVec_SignatureZZNoneZ;
-                               sign_holder_commitment(commitment_tx: HolderCommitmentTransaction): Result_SignatureNoneZ;
-                               sign_holder_commitment_htlc_transactions(commitment_tx: HolderCommitmentTransaction): Result_CVec_SignatureZNoneZ;
+                               sign_holder_commitment_and_htlcs(commitment_tx: HolderCommitmentTransaction): Result_C2Tuple_SignatureCVec_SignatureZZNoneZ;
                                sign_justice_transaction(justice_tx: Uint8Array, input: number, amount: number, per_commitment_key: Uint8Array, htlc: HTLCOutputInCommitment): Result_SignatureNoneZ;
                                sign_counterparty_htlc_transaction(htlc_tx: Uint8Array, input: number, amount: number, per_commitment_point: Uint8Array, htlc: HTLCOutputInCommitment): Result_SignatureNoneZ;
                                sign_closing_transaction(closing_tx: Uint8Array): Result_SignatureNoneZ;
@@ -157,16 +149,9 @@ import * as bindings from '../bindings' // TODO: figure out location
                return ret_hu_conv;
        }
 
-       public Result_SignatureNoneZ sign_holder_commitment(HolderCommitmentTransaction commitment_tx) {
-               number ret = bindings.ChannelKeys_sign_holder_commitment(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr & ~1);
-               Result_SignatureNoneZ ret_hu_conv = Result_SignatureNoneZ.constr_from_ptr(ret);
-               this.ptrs_to.add(commitment_tx);
-               return ret_hu_conv;
-       }
-
-       public Result_CVec_SignatureZNoneZ sign_holder_commitment_htlc_transactions(HolderCommitmentTransaction commitment_tx) {
-               number ret = bindings.ChannelKeys_sign_holder_commitment_htlc_transactions(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr & ~1);
-               Result_CVec_SignatureZNoneZ ret_hu_conv = Result_CVec_SignatureZNoneZ.constr_from_ptr(ret);
+       public Result_C2Tuple_SignatureCVec_SignatureZZNoneZ sign_holder_commitment_and_htlcs(HolderCommitmentTransaction commitment_tx) {
+               number ret = bindings.ChannelKeys_sign_holder_commitment_and_htlcs(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr & ~1);
+               Result_C2Tuple_SignatureCVec_SignatureZZNoneZ ret_hu_conv = Result_C2Tuple_SignatureCVec_SignatureZZNoneZ.constr_from_ptr(ret);
                this.ptrs_to.add(commitment_tx);
                return ret_hu_conv;
        }
@@ -211,6 +196,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelPublicKeys get_pubkeys() {
                number ret = bindings.ChannelKeys_get_pubkeys(this.ptr);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 226c9c9e1d444dcd6dec77fe267bb88918010864..27570f00cb3b08e657ceacfe97ddd04b8528346d 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelManager constructor_new(LDKNetwork network, FeeEstimator fee_est, Watch chain_monitor, BroadcasterInterface tx_broadcaster, Logger logger, KeysInterface keys_manager, UserConfig config, number current_blockchain_height) {
                number ret = bindings.ChannelManager_new(network, fee_est == null ? 0 : fee_est.ptr, chain_monitor == null ? 0 : chain_monitor.ptr, tx_broadcaster == null ? 0 : tx_broadcaster.ptr, logger == null ? 0 : logger.ptr, keys_manager == null ? 0 : keys_manager.ptr, config == null ? 0 : config.ptr & ~1, current_blockchain_height);
                const ret_hu_conv: ChannelManager = new ChannelManager(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(fee_est);
                ret_hu_conv.ptrs_to.add(chain_monitor);
                ret_hu_conv.ptrs_to.add(tx_broadcaster);
@@ -43,6 +44,7 @@ import * as bindings from '../bindings' // TODO: figure out location
                for (int q = 0; q < ret.length; q++) {
                        number arr_conv_16 = ret[q];
                        const arr_conv_16_hu_conv: ChannelDetails = new ChannelDetails(null, arr_conv_16);
+                       arr_conv_16_hu_conv.ptrs_to.add(this);
                        arr_conv_16_arr[q] = arr_conv_16_hu_conv;
                }
                return arr_conv_16_arr;
@@ -54,6 +56,7 @@ import * as bindings from '../bindings' // TODO: figure out location
                for (int q = 0; q < ret.length; q++) {
                        number arr_conv_16 = ret[q];
                        const arr_conv_16_hu_conv: ChannelDetails = new ChannelDetails(null, arr_conv_16);
+                       arr_conv_16_hu_conv.ptrs_to.add(this);
                        arr_conv_16_arr[q] = arr_conv_16_hu_conv;
                }
                return arr_conv_16_arr;
@@ -65,8 +68,10 @@ import * as bindings from '../bindings' // TODO: figure out location
                return ret_hu_conv;
        }
 
-       public void force_close_channel(Uint8Array channel_id) {
-               bindings.ChannelManager_force_close_channel(this.ptr, channel_id);
+       public Result_NoneAPIErrorZ force_close_channel(Uint8Array channel_id) {
+               number ret = bindings.ChannelManager_force_close_channel(this.ptr, channel_id);
+               Result_NoneAPIErrorZ ret_hu_conv = Result_NoneAPIErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
        }
 
        public void force_close_all_channels() {
index d270a462cff2a64786b7297f9939c7cc0120b93c..ff9865e9bba1fa2745518c235ab89778351c481b 100644 (file)
@@ -81,6 +81,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UserConfig get_default_config() {
                number ret = bindings.ChannelManagerReadArgs_get_default_config(this.ptr);
                const ret_hu_conv: UserConfig = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -92,6 +93,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelManagerReadArgs constructor_new(KeysInterface keys_manager, FeeEstimator fee_estimator, Watch chain_monitor, BroadcasterInterface tx_broadcaster, Logger logger, UserConfig default_config, ChannelMonitor[] channel_monitors) {
                number ret = bindings.ChannelManagerReadArgs_new(keys_manager == null ? 0 : keys_manager.ptr, fee_estimator == null ? 0 : fee_estimator.ptr, chain_monitor == null ? 0 : chain_monitor.ptr, tx_broadcaster == null ? 0 : tx_broadcaster.ptr, logger == null ? 0 : logger.ptr, default_config == null ? 0 : default_config.ptr & ~1, (number[])Arrays.stream(channel_monitors).map(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray());
                const ret_hu_conv: ChannelManagerReadArgs = new ChannelManagerReadArgs(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(keys_manager);
                ret_hu_conv.ptrs_to.add(fee_estimator);
                ret_hu_conv.ptrs_to.add(chain_monitor);
index 52144c80955458149466f01ae90be06251168ac8..aff48916deda48b9c2066749c8e5c582d5f1e814 100644 (file)
@@ -35,12 +35,14 @@ import * as bindings from '../bindings' // TODO: figure out location
                         // todo: in-line interface filling
                         handle_open_channel (their_node_id: Uint8Array, their_features: number, msg: number): void {
                                                        const their_features_hu_conv: InitFeatures = new InitFeatures(null, their_features);
+                               their_features_hu_conv.ptrs_to.add(this);
                                                        const msg_hu_conv: OpenChannel = new OpenChannel(null, msg);
                                                        arg.handle_open_channel(their_node_id, their_features_hu_conv, msg_hu_conv);
                                                },
 
                                                handle_accept_channel (their_node_id: Uint8Array, their_features: number, msg: number): void {
                                                        const their_features_hu_conv: InitFeatures = new InitFeatures(null, their_features);
+                               their_features_hu_conv.ptrs_to.add(this);
                                                        const msg_hu_conv: AcceptChannel = new AcceptChannel(null, msg);
                                                        arg.handle_accept_channel(their_node_id, their_features_hu_conv, msg_hu_conv);
                                                },
@@ -164,12 +166,28 @@ import * as bindings from '../bindings' // TODO: figure out location
        public void handle_open_channel(Uint8Array their_node_id, InitFeatures their_features, OpenChannel msg) {
                bindings.ChannelMessageHandler_handle_open_channel(this.ptr, their_node_id, their_features == null ? 0 : their_features.ptr & ~1, msg == null ? 0 : msg.ptr & ~1);
                this.ptrs_to.add(their_features);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, their_features is reset to null and is now a dummy object.
+               their_features.ptr = 0;
                this.ptrs_to.add(msg);
        }
 
        public void handle_accept_channel(Uint8Array their_node_id, InitFeatures their_features, AcceptChannel msg) {
                bindings.ChannelMessageHandler_handle_accept_channel(this.ptr, their_node_id, their_features == null ? 0 : their_features.ptr & ~1, msg == null ? 0 : msg.ptr & ~1);
                this.ptrs_to.add(their_features);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, their_features is reset to null and is now a dummy object.
+               their_features.ptr = 0;
                this.ptrs_to.add(msg);
        }
 
index 96bf8c5bf1d5418d96e51d8b5ee2912aecd935fd..8baaf1897141c0c97ad929fc4d825284bcf7b22f 100644 (file)
@@ -18,6 +18,13 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.ChannelMonitor_free(this.ptr);
                     }
                 }
+       public ChannelMonitor clone() {
+               number ret = bindings.ChannelMonitor_clone(this.ptr);
+               const ret_hu_conv: ChannelMonitor = new ChannelMonitor(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public Uint8Array write() {
                Uint8Array ret = bindings.ChannelMonitor_write(this.ptr);
                return ret;
@@ -41,7 +48,8 @@ import * as bindings from '../bindings' // TODO: figure out location
        public TwoTuple<OutPoint, Uint8Array> get_funding_txo() {
                number ret = bindings.ChannelMonitor_get_funding_txo(this.ptr);
                number ret_a = bindings.LDKC2Tuple_OutPointScriptZ_get_a(ret);
-               const ret_a_hu_conv: OutPoint = new OutPoint(null, ret_a);;
+               const ret_a_hu_conv: OutPoint = new OutPoint(null, ret_a);
+               ret_a_hu_conv.ptrs_to.add(this);;
                Uint8Array ret_b = bindings.LDKC2Tuple_OutPointScriptZ_get_b(ret);
                TwoTuple<OutPoint, Uint8Array> ret_conv = new TwoTuple<OutPoint, Uint8Array>(ret_a_hu_conv, ret_b);
                return ret_conv;
@@ -53,6 +61,7 @@ import * as bindings from '../bindings' // TODO: figure out location
                for (int o = 0; o < ret.length; o++) {
                        number arr_conv_14 = ret[o];
                        const arr_conv_14_hu_conv: MonitorEvent = new MonitorEvent(null, arr_conv_14);
+                       arr_conv_14_hu_conv.ptrs_to.add(this);
                        arr_conv_14_arr[o] = arr_conv_14_hu_conv;
                }
                return arr_conv_14_arr;
index a5ef1d14a4c6783aa373123a5bcc711cd83b595c..3217804ef0ae7b04ea8bb4e02aab064edf124a95 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelMonitorUpdate clone() {
                number ret = bindings.ChannelMonitorUpdate_clone(this.ptr);
                const ret_hu_conv: ChannelMonitorUpdate = new ChannelMonitorUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 911a7ac246a19196df0e40cdc9fdcad6b28be4f9..572c44caa70bfe825f887eed164d038fd252783b 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelPublicKeys clone() {
                number ret = bindings.ChannelPublicKeys_clone(this.ptr);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -72,6 +73,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelPublicKeys constructor_new(Uint8Array funding_pubkey_arg, Uint8Array revocation_basepoint_arg, Uint8Array payment_point_arg, Uint8Array delayed_payment_basepoint_arg, Uint8Array htlc_basepoint_arg) {
                number ret = bindings.ChannelPublicKeys_new(funding_pubkey_arg, revocation_basepoint_arg, payment_point_arg, delayed_payment_basepoint_arg, htlc_basepoint_arg);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -83,6 +85,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelPublicKeys constructor_read(Uint8Array ser) {
                number ret = bindings.ChannelPublicKeys_read(ser);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 2394cb2dc9e3e80d112214cf9951d36d1626d6d9..9dfd0976da6af50161282452c6eb44b873e37c60 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelReestablish clone() {
                number ret = bindings.ChannelReestablish_clone(this.ptr);
                const ret_hu_conv: ChannelReestablish = new ChannelReestablish(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 3d6e367ffae3a59ae6e21524534ab287335112fd..3a9d901671094b34bd2aba6154c1ae0baf56d6d9 100644 (file)
@@ -21,12 +21,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelTransactionParameters clone() {
                number ret = bindings.ChannelTransactionParameters_clone(this.ptr);
                const ret_hu_conv: ChannelTransactionParameters = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys get_holder_pubkeys() {
                number ret = bindings.ChannelTransactionParameters_get_holder_pubkeys(this.ptr);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -56,6 +58,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public CounterpartyChannelTransactionParameters get_counterparty_parameters() {
                number ret = bindings.ChannelTransactionParameters_get_counterparty_parameters(this.ptr);
                const ret_hu_conv: CounterpartyChannelTransactionParameters = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -67,6 +70,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public OutPoint get_funding_outpoint() {
                number ret = bindings.ChannelTransactionParameters_get_funding_outpoint(this.ptr);
                const ret_hu_conv: OutPoint = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -78,6 +82,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelTransactionParameters constructor_new(ChannelPublicKeys holder_pubkeys_arg, number holder_selected_contest_delay_arg, boolean is_outbound_from_holder_arg, CounterpartyChannelTransactionParameters counterparty_parameters_arg, OutPoint funding_outpoint_arg) {
                number ret = bindings.ChannelTransactionParameters_new(holder_pubkeys_arg == null ? 0 : holder_pubkeys_arg.ptr & ~1, holder_selected_contest_delay_arg, is_outbound_from_holder_arg, counterparty_parameters_arg == null ? 0 : counterparty_parameters_arg.ptr & ~1, funding_outpoint_arg == null ? 0 : funding_outpoint_arg.ptr & ~1);
                const ret_hu_conv: ChannelTransactionParameters = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(holder_pubkeys_arg);
                ret_hu_conv.ptrs_to.add(counterparty_parameters_arg);
                ret_hu_conv.ptrs_to.add(funding_outpoint_arg);
@@ -92,12 +97,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public DirectedChannelTransactionParameters as_holder_broadcastable() {
                number ret = bindings.ChannelTransactionParameters_as_holder_broadcastable(this.ptr);
                const ret_hu_conv: DirectedChannelTransactionParameters = new DirectedChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public DirectedChannelTransactionParameters as_counterparty_broadcastable() {
                number ret = bindings.ChannelTransactionParameters_as_counterparty_broadcastable(this.ptr);
                const ret_hu_conv: DirectedChannelTransactionParameters = new DirectedChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -109,6 +116,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelTransactionParameters constructor_read(Uint8Array ser) {
                number ret = bindings.ChannelTransactionParameters_read(ser);
                const ret_hu_conv: ChannelTransactionParameters = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 9a8244da910bb8595ae8f5c7a5d2cff321b58e50..524e9a54caf166981771b46f9071ff4cc5d2ef55 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelUpdate clone() {
                number ret = bindings.ChannelUpdate_clone(this.ptr);
                const ret_hu_conv: ChannelUpdate = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -36,6 +37,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UnsignedChannelUpdate get_contents() {
                number ret = bindings.ChannelUpdate_get_contents(this.ptr);
                const ret_hu_conv: UnsignedChannelUpdate = new UnsignedChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -47,6 +49,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelUpdate constructor_new(Uint8Array signature_arg, UnsignedChannelUpdate contents_arg) {
                number ret = bindings.ChannelUpdate_new(signature_arg, contents_arg == null ? 0 : contents_arg.ptr & ~1);
                const ret_hu_conv: ChannelUpdate = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(contents_arg);
                return ret_hu_conv;
        }
@@ -59,6 +62,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ChannelUpdate constructor_read(Uint8Array ser) {
                number ret = bindings.ChannelUpdate_read(ser);
                const ret_hu_conv: ChannelUpdate = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 41714dd05ccd97f3d680a3b4e4a472549bb2c098..cd6eb15b0123fb12eb85d80e51a0ecba873a1a20 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ClosingSigned clone() {
                number ret = bindings.ClosingSigned_clone(this.ptr);
                const ret_hu_conv: ClosingSigned = new ClosingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,6 +55,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ClosingSigned constructor_new(Uint8Array channel_id_arg, number fee_satoshis_arg, Uint8Array signature_arg) {
                number ret = bindings.ClosingSigned_new(channel_id_arg, fee_satoshis_arg, signature_arg);
                const ret_hu_conv: ClosingSigned = new ClosingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -65,6 +67,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ClosingSigned constructor_read(Uint8Array ser) {
                number ret = bindings.ClosingSigned_read(ser);
                const ret_hu_conv: ClosingSigned = new ClosingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 6997cf7c60ab7f0dccdf682afd7c4fd85e63dcaf..58089b3baf3cd9d5c1b7c36e1b1354b3c7a0a171 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public CommitmentSigned clone() {
                number ret = bindings.CommitmentSigned_clone(this.ptr);
                const ret_hu_conv: CommitmentSigned = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -49,6 +50,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static CommitmentSigned constructor_new(Uint8Array channel_id_arg, Uint8Array signature_arg, Uint8Array[] htlc_signatures_arg) {
                number ret = bindings.CommitmentSigned_new(channel_id_arg, signature_arg, htlc_signatures_arg);
                const ret_hu_conv: CommitmentSigned = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -60,6 +62,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static CommitmentSigned constructor_read(Uint8Array ser) {
                number ret = bindings.CommitmentSigned_read(ser);
                const ret_hu_conv: CommitmentSigned = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index d265267ce5a58c9d0399217f97ec9e80571842a2..4d13ed9a8f18d56cf6eaf63e26209c351cb8d72f 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public CommitmentTransaction clone() {
                number ret = bindings.CommitmentTransaction_clone(this.ptr);
                const ret_hu_conv: CommitmentTransaction = new CommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,6 +33,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static CommitmentTransaction constructor_read(Uint8Array ser) {
                number ret = bindings.CommitmentTransaction_read(ser);
                const ret_hu_conv: CommitmentTransaction = new CommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -58,6 +60,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public TrustedCommitmentTransaction trust() {
                number ret = bindings.CommitmentTransaction_trust(this.ptr);
                const ret_hu_conv: TrustedCommitmentTransaction = new TrustedCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 0a11f39eb79b0391dc057dd78a8170cbf1be35d2..3564c6991a4a57d9a242869fc852c2c082a0542d 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public CommitmentUpdate clone() {
                number ret = bindings.CommitmentUpdate_clone(this.ptr);
                const ret_hu_conv: CommitmentUpdate = new CommitmentUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -47,6 +48,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UpdateFee get_update_fee() {
                number ret = bindings.CommitmentUpdate_get_update_fee(this.ptr);
                const ret_hu_conv: UpdateFee = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -58,6 +60,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public CommitmentSigned get_commitment_signed() {
                number ret = bindings.CommitmentUpdate_get_commitment_signed(this.ptr);
                const ret_hu_conv: CommitmentSigned = new CommitmentSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -69,6 +72,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static CommitmentUpdate constructor_new(UpdateAddHTLC[] update_add_htlcs_arg, UpdateFulfillHTLC[] update_fulfill_htlcs_arg, UpdateFailHTLC[] update_fail_htlcs_arg, UpdateFailMalformedHTLC[] update_fail_malformed_htlcs_arg, UpdateFee update_fee_arg, CommitmentSigned commitment_signed_arg) {
                number ret = bindings.CommitmentUpdate_new((number[])Arrays.stream(update_add_htlcs_arg).map(arr_conv_15 -> arr_conv_15 == null ? 0 : arr_conv_15.ptr & ~1).toArray(), (number[])Arrays.stream(update_fulfill_htlcs_arg).map(arr_conv_19 -> arr_conv_19 == null ? 0 : arr_conv_19.ptr & ~1).toArray(), (number[])Arrays.stream(update_fail_htlcs_arg).map(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray(), (number[])Arrays.stream(update_fail_malformed_htlcs_arg).map(arr_conv_25 -> arr_conv_25 == null ? 0 : arr_conv_25.ptr & ~1).toArray(), update_fee_arg == null ? 0 : update_fee_arg.ptr & ~1, commitment_signed_arg == null ? 0 : commitment_signed_arg.ptr & ~1);
                const ret_hu_conv: CommitmentUpdate = new CommitmentUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                /* TODO 2 UpdateAddHTLC  */;
                /* TODO 2 UpdateFulfillHTLC  */;
                /* TODO 2 UpdateFailHTLC  */;
index 55dcf04d2daf117a3536192dbab9d87343c28818..de6a67b8318b215bb6ad705c68d1d734297cb6c0 100644 (file)
@@ -21,12 +21,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public CounterpartyChannelTransactionParameters clone() {
                number ret = bindings.CounterpartyChannelTransactionParameters_clone(this.ptr);
                const ret_hu_conv: CounterpartyChannelTransactionParameters = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys get_pubkeys() {
                number ret = bindings.CounterpartyChannelTransactionParameters_get_pubkeys(this.ptr);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -47,6 +49,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static CounterpartyChannelTransactionParameters constructor_new(ChannelPublicKeys pubkeys_arg, number selected_contest_delay_arg) {
                number ret = bindings.CounterpartyChannelTransactionParameters_new(pubkeys_arg == null ? 0 : pubkeys_arg.ptr & ~1, selected_contest_delay_arg);
                const ret_hu_conv: CounterpartyChannelTransactionParameters = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(pubkeys_arg);
                return ret_hu_conv;
        }
@@ -59,6 +62,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static CounterpartyChannelTransactionParameters constructor_read(Uint8Array ser) {
                number ret = bindings.CounterpartyChannelTransactionParameters_read(ser);
                const ret_hu_conv: CounterpartyChannelTransactionParameters = new CounterpartyChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 7e1183a18e2994921491b5cb05db62be3dde56a7..a08c831a6c1edbbf3459496b74900005c24721ad 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public DataLossProtect clone() {
                number ret = bindings.DataLossProtect_clone(this.ptr);
                const ret_hu_conv: DataLossProtect = new DataLossProtect(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static DataLossProtect constructor_new(Uint8Array your_last_per_commitment_secret_arg, Uint8Array my_current_per_commitment_point_arg) {
                number ret = bindings.DataLossProtect_new(your_last_per_commitment_secret_arg, my_current_per_commitment_point_arg);
                const ret_hu_conv: DataLossProtect = new DataLossProtect(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index fc3278b4bbdaa579d874b40a0aa539392efe238d..750447a81a56214117621b58bd538122eb05d75d 100644 (file)
@@ -18,4 +18,11 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.DecodeError_free(this.ptr);
                     }
                 }
+       public DecodeError clone() {
+               number ret = bindings.DecodeError_clone(this.ptr);
+               const ret_hu_conv: DecodeError = new DecodeError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
 }
index cc57f1ec020716edeadd36d6df48b400740b2fdc..77c53071f498dc81f45ea5840bffcff4c4518842 100644 (file)
@@ -21,12 +21,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelPublicKeys broadcaster_pubkeys() {
                number ret = bindings.DirectedChannelTransactionParameters_broadcaster_pubkeys(this.ptr);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys countersignatory_pubkeys() {
                number ret = bindings.DirectedChannelTransactionParameters_countersignatory_pubkeys(this.ptr);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -43,6 +45,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public OutPoint funding_outpoint() {
                number ret = bindings.DirectedChannelTransactionParameters_funding_outpoint(this.ptr);
                const ret_hu_conv: OutPoint = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 4f80064ec19aadd4a40449742e6bbdf615407dbf..5866e91333e19ba91f17515091c8a821c153e807 100644 (file)
@@ -18,6 +18,13 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.DirectionalChannelInfo_free(this.ptr);
                     }
                 }
+       public DirectionalChannelInfo clone() {
+               number ret = bindings.DirectionalChannelInfo_clone(this.ptr);
+               const ret_hu_conv: DirectionalChannelInfo = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public number get_last_update() {
                number ret = bindings.DirectionalChannelInfo_get_last_update(this.ptr);
                return ret;
@@ -57,6 +64,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public RoutingFees get_fees() {
                number ret = bindings.DirectionalChannelInfo_get_fees(this.ptr);
                const ret_hu_conv: RoutingFees = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -68,6 +76,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelUpdate get_last_update_message() {
                number ret = bindings.DirectionalChannelInfo_get_last_update_message(this.ptr);
                const ret_hu_conv: ChannelUpdate = new ChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -84,6 +93,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static DirectionalChannelInfo constructor_read(Uint8Array ser) {
                number ret = bindings.DirectionalChannelInfo_read(ser);
                const ret_hu_conv: DirectionalChannelInfo = new DirectionalChannelInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index cbdfa17e6801ccf9c7341b241583f730689e6814..fed9258c47fb9e4e2613d5193a27961617110ee4 100644 (file)
@@ -29,6 +29,7 @@ export class DisconnectPeer extends ErrorAction {
                super(null, ptr);
                const msg: number = obj.msg;
                const msg_hu_conv: ErrorMessage = new ErrorMessage(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -43,6 +44,7 @@ export class SendErrorMessage extends ErrorAction {
                super(null, ptr);
                const msg: number = obj.msg;
                const msg_hu_conv: ErrorMessage = new ErrorMessage(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
index 6551cc06a1696825afc3068239a10a17467b6a65..4ad554f5a5305dd9cd7114e882b769a287106579 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ErrorMessage clone() {
                number ret = bindings.ErrorMessage_clone(this.ptr);
                const ret_hu_conv: ErrorMessage = new ErrorMessage(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ErrorMessage constructor_new(Uint8Array channel_id_arg, Uint8Array data_arg) {
                number ret = bindings.ErrorMessage_new(channel_id_arg, data_arg);
                const ret_hu_conv: ErrorMessage = new ErrorMessage(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index fdf0a8c2194667ec56158eed71ce12a4f6b1340d..110456b099268f9eefaef08ffe4b6a232eace1ab 100644 (file)
@@ -55,6 +55,7 @@ export class FundingBroadcastSafe extends Event {
                super(null, ptr);
                const funding_txo: number = obj.funding_txo;
                const funding_txo_hu_conv: OutPoint = new OutPoint(null, funding_txo);
+                       funding_txo_hu_conv.ptrs_to.add(this);
                this.funding_txo = funding_txo_hu_conv;
                this.user_channel_id = obj.user_channel_id;
        }
index 8be1473c055adb792d2e45dc39c711935c00f6f5..118811fde7f08eec1562deb9f292b937690b2ecd 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public FundingCreated clone() {
                number ret = bindings.FundingCreated_clone(this.ptr);
                const ret_hu_conv: FundingCreated = new FundingCreated(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -63,6 +64,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static FundingCreated constructor_new(Uint8Array temporary_channel_id_arg, Uint8Array funding_txid_arg, number funding_output_index_arg, Uint8Array signature_arg) {
                number ret = bindings.FundingCreated_new(temporary_channel_id_arg, funding_txid_arg, funding_output_index_arg, signature_arg);
                const ret_hu_conv: FundingCreated = new FundingCreated(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -74,6 +76,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static FundingCreated constructor_read(Uint8Array ser) {
                number ret = bindings.FundingCreated_read(ser);
                const ret_hu_conv: FundingCreated = new FundingCreated(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 80725c1b6bd81749519d51dfbafb0c674d002198..b298b222e54da9ac1b911cae8adabd23d07a50bc 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public FundingLocked clone() {
                number ret = bindings.FundingLocked_clone(this.ptr);
                const ret_hu_conv: FundingLocked = new FundingLocked(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static FundingLocked constructor_new(Uint8Array channel_id_arg, Uint8Array next_per_commitment_point_arg) {
                number ret = bindings.FundingLocked_new(channel_id_arg, next_per_commitment_point_arg);
                const ret_hu_conv: FundingLocked = new FundingLocked(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -56,6 +58,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static FundingLocked constructor_read(Uint8Array ser) {
                number ret = bindings.FundingLocked_read(ser);
                const ret_hu_conv: FundingLocked = new FundingLocked(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 3a1a0731755f00c1812cacab3a67bc510a83ae6d..76fc8ad29620d3d44ee6889fbe40fad4be2ba0a9 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public FundingSigned clone() {
                number ret = bindings.FundingSigned_clone(this.ptr);
                const ret_hu_conv: FundingSigned = new FundingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static FundingSigned constructor_new(Uint8Array channel_id_arg, Uint8Array signature_arg) {
                number ret = bindings.FundingSigned_new(channel_id_arg, signature_arg);
                const ret_hu_conv: FundingSigned = new FundingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -56,6 +58,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static FundingSigned constructor_read(Uint8Array ser) {
                number ret = bindings.FundingSigned_read(ser);
                const ret_hu_conv: FundingSigned = new FundingSigned(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 012af416c891c049435da61406ff8ff8d7a93530..8b2e3320594928a1aa4cd9d91034e7859a26cb27 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public GossipTimestampFilter clone() {
                number ret = bindings.GossipTimestampFilter_clone(this.ptr);
                const ret_hu_conv: GossipTimestampFilter = new GossipTimestampFilter(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,6 +55,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static GossipTimestampFilter constructor_new(Uint8Array chain_hash_arg, number first_timestamp_arg, number timestamp_range_arg) {
                number ret = bindings.GossipTimestampFilter_new(chain_hash_arg, first_timestamp_arg, timestamp_range_arg);
                const ret_hu_conv: GossipTimestampFilter = new GossipTimestampFilter(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 2d33a1385654091867eb3b844375709eb0458525..5f76a0df4ef156d0a33c33360fa067e27b950776 100644 (file)
@@ -29,6 +29,7 @@ export class ChannelUpdateMessage extends HTLCFailChannelUpdate {
                super(null, ptr);
                const msg: number = obj.msg;
                const msg_hu_conv: ChannelUpdate = new ChannelUpdate(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
index 938d16f84f2bbebb33dacf480f0b38d00b6302c1..545685e5aaf153ee4a370aa2731e12b230a3a25e 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public HTLCOutputInCommitment clone() {
                number ret = bindings.HTLCOutputInCommitment_clone(this.ptr);
                const ret_hu_conv: HTLCOutputInCommitment = new HTLCOutputInCommitment(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -68,6 +69,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static HTLCOutputInCommitment constructor_read(Uint8Array ser) {
                number ret = bindings.HTLCOutputInCommitment_read(ser);
                const ret_hu_conv: HTLCOutputInCommitment = new HTLCOutputInCommitment(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 52dd102ee00be0cbefd4f284162298633a226504..075dc2db1e94d13708282a58907ef2a7883245a0 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public HTLCUpdate clone() {
                number ret = bindings.HTLCUpdate_clone(this.ptr);
                const ret_hu_conv: HTLCUpdate = new HTLCUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,6 +33,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static HTLCUpdate constructor_read(Uint8Array ser) {
                number ret = bindings.HTLCUpdate_read(ser);
                const ret_hu_conv: HTLCUpdate = new HTLCUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index ad485a4c48f0dd4312d7c35c9cfd08d62c49383b..4014c3a2a54fa1e4e12e88614266c443458da44a 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public HolderCommitmentTransaction clone() {
                number ret = bindings.HolderCommitmentTransaction_clone(this.ptr);
                const ret_hu_conv: HolderCommitmentTransaction = new HolderCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,12 +46,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static HolderCommitmentTransaction constructor_read(Uint8Array ser) {
                number ret = bindings.HolderCommitmentTransaction_read(ser);
                const ret_hu_conv: HolderCommitmentTransaction = new HolderCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public static HolderCommitmentTransaction constructor_new(CommitmentTransaction commitment_tx, Uint8Array counterparty_sig, Uint8Array[] counterparty_htlc_sigs, Uint8Array holder_funding_key, Uint8Array counterparty_funding_key) {
                number ret = bindings.HolderCommitmentTransaction_new(commitment_tx == null ? 0 : commitment_tx.ptr & ~1, counterparty_sig, counterparty_htlc_sigs, holder_funding_key, counterparty_funding_key);
                const ret_hu_conv: HolderCommitmentTransaction = new HolderCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(commitment_tx);
                return ret_hu_conv;
        }
index 4e4e375f28f63bacd47dfb8b23d9751753ee508e..11321cb6cee1f40479b8afc46909119af6f593fa 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public InMemoryChannelKeys clone() {
                number ret = bindings.InMemoryChannelKeys_clone(this.ptr);
                const ret_hu_conv: InMemoryChannelKeys = new InMemoryChannelKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -81,12 +82,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static InMemoryChannelKeys constructor_new(Uint8Array funding_key, Uint8Array revocation_base_key, Uint8Array payment_key, Uint8Array delayed_payment_base_key, Uint8Array htlc_base_key, Uint8Array commitment_seed, number channel_value_satoshis, TwoTuple<Number, Number> key_derivation_params) {
                number ret = bindings.InMemoryChannelKeys_new(funding_key, revocation_base_key, payment_key, delayed_payment_base_key, htlc_base_key, commitment_seed, channel_value_satoshis, bindings.C2Tuple_u64u64Z_new(key_derivation_params.a, key_derivation_params.b));
                const ret_hu_conv: InMemoryChannelKeys = new InMemoryChannelKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public ChannelPublicKeys counterparty_pubkeys() {
                number ret = bindings.InMemoryChannelKeys_counterparty_pubkeys(this.ptr);
                const ret_hu_conv: ChannelPublicKeys = new ChannelPublicKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -108,12 +111,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public OutPoint funding_outpoint() {
                number ret = bindings.InMemoryChannelKeys_funding_outpoint(this.ptr);
                const ret_hu_conv: OutPoint = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelTransactionParameters get_channel_parameters() {
                number ret = bindings.InMemoryChannelKeys_get_channel_parameters(this.ptr);
                const ret_hu_conv: ChannelTransactionParameters = new ChannelTransactionParameters(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 69918e57301a9e91e24165892477b91c4dbbe0a2..f396b0bf80b8ef89cf98c6cde28cfbed4653fcd1 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public Init clone() {
                number ret = bindings.Init_clone(this.ptr);
                const ret_hu_conv: Init = new Init(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 6eefcc50d726aa3276cedb53cbce13963298a68e..7627c0e399847f5ed75d2ce87b6ca149f7aefee5 100644 (file)
@@ -21,12 +21,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static KeysManager constructor_new(Uint8Array seed, LDKNetwork network, number starting_time_secs, number starting_time_nanos) {
                number ret = bindings.KeysManager_new(seed, network, starting_time_secs, starting_time_nanos);
                const ret_hu_conv: KeysManager = new KeysManager(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
        public InMemoryChannelKeys derive_channel_keys(number channel_value_satoshis, number params_1, number params_2) {
                number ret = bindings.KeysManager_derive_channel_keys(this.ptr, channel_value_satoshis, params_1, params_2);
                const ret_hu_conv: InMemoryChannelKeys = new InMemoryChannelKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 57bf1809821d3c586af265b2dae14a82e96baa60..74b3a586df3cdca31fab736ea032b03ed6660460 100644 (file)
@@ -18,6 +18,13 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.LightningError_free(this.ptr);
                     }
                 }
+       public LightningError clone() {
+               number ret = bindings.LightningError_clone(this.ptr);
+               const ret_hu_conv: LightningError = new LightningError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public String get_err() {
                String ret = bindings.LightningError_get_err(this.ptr);
                return ret;
@@ -41,6 +48,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static LightningError constructor_new(Uint8Array err_arg, ErrorAction action_arg) {
                number ret = bindings.LightningError_new(err_arg, action_arg.ptr);
                const ret_hu_conv: LightningError = new LightningError(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 7928dc0e9c63cb0bfdb7ad21898b77bcd954ece1..26fe800a00f17a28782f35b41953837ef8e33141 100644 (file)
@@ -20,6 +20,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public NetworkGraph graph() {
                number ret = bindings.LockedNetworkGraph_graph(this.ptr);
                const ret_hu_conv: NetworkGraph = new NetworkGraph(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 3f69fec31d7d655d4e99e5785be6bfcaf143f222..b356c76b2a3eabda642fc238f0d56277df51e64c 100644 (file)
@@ -45,6 +45,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static MessageHandler constructor_new(ChannelMessageHandler chan_handler_arg, RoutingMessageHandler route_handler_arg) {
                number ret = bindings.MessageHandler_new(chan_handler_arg == null ? 0 : chan_handler_arg.ptr, route_handler_arg == null ? 0 : route_handler_arg.ptr);
                const ret_hu_conv: MessageHandler = new MessageHandler(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chan_handler_arg);
                ret_hu_conv.ptrs_to.add(route_handler_arg);
                return ret_hu_conv;
index cab57130e1b41913d1f5a4c24c3a06bc9af7199c..7c8ebdfaf782cf8f2fb0cf53156389586c35cac0 100644 (file)
@@ -76,6 +76,7 @@ export class SendAcceptChannel extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: AcceptChannel = new AcceptChannel(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -87,6 +88,7 @@ export class SendOpenChannel extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: OpenChannel = new OpenChannel(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -98,6 +100,7 @@ export class SendFundingCreated extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: FundingCreated = new FundingCreated(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -109,6 +112,7 @@ export class SendFundingSigned extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: FundingSigned = new FundingSigned(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -120,6 +124,7 @@ export class SendFundingLocked extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: FundingLocked = new FundingLocked(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -131,6 +136,7 @@ export class SendAnnouncementSignatures extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: AnnouncementSignatures = new AnnouncementSignatures(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -142,6 +148,7 @@ export class UpdateHTLCs extends MessageSendEvent {
                this.node_id = obj.node_id;
                const updates: number = obj.updates;
                const updates_hu_conv: CommitmentUpdate = new CommitmentUpdate(null, updates);
+                       updates_hu_conv.ptrs_to.add(this);
                this.updates = updates_hu_conv;
        }
 }
@@ -153,6 +160,7 @@ export class SendRevokeAndACK extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: RevokeAndACK = new RevokeAndACK(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -164,6 +172,7 @@ export class SendClosingSigned extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: ClosingSigned = new ClosingSigned(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -175,6 +184,7 @@ export class SendShutdown extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: Shutdown = new Shutdown(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -186,6 +196,7 @@ export class SendChannelReestablish extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: ChannelReestablish = new ChannelReestablish(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -196,9 +207,11 @@ export class BroadcastChannelAnnouncement extends MessageSendEvent {
                super(null, ptr);
                const msg: number = obj.msg;
                const msg_hu_conv: ChannelAnnouncement = new ChannelAnnouncement(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
                const update_msg: number = obj.update_msg;
                const update_msg_hu_conv: ChannelUpdate = new ChannelUpdate(null, update_msg);
+                       update_msg_hu_conv.ptrs_to.add(this);
                this.update_msg = update_msg_hu_conv;
        }
 }
@@ -208,6 +221,7 @@ export class BroadcastNodeAnnouncement extends MessageSendEvent {
                super(null, ptr);
                const msg: number = obj.msg;
                const msg_hu_conv: NodeAnnouncement = new NodeAnnouncement(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -217,6 +231,7 @@ export class BroadcastChannelUpdate extends MessageSendEvent {
                super(null, ptr);
                const msg: number = obj.msg;
                const msg_hu_conv: ChannelUpdate = new ChannelUpdate(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -250,6 +265,7 @@ export class SendChannelRangeQuery extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: QueryChannelRange = new QueryChannelRange(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
@@ -261,6 +277,7 @@ export class SendShortIdsQuery extends MessageSendEvent {
                this.node_id = obj.node_id;
                const msg: number = obj.msg;
                const msg_hu_conv: QueryShortChannelIds = new QueryShortChannelIds(null, msg);
+                       msg_hu_conv.ptrs_to.add(this);
                this.msg = msg_hu_conv;
        }
 }
index 2f65462810ec836f990884a8fdd7c844f68d486b..b24e66024fc43129f267d4bae029f105da04158f 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public MonitorEvent clone() {
                number ret = bindings.MonitorEvent_clone(this.ptr);
                const ret_hu_conv: MonitorEvent = new MonitorEvent(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 8d37952161b8c0d8b12cdb541e3e50f8da39c4c6..1c457a8cf3ff35ae85c8526de010ec1a82a5080f 100644 (file)
@@ -18,4 +18,11 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.MonitorUpdateError_free(this.ptr);
                     }
                 }
+       public MonitorUpdateError clone() {
+               number ret = bindings.MonitorUpdateError_clone(this.ptr);
+               const ret_hu_conv: MonitorUpdateError = new MonitorUpdateError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
 }
index 082de30a9e2a3233f6bba8ce5d6fe5a9a2f21484..5b7cbe89797b17f38f5278959ed27d25da8e55e9 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static NetGraphMsgHandler constructor_new(Uint8Array genesis_hash, Access chain_access, Logger logger) {
                number ret = bindings.NetGraphMsgHandler_new(genesis_hash, chain_access == null ? 0 : chain_access.ptr, logger == null ? 0 : logger.ptr);
                const ret_hu_conv: NetGraphMsgHandler = new NetGraphMsgHandler(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chain_access);
                ret_hu_conv.ptrs_to.add(logger);
                return ret_hu_conv;
@@ -29,6 +30,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static NetGraphMsgHandler constructor_from_net_graph(Access chain_access, Logger logger, Uint8Array network_graph_genesis_hash) {
                number ret = bindings.NetGraphMsgHandler_from_net_graph(chain_access == null ? 0 : chain_access.ptr, logger == null ? 0 : logger.ptr, bindings.NetworkGraph_new(network_graph_genesis_hash));
                const ret_hu_conv: NetGraphMsgHandler = new NetGraphMsgHandler(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(chain_access);
                ret_hu_conv.ptrs_to.add(logger);
                return ret_hu_conv;
@@ -37,6 +39,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public LockedNetworkGraph read_locked_graph() {
                number ret = bindings.NetGraphMsgHandler_read_locked_graph(this.ptr);
                const ret_hu_conv: LockedNetworkGraph = new LockedNetworkGraph(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 9729f3317b69ad6f2fd66c741746625605a9aeee..7f5908816239a63c92d06d93894115133e01a5a9 100644 (file)
@@ -32,6 +32,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static NetworkGraph constructor_new(Uint8Array genesis_hash) {
                number ret = bindings.NetworkGraph_new(genesis_hash);
                const ret_hu_conv: NetworkGraph = new NetworkGraph(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 952f2bdfaf6ce2c68452a199d2378b115cff60ad..38520e1a781ed57b3d44cb98a94500ff328533c6 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public NodeAnnouncement clone() {
                number ret = bindings.NodeAnnouncement_clone(this.ptr);
                const ret_hu_conv: NodeAnnouncement = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -36,6 +37,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UnsignedNodeAnnouncement get_contents() {
                number ret = bindings.NodeAnnouncement_get_contents(this.ptr);
                const ret_hu_conv: UnsignedNodeAnnouncement = new UnsignedNodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -47,6 +49,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static NodeAnnouncement constructor_new(Uint8Array signature_arg, UnsignedNodeAnnouncement contents_arg) {
                number ret = bindings.NodeAnnouncement_new(signature_arg, contents_arg == null ? 0 : contents_arg.ptr & ~1);
                const ret_hu_conv: NodeAnnouncement = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(contents_arg);
                return ret_hu_conv;
        }
@@ -59,6 +62,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static NodeAnnouncement constructor_read(Uint8Array ser) {
                number ret = bindings.NodeAnnouncement_read(ser);
                const ret_hu_conv: NodeAnnouncement = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 587f098f9e5d115bda6e0462553682c635b9a83d..2fa86c39952535472a92783954cb99ef765cb2e8 100644 (file)
@@ -18,15 +18,31 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.NodeAnnouncementInfo_free(this.ptr);
                     }
                 }
+       public NodeAnnouncementInfo clone() {
+               number ret = bindings.NodeAnnouncementInfo_clone(this.ptr);
+               const ret_hu_conv: NodeAnnouncementInfo = new NodeAnnouncementInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public NodeFeatures get_features() {
                number ret = bindings.NodeAnnouncementInfo_get_features(this.ptr);
                const ret_hu_conv: NodeFeatures = new NodeFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(NodeFeatures val) {
                bindings.NodeAnnouncementInfo_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public number get_last_update() {
@@ -64,6 +80,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public NodeAnnouncement get_announcement_message() {
                number ret = bindings.NodeAnnouncementInfo_get_announcement_message(this.ptr);
                const ret_hu_conv: NodeAnnouncement = new NodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -75,7 +92,16 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static NodeAnnouncementInfo constructor_new(NodeFeatures features_arg, number last_update_arg, Uint8Array rgb_arg, Uint8Array alias_arg, NetAddress[] addresses_arg, NodeAnnouncement announcement_message_arg) {
                number ret = bindings.NodeAnnouncementInfo_new(features_arg == null ? 0 : features_arg.ptr & ~1, last_update_arg, rgb_arg, alias_arg, (number[])Arrays.stream(addresses_arg).map(arr_conv_12 -> arr_conv_12.ptr).toArray(), announcement_message_arg == null ? 0 : announcement_message_arg.ptr & ~1);
                const ret_hu_conv: NodeAnnouncementInfo = new NodeAnnouncementInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(features_arg);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid ret_hu_conv being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after ret_hu_conv call, features_arg is reset to null and is now a dummy object.
+               features_arg.ptr = 0;
                /* TODO 2 NetAddress  */;
                ret_hu_conv.ptrs_to.add(announcement_message_arg);
                return ret_hu_conv;
index dd830a6dee753c835f7f1297417ca9405ebd5962..0fd77a145007b4aae145fe896540263d67c9d009 100644 (file)
@@ -18,6 +18,13 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.NodeInfo_free(this.ptr);
                     }
                 }
+       public NodeInfo clone() {
+               number ret = bindings.NodeInfo_clone(this.ptr);
+               const ret_hu_conv: NodeInfo = new NodeInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public void set_channels(number[] val) {
                bindings.NodeInfo_set_channels(this.ptr, val);
        }
@@ -25,6 +32,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public RoutingFees get_lowest_inbound_channel_fees() {
                number ret = bindings.NodeInfo_get_lowest_inbound_channel_fees(this.ptr);
                const ret_hu_conv: RoutingFees = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -36,20 +44,21 @@ import * as bindings from '../bindings' // TODO: figure out location
        public NodeAnnouncementInfo get_announcement_info() {
                number ret = bindings.NodeInfo_get_announcement_info(this.ptr);
                const ret_hu_conv: NodeAnnouncementInfo = new NodeAnnouncementInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
-       public void set_announcement_info(NodeFeatures val_features_arg, number val_last_update_arg, Uint8Array val_rgb_arg, Uint8Array val_alias_arg, NetAddress[] val_addresses_arg, NodeAnnouncement val_announcement_message_arg) {
-               bindings.NodeInfo_set_announcement_info(this.ptr, bindings.NodeAnnouncementInfo_new(val_features_arg == null ? 0 : val_features_arg.ptr & ~1, val_last_update_arg, val_rgb_arg, val_alias_arg, (number[])Arrays.stream(val_addresses_arg).map(arr_conv_12 -> arr_conv_12.ptr).toArray(), val_announcement_message_arg == null ? 0 : val_announcement_message_arg.ptr & ~1));
+       public void set_announcement_info(NodeAnnouncementInfo val) {
+               bindings.NodeInfo_set_announcement_info(this.ptr, val == null ? 0 : val.ptr & ~1);
+               this.ptrs_to.add(val);
        }
 
-       public static NodeInfo constructor_new(number[] channels_arg, RoutingFees lowest_inbound_channel_fees_arg, NodeFeatures announcement_info_arg_features_arg, number announcement_info_arg_last_update_arg, Uint8Array announcement_info_arg_rgb_arg, Uint8Array announcement_info_arg_alias_arg, NetAddress[] announcement_info_arg_addresses_arg, NodeAnnouncement announcement_info_arg_announcement_message_arg) {
-               number ret = bindings.NodeInfo_new(channels_arg, lowest_inbound_channel_fees_arg == null ? 0 : lowest_inbound_channel_fees_arg.ptr & ~1, bindings.NodeAnnouncementInfo_new(announcement_info_arg_features_arg == null ? 0 : announcement_info_arg_features_arg.ptr & ~1, announcement_info_arg_last_update_arg, announcement_info_arg_rgb_arg, announcement_info_arg_alias_arg, (number[])Arrays.stream(announcement_info_arg_addresses_arg).map(arr_conv_12 -> arr_conv_12.ptr).toArray(), announcement_info_arg_announcement_message_arg == null ? 0 : announcement_info_arg_announcement_message_arg.ptr & ~1));
+       public static NodeInfo constructor_new(number[] channels_arg, RoutingFees lowest_inbound_channel_fees_arg, NodeAnnouncementInfo announcement_info_arg) {
+               number ret = bindings.NodeInfo_new(channels_arg, lowest_inbound_channel_fees_arg == null ? 0 : lowest_inbound_channel_fees_arg.ptr & ~1, announcement_info_arg == null ? 0 : announcement_info_arg.ptr & ~1);
                const ret_hu_conv: NodeInfo = new NodeInfo(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(lowest_inbound_channel_fees_arg);
-               ret_hu_conv.ptrs_to.add(announcement_info_arg_features_arg);
-               /* TODO 2 NetAddress  */;
-               ret_hu_conv.ptrs_to.add(announcement_info_arg_announcement_message_arg);
+               ret_hu_conv.ptrs_to.add(announcement_info_arg);
                return ret_hu_conv;
        }
 
index 6c6f0c14ccf744b92cbcd714e0b66f7d76ae3baf..62485309903da3d06760129a3330def31e62cae5 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public OpenChannel clone() {
                number ret = bindings.OpenChannel_clone(this.ptr);
                const ret_hu_conv: OpenChannel = new OpenChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -194,6 +195,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static OpenChannel constructor_read(Uint8Array ser) {
                number ret = bindings.OpenChannel_read(ser);
                const ret_hu_conv: OpenChannel = new OpenChannel(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 1ceb657f476c0ff29cb440501094351df4c546af..decbf7b744897d63ce403fff6ea7fbb392b066e8 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public OutPoint clone() {
                number ret = bindings.OutPoint_clone(this.ptr);
                const ret_hu_conv: OutPoint = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static OutPoint constructor_new(Uint8Array txid_arg, number index_arg) {
                number ret = bindings.OutPoint_new(txid_arg, index_arg);
                const ret_hu_conv: OutPoint = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -61,6 +63,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static OutPoint constructor_read(Uint8Array ser) {
                number ret = bindings.OutPoint_read(ser);
                const ret_hu_conv: OutPoint = new OutPoint(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 04ea895d02b01c8b0c10a010dc34a16cae1604a5..32bef844f5468cd54fae47e522e27a73771382e7 100644 (file)
@@ -18,4 +18,11 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.PaymentSendFailure_free(this.ptr);
                     }
                 }
+       public PaymentSendFailure clone() {
+               number ret = bindings.PaymentSendFailure_clone(this.ptr);
+               const ret_hu_conv: PaymentSendFailure = new PaymentSendFailure(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
 }
index f0b82ef81652e2118862c75a673dfc0d33688a3b..2bae7bb77170e6aa96cc347a18c3a663bfbcdf08 100644 (file)
@@ -18,6 +18,13 @@ import * as bindings from '../bindings' // TODO: figure out location
                         bindings.PeerHandleError_free(this.ptr);
                     }
                 }
+       public PeerHandleError clone() {
+               number ret = bindings.PeerHandleError_clone(this.ptr);
+               const ret_hu_conv: PeerHandleError = new PeerHandleError(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
+               return ret_hu_conv;
+       }
+
        public boolean get_no_connection_possible() {
                boolean ret = bindings.PeerHandleError_get_no_connection_possible(this.ptr);
                return ret;
@@ -30,6 +37,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static PeerHandleError constructor_new(boolean no_connection_possible_arg) {
                number ret = bindings.PeerHandleError_new(no_connection_possible_arg);
                const ret_hu_conv: PeerHandleError = new PeerHandleError(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 3fa85fc58392ee7552047327ccf3653c6e725bbf..165440cf0f4564d635fa8d9433715883e36c3d92 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static PeerManager constructor_new(ChannelMessageHandler message_handler_chan_handler_arg, RoutingMessageHandler message_handler_route_handler_arg, Uint8Array our_node_secret, Uint8Array ephemeral_random_data, Logger logger) {
                number ret = bindings.PeerManager_new(bindings.MessageHandler_new(message_handler_chan_handler_arg == null ? 0 : message_handler_chan_handler_arg.ptr, message_handler_route_handler_arg == null ? 0 : message_handler_route_handler_arg.ptr), our_node_secret, ephemeral_random_data, logger == null ? 0 : logger.ptr);
                const ret_hu_conv: PeerManager = new PeerManager(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(message_handler_chan_handler_arg);
                ret_hu_conv.ptrs_to.add(message_handler_route_handler_arg);
                ret_hu_conv.ptrs_to.add(logger);
index 16ebedc5fc1e460558340bb3c793a3210951a837..dbfc8aeb284ff549bcf8909a73abfb7e6aa86eb0 100644 (file)
@@ -34,6 +34,7 @@ import * as bindings from '../bindings' // TODO: figure out location
                         // todo: in-line interface filling
                         persist_new_channel (id: number, data: number): number {
                                                        const id_hu_conv: OutPoint = new OutPoint(null, id);
+                               id_hu_conv.ptrs_to.add(this);
                                                        const data_hu_conv: ChannelMonitor = new ChannelMonitor(null, data);
                                                        Result_NoneChannelMonitorUpdateErrZ ret = arg.persist_new_channel(id_hu_conv, data_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
@@ -42,6 +43,7 @@ import * as bindings from '../bindings' // TODO: figure out location
 
                                                update_persisted_channel (id: number, update: number, data: number): number {
                                                        const id_hu_conv: OutPoint = new OutPoint(null, id);
+                               id_hu_conv.ptrs_to.add(this);
                                                        const update_hu_conv: ChannelMonitorUpdate = new ChannelMonitorUpdate(null, update);
                                                        const data_hu_conv: ChannelMonitor = new ChannelMonitor(null, data);
                                                        Result_NoneChannelMonitorUpdateErrZ ret = arg.update_persisted_channel(id_hu_conv, update_hu_conv, data_hu_conv);
index d915f29e4612c8e74f47817fa7598902b3b7706d..2cc1a913f6ea09dec8fd5849b68a3e35dc76f55c 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public Ping clone() {
                number ret = bindings.Ping_clone(this.ptr);
                const ret_hu_conv: Ping = new Ping(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static Ping constructor_new(number ponglen_arg, number byteslen_arg) {
                number ret = bindings.Ping_new(ponglen_arg, byteslen_arg);
                const ret_hu_conv: Ping = new Ping(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 3305de2acdb58a8b1ef9bacb9de58f04a9e930a3..63379926273f973d2bfc6cfb346a819abee8c5c0 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public Pong clone() {
                number ret = bindings.Pong_clone(this.ptr);
                const ret_hu_conv: Pong = new Pong(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -36,6 +37,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static Pong constructor_new(number byteslen_arg) {
                number ret = bindings.Pong_new(byteslen_arg);
                const ret_hu_conv: Pong = new Pong(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 8b7cbea72757c9a5cc573f2183c3b3dadaf8503a..8b26591c2069fa455071f9bad1850aed88350d36 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public QueryChannelRange clone() {
                number ret = bindings.QueryChannelRange_clone(this.ptr);
                const ret_hu_conv: QueryChannelRange = new QueryChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,6 +55,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static QueryChannelRange constructor_new(Uint8Array chain_hash_arg, number first_blocknum_arg, number number_of_blocks_arg) {
                number ret = bindings.QueryChannelRange_new(chain_hash_arg, first_blocknum_arg, number_of_blocks_arg);
                const ret_hu_conv: QueryChannelRange = new QueryChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 3c2efc5bc07d51d8688f6aeed6bcf79aa8b9bea0..58643a72d147a5cbe96f93300f88fc9f211a971b 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public QueryShortChannelIds clone() {
                number ret = bindings.QueryShortChannelIds_clone(this.ptr);
                const ret_hu_conv: QueryShortChannelIds = new QueryShortChannelIds(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -40,6 +41,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static QueryShortChannelIds constructor_new(Uint8Array chain_hash_arg, number[] short_channel_ids_arg) {
                number ret = bindings.QueryShortChannelIds_new(chain_hash_arg, short_channel_ids_arg);
                const ret_hu_conv: QueryShortChannelIds = new QueryShortChannelIds(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 21a6e01ad4d2dced02a9ecf494d8072cfe038181..3d2ef1784797bcfc9ed88c6d9946f56bb3272803 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ReplyChannelRange clone() {
                number ret = bindings.ReplyChannelRange_clone(this.ptr);
                const ret_hu_conv: ReplyChannelRange = new ReplyChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -67,6 +68,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ReplyChannelRange constructor_new(Uint8Array chain_hash_arg, number first_blocknum_arg, number number_of_blocks_arg, boolean full_information_arg, number[] short_channel_ids_arg) {
                number ret = bindings.ReplyChannelRange_new(chain_hash_arg, first_blocknum_arg, number_of_blocks_arg, full_information_arg, short_channel_ids_arg);
                const ret_hu_conv: ReplyChannelRange = new ReplyChannelRange(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 9ab50feada61dfd15d7bee6ea4ceb037a21e0971..6b2a21016f83168f97ea214e4195c145f802f98c 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ReplyShortChannelIdsEnd clone() {
                number ret = bindings.ReplyShortChannelIdsEnd_clone(this.ptr);
                const ret_hu_conv: ReplyShortChannelIdsEnd = new ReplyShortChannelIdsEnd(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static ReplyShortChannelIdsEnd constructor_new(Uint8Array chain_hash_arg, boolean full_information_arg) {
                number ret = bindings.ReplyShortChannelIdsEnd_new(chain_hash_arg, full_information_arg);
                const ret_hu_conv: ReplyShortChannelIdsEnd = new ReplyShortChannelIdsEnd(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index e9feca6e0b8cc36cb834a716df15c1335fc42f3c..81d95ece646131bf4eff9cbf498c1ed3df862a0e 100644 (file)
@@ -22,12 +22,22 @@ public class Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ extends CommonB
                        number res = bindings.LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_ok(ptr);
                        Uint8Array res_a = bindings.LDKC2Tuple_BlockHashChannelManagerZ_get_a(res);
                        number res_b = bindings.LDKC2Tuple_BlockHashChannelManagerZ_get_b(res);
-                       const res_b_hu_conv: ChannelManager = new ChannelManager(null, res_b);;
+                       const res_b_hu_conv: ChannelManager = new ChannelManager(null, res_b);
+                       res_b_hu_conv.ptrs_to.add(this);;
                        TwoTuple<Uint8Array, ChannelManager> res_conv = new TwoTuple<Uint8Array, ChannelManager>(res_a, res_b_hu_conv);
                        this.res = res_conv;
                }
                public Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_OK(TwoTuple<Uint8Array, ChannelManager> res) {
-                       this(null, bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelManagerZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1/*XXX: this.ptrs_to.add(res_b)*/)));
+                       this(null, bindings.CResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelManagerZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1)));
+                       this.ptrs_to.add(res.b);
+                       // Due to rust's strict-ownership memory model, in some cases we need to "move"
+                       // an object to pass exclusive ownership to the function being called.
+                       // In most cases, we avoid this being visible in GC'd languages by cloning the object
+                       // at the FFI layer, creating a new object which Rust can claim ownership of
+                       // However, in some cases (eg here), there is no way to clone an object, and thus
+                       // we actually have to pass full ownership to Rust.
+                       // Thus, after this call, res.b is reset to null and is now a dummy object.
+                       res.b.ptr = 0;
                }
        }
 
@@ -37,6 +47,7 @@ public class Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ extends CommonB
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_Err(DecodeError err) {
index f5e3a80eb5fa161bfe0f8993a848c0bbc6374241..5b2d6c20ce77faf5a071e9a3c859369332c2ad02 100644 (file)
@@ -22,12 +22,14 @@ public class Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ extends CommonB
                        number res = bindings.LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_ok(ptr);
                        Uint8Array res_a = bindings.LDKC2Tuple_BlockHashChannelMonitorZ_get_a(res);
                        number res_b = bindings.LDKC2Tuple_BlockHashChannelMonitorZ_get_b(res);
-                       const res_b_hu_conv: ChannelMonitor = new ChannelMonitor(null, res_b);;
+                       const res_b_hu_conv: ChannelMonitor = new ChannelMonitor(null, res_b);
+                       res_b_hu_conv.ptrs_to.add(this);;
                        TwoTuple<Uint8Array, ChannelMonitor> res_conv = new TwoTuple<Uint8Array, ChannelMonitor>(res_a, res_b_hu_conv);
                        this.res = res_conv;
                }
                public Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK(TwoTuple<Uint8Array, ChannelMonitor> res) {
-                       this(null, bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelMonitorZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1/*XXX: this.ptrs_to.add(res_b)*/)));
+                       this(null, bindings.CResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_ok(bindings.C2Tuple_BlockHashChannelMonitorZ_new(res.a, res.b == null ? 0 : res.b.ptr & ~1)));
+                       this.ptrs_to.add(res.b);
                }
        }
 
@@ -37,6 +39,7 @@ public class Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ extends CommonB
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_Err(DecodeError err) {
index 950cd10d561001173655f414b32e45a9502b6428..efef7e62d1495b4aca0fae62a0945951ae7fbabf 100644 (file)
@@ -34,6 +34,7 @@ public class Result_CResult_NetAddressu8ZDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_CResult_NetAddressu8ZDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_CResult_NetAddressu8ZDecodeErrorZ_Err(DecodeError err) {
index daa927a5966aa7793231a3e66a81cb4ddf9cab48..2b318343456cb7cb3c9adccdd05c0805a1fb715e 100644 (file)
@@ -32,6 +32,7 @@ public class Result_CVec_u8ZPeerHandleErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_CVec_u8ZPeerHandleErrorZ_get_err(ptr);
                        const err_hu_conv: PeerHandleError = new PeerHandleError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_CVec_u8ZPeerHandleErrorZ_Err(PeerHandleError err) {
index 51a192cfb38d813d29c16a1edd357670e16633ee..c8e60414f3ff2dd139ac319b2e3d83aaf5742dad 100644 (file)
@@ -36,6 +36,7 @@ public class Result_ChanKeySignerDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_ChanKeySignerDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ChanKeySignerDecodeErrorZ_Err(DecodeError err) {
index bb164245f7f5fb89b0d7582a037a77750c3a087c..28bba160e3c415f2bf8fd8c21ab30381ecb17db1 100644 (file)
@@ -21,6 +21,7 @@ public class Result_ChannelMonitorUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_ChannelMonitorUpdateDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: ChannelMonitorUpdate = new ChannelMonitorUpdate(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ChannelMonitorUpdateDecodeErrorZ_OK(ChannelMonitorUpdate res) {
@@ -35,6 +36,7 @@ public class Result_ChannelMonitorUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_ChannelMonitorUpdateDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ChannelMonitorUpdateDecodeErrorZ_Err(DecodeError err) {
index 1abe894f2c4279fd17e97b63ef3b795755cd3d19..13377d677bc3d2f195996799048e51fece0e4566 100644 (file)
@@ -21,6 +21,7 @@ public class Result_ChannelReestablishDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_ChannelReestablishDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: ChannelReestablish = new ChannelReestablish(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ChannelReestablishDecodeErrorZ_OK(ChannelReestablish res) {
@@ -35,6 +36,7 @@ public class Result_ChannelReestablishDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_ChannelReestablishDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ChannelReestablishDecodeErrorZ_Err(DecodeError err) {
index 12b75fe02f2c91672a54d43ccb4506a36ffc9e4d..f3060b29d6439be5fcacc21e2c9fe94996d68938 100644 (file)
@@ -21,6 +21,7 @@ public class Result_ErrorMessageDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_ErrorMessageDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: ErrorMessage = new ErrorMessage(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ErrorMessageDecodeErrorZ_OK(ErrorMessage res) {
@@ -35,6 +36,7 @@ public class Result_ErrorMessageDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_ErrorMessageDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ErrorMessageDecodeErrorZ_Err(DecodeError err) {
index a3972e68c4c28380b11ff527b0248e64bd66e533..2e8c6498118b286df522aee222d802ebace970fb 100644 (file)
@@ -21,6 +21,7 @@ public class Result_GossipTimestampFilterDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_GossipTimestampFilterDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: GossipTimestampFilter = new GossipTimestampFilter(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_GossipTimestampFilterDecodeErrorZ_OK(GossipTimestampFilter res) {
@@ -35,6 +36,7 @@ public class Result_GossipTimestampFilterDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_GossipTimestampFilterDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_GossipTimestampFilterDecodeErrorZ_Err(DecodeError err) {
index 41c34a7a41b917c9bb8f47059a01213c1406ad27..0d03fd66e3e6b4ddc2625bfc7779b4c6dd5f636a 100644 (file)
@@ -21,6 +21,7 @@ public class Result_InMemoryChannelKeysDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_InMemoryChannelKeysDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: InMemoryChannelKeys = new InMemoryChannelKeys(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_InMemoryChannelKeysDecodeErrorZ_OK(InMemoryChannelKeys res) {
@@ -35,6 +36,7 @@ public class Result_InMemoryChannelKeysDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_InMemoryChannelKeysDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_InMemoryChannelKeysDecodeErrorZ_Err(DecodeError err) {
index bd37f300d433af694b952e2019ccddff121ae636..168ffcdb652782b539e566e278b36daa8149a38b 100644 (file)
@@ -21,6 +21,7 @@ public class Result_InitDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_InitDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: Init = new Init(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_InitDecodeErrorZ_OK(Init res) {
@@ -35,6 +36,7 @@ public class Result_InitDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_InitDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_InitDecodeErrorZ_Err(DecodeError err) {
index 997a3638a167df67b336813b0aa96f0cb4787099..38c3c2989d9cf7535a1612cd7e1dd2c4bfba3849 100644 (file)
@@ -21,11 +21,20 @@ public class Result_NetworkGraphDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_NetworkGraphDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: NetworkGraph = new NetworkGraph(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_NetworkGraphDecodeErrorZ_OK(NetworkGraph res) {
                        this(null, bindings.CResult_NetworkGraphDecodeErrorZ_ok(res == null ? 0 : res.ptr & ~1));
                        this.ptrs_to.add(res);
+                       // Due to rust's strict-ownership memory model, in some cases we need to "move"
+                       // an object to pass exclusive ownership to the function being called.
+                       // In most cases, we avoid this being visible in GC'd languages by cloning the object
+                       // at the FFI layer, creating a new object which Rust can claim ownership of
+                       // However, in some cases (eg here), there is no way to clone an object, and thus
+                       // we actually have to pass full ownership to Rust.
+                       // Thus, after this call, res is reset to null and is now a dummy object.
+                       res.ptr = 0;
                }
        }
 
@@ -35,6 +44,7 @@ public class Result_NetworkGraphDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_NetworkGraphDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NetworkGraphDecodeErrorZ_Err(DecodeError err) {
index d76322e5dd7a18679b0dfe587d39829b9661a42d..f0eb3fd4967f4a2b6e5b8bf6c6a66fe2f3080076 100644 (file)
@@ -21,6 +21,7 @@ public class Result_NodeAnnouncementInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_NodeAnnouncementInfoDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: NodeAnnouncementInfo = new NodeAnnouncementInfo(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_NodeAnnouncementInfoDecodeErrorZ_OK(NodeAnnouncementInfo res) {
@@ -35,6 +36,7 @@ public class Result_NodeAnnouncementInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_NodeAnnouncementInfoDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NodeAnnouncementInfoDecodeErrorZ_Err(DecodeError err) {
index ff25f3190fe1c98255d80b222e6e4a28345b4e64..3e9c8d2bbceb1afc25ef17622eecdd3b0d48bf86 100644 (file)
@@ -21,6 +21,7 @@ public class Result_NodeInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_NodeInfoDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: NodeInfo = new NodeInfo(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_NodeInfoDecodeErrorZ_OK(NodeInfo res) {
@@ -35,6 +36,7 @@ public class Result_NodeInfoDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_NodeInfoDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NodeInfoDecodeErrorZ_Err(DecodeError err) {
index 13d3735b9d4dae2414e25ab8a0d5fa42de61547e..510af04e59fbd30db9787c873ec7317db362c363 100644 (file)
@@ -30,6 +30,7 @@ public class Result_NoneLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_NoneLightningErrorZ_get_err(ptr);
                        const err_hu_conv: LightningError = new LightningError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NoneLightningErrorZ_Err(LightningError err) {
index 0790b404852dbd52b83041e702b9713463512797..5b340cbad8d68d0037be23a04147ca49fda8a739 100644 (file)
@@ -30,6 +30,7 @@ public class Result_NoneMonitorUpdateErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_NoneMonitorUpdateErrorZ_get_err(ptr);
                        const err_hu_conv: MonitorUpdateError = new MonitorUpdateError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NoneMonitorUpdateErrorZ_Err(MonitorUpdateError err) {
index 69636d7e47b0221864718b59b3e08eb93f61489d..e3b4f9fbcdffc44f28526e7e290a101384ea7914 100644 (file)
@@ -30,6 +30,7 @@ public class Result_NonePaymentSendFailureZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_NonePaymentSendFailureZ_get_err(ptr);
                        const err_hu_conv: PaymentSendFailure = new PaymentSendFailure(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NonePaymentSendFailureZ_Err(PaymentSendFailure err) {
index dc058075444bb632776dd2a290e309e9fab33d87..6607c204473784e5bffd19746426dd204dd189b6 100644 (file)
@@ -30,6 +30,7 @@ public class Result_NonePeerHandleErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_NonePeerHandleErrorZ_get_err(ptr);
                        const err_hu_conv: PeerHandleError = new PeerHandleError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_NonePeerHandleErrorZ_Err(PeerHandleError err) {
index c97cf53a6dbc4b6fc066eca8af36a0f1dc48cb67..d97504f392227268248781a92ed8959ebc16672e 100644 (file)
@@ -21,6 +21,7 @@ public class Result_PingDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_PingDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: Ping = new Ping(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_PingDecodeErrorZ_OK(Ping res) {
@@ -35,6 +36,7 @@ public class Result_PingDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_PingDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_PingDecodeErrorZ_Err(DecodeError err) {
index 16e60514fb7b983242c4b63ef82a7cdc07eb1f18..f690d02ded2114789d106198b1e754753c45fb11 100644 (file)
@@ -21,6 +21,7 @@ public class Result_PongDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_PongDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: Pong = new Pong(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_PongDecodeErrorZ_OK(Pong res) {
@@ -35,6 +36,7 @@ public class Result_PongDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_PongDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_PongDecodeErrorZ_Err(DecodeError err) {
index 40265bb285944c1f724587dec0ad06a9fd6b08db..dd80d0842af030678e90a575aa62e9b317a05b15 100644 (file)
@@ -21,6 +21,7 @@ public class Result_QueryChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_QueryChannelRangeDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: QueryChannelRange = new QueryChannelRange(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_QueryChannelRangeDecodeErrorZ_OK(QueryChannelRange res) {
@@ -35,6 +36,7 @@ public class Result_QueryChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_QueryChannelRangeDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_QueryChannelRangeDecodeErrorZ_Err(DecodeError err) {
index 546feb8c171eac34c2a3553bc7687fedbdcb9038..b699612e3d3222530d824f023ec6bb30ca5f904a 100644 (file)
@@ -21,6 +21,7 @@ public class Result_QueryShortChannelIdsDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_QueryShortChannelIdsDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: QueryShortChannelIds = new QueryShortChannelIds(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_QueryShortChannelIdsDecodeErrorZ_OK(QueryShortChannelIds res) {
@@ -35,6 +36,7 @@ public class Result_QueryShortChannelIdsDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_QueryShortChannelIdsDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_QueryShortChannelIdsDecodeErrorZ_Err(DecodeError err) {
index 133c2edafb080cdbea24395e162dd29dc767ec56..2fd3593e4ec1691d1d10ca8a98f6c4509685b6c4 100644 (file)
@@ -21,6 +21,7 @@ public class Result_ReplyChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_ReplyChannelRangeDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: ReplyChannelRange = new ReplyChannelRange(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ReplyChannelRangeDecodeErrorZ_OK(ReplyChannelRange res) {
@@ -35,6 +36,7 @@ public class Result_ReplyChannelRangeDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_ReplyChannelRangeDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ReplyChannelRangeDecodeErrorZ_Err(DecodeError err) {
index 08d3a442e285a3200cb92ea3c3ad0dc4f4e64edd..23a4f46d3072dc2325b85f9ace10757aa64c9305 100644 (file)
@@ -21,6 +21,7 @@ public class Result_ReplyShortChannelIdsEndDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: ReplyShortChannelIdsEnd = new ReplyShortChannelIdsEnd(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_ReplyShortChannelIdsEndDecodeErrorZ_OK(ReplyShortChannelIdsEnd res) {
@@ -35,6 +36,7 @@ public class Result_ReplyShortChannelIdsEndDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_ReplyShortChannelIdsEndDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_ReplyShortChannelIdsEndDecodeErrorZ_Err(DecodeError err) {
index 2fff6d286470a8f175d022709ed5cb01f7e91c62..ce596cb24bdfa1d2832a5ebe8fa0b91e2787fbb3 100644 (file)
@@ -21,6 +21,7 @@ public class Result_RouteDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_RouteDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: Route = new Route(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_RouteDecodeErrorZ_OK(Route res) {
@@ -35,6 +36,7 @@ public class Result_RouteDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_RouteDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_RouteDecodeErrorZ_Err(DecodeError err) {
index bc2d6b4b6bed12bcdece5744dd6618368fd9234a..8c84374bcdabbac492f88a99304865897b330535 100644 (file)
@@ -21,6 +21,7 @@ public class Result_RouteLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_RouteLightningErrorZ_get_ok(ptr);
                        const res_hu_conv: Route = new Route(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_RouteLightningErrorZ_OK(Route res) {
@@ -35,6 +36,7 @@ public class Result_RouteLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_RouteLightningErrorZ_get_err(ptr);
                        const err_hu_conv: LightningError = new LightningError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_RouteLightningErrorZ_Err(LightningError err) {
index cbd3d168b047412459c3a4c724c1f922758bf98e..e8aef3a95b564601b90bf068c553878ce13f4f7d 100644 (file)
@@ -21,6 +21,7 @@ public class Result_RoutingFeesDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_RoutingFeesDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: RoutingFees = new RoutingFees(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_RoutingFeesDecodeErrorZ_OK(RoutingFees res) {
@@ -35,6 +36,7 @@ public class Result_RoutingFeesDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_RoutingFeesDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_RoutingFeesDecodeErrorZ_Err(DecodeError err) {
index cb6afaa928b686105fb791bf6b083bca2b6c2fcb..380336119b673bd26f593d2d096df0f77ed8de7c 100644 (file)
@@ -35,6 +35,7 @@ public class Result_SpendableOutputDescriptorDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_SpendableOutputDescriptorDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_SpendableOutputDescriptorDecodeErrorZ_Err(DecodeError err) {
index 57391810821e99a13c1764f73681518637f65107..798db4f52b2f7f6cc3a271976c4abe3246839f4b 100644 (file)
@@ -21,11 +21,20 @@ public class Result_TrustedCommitmentTransactionNoneZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_TrustedCommitmentTransactionNoneZ_get_ok(ptr);
                        const res_hu_conv: TrustedCommitmentTransaction = new TrustedCommitmentTransaction(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_TrustedCommitmentTransactionNoneZ_OK(TrustedCommitmentTransaction res) {
                        this(null, bindings.CResult_TrustedCommitmentTransactionNoneZ_ok(res == null ? 0 : res.ptr & ~1));
                        this.ptrs_to.add(res);
+                       // Due to rust's strict-ownership memory model, in some cases we need to "move"
+                       // an object to pass exclusive ownership to the function being called.
+                       // In most cases, we avoid this being visible in GC'd languages by cloning the object
+                       // at the FFI layer, creating a new object which Rust can claim ownership of
+                       // However, in some cases (eg here), there is no way to clone an object, and thus
+                       // we actually have to pass full ownership to Rust.
+                       // Thus, after this call, res is reset to null and is now a dummy object.
+                       res.ptr = 0;
                }
        }
 
index 54de3e12888eeb62a176a55a749aec011ad7ff46..fa385e17e71f99b3b1ad311d50a31b71321e6824 100644 (file)
@@ -21,6 +21,7 @@ public class Result_TxCreationKeysSecpErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_TxCreationKeysSecpErrorZ_get_ok(ptr);
                        const res_hu_conv: TxCreationKeys = new TxCreationKeys(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_TxCreationKeysSecpErrorZ_OK(TxCreationKeys res) {
index b38975ef279c0751ad3e33cec44ae3dbc1e7624f..4d1dab8eb3f3391f16f313a12cb016eff465af35 100644 (file)
@@ -21,6 +21,7 @@ public class Result_UnsignedChannelAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: UnsignedChannelAnnouncement = new UnsignedChannelAnnouncement(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_UnsignedChannelAnnouncementDecodeErrorZ_OK(UnsignedChannelAnnouncement res) {
@@ -35,6 +36,7 @@ public class Result_UnsignedChannelAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_UnsignedChannelAnnouncementDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_UnsignedChannelAnnouncementDecodeErrorZ_Err(DecodeError err) {
index ecbde1b6e65bb942bf71189b5cd297d06c4b71d5..c9f8fca10a705baf5e473d1606deb75c22c2ae69 100644 (file)
@@ -21,6 +21,7 @@ public class Result_UnsignedChannelUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_UnsignedChannelUpdateDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: UnsignedChannelUpdate = new UnsignedChannelUpdate(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_UnsignedChannelUpdateDecodeErrorZ_OK(UnsignedChannelUpdate res) {
@@ -35,6 +36,7 @@ public class Result_UnsignedChannelUpdateDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_UnsignedChannelUpdateDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_UnsignedChannelUpdateDecodeErrorZ_Err(DecodeError err) {
index 7c387223f31a1144eedc147fd0dd5d9fbcb4d2b2..9bf0f9e589570ca7e25410ff5fa2c31244d32bb6 100644 (file)
@@ -21,6 +21,7 @@ public class Result_UnsignedNodeAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number res = bindings.LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ_get_ok(ptr);
                        const res_hu_conv: UnsignedNodeAnnouncement = new UnsignedNodeAnnouncement(null, res);
+                       res_hu_conv.ptrs_to.add(this);
                        this.res = res_hu_conv;
                }
                public Result_UnsignedNodeAnnouncementDecodeErrorZ_OK(UnsignedNodeAnnouncement res) {
@@ -35,6 +36,7 @@ public class Result_UnsignedNodeAnnouncementDecodeErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_UnsignedNodeAnnouncementDecodeErrorZ_get_err(ptr);
                        const err_hu_conv: DecodeError = new DecodeError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_UnsignedNodeAnnouncementDecodeErrorZ_Err(DecodeError err) {
index ab9c881b51ba750462d1c7fb46d73eeb21f7aaf6..1b5ac3dd566b326e1edf94267dd4dd3625b1d7fb 100644 (file)
@@ -32,6 +32,7 @@ public class Result_boolLightningErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_boolLightningErrorZ_get_err(ptr);
                        const err_hu_conv: LightningError = new LightningError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_boolLightningErrorZ_Err(LightningError err) {
index 366ee35d6a0a5b42168ab36bcc13e448c5cf1715..c1a720dea7a1f74245ff85bb26bcd53257bafe2a 100644 (file)
@@ -32,6 +32,7 @@ public class Result_boolPeerHandleErrorZ extends CommonBase {
                        super(_dummy, ptr);
                        number err = bindings.LDKCResult_boolPeerHandleErrorZ_get_err(ptr);
                        const err_hu_conv: PeerHandleError = new PeerHandleError(null, err);
+                       err_hu_conv.ptrs_to.add(this);
                        this.err = err_hu_conv;
                }
                public Result_boolPeerHandleErrorZ_Err(PeerHandleError err) {
index 588081023f5f3ce4480251ffdcac1b6a273ba296..15b9945b58350c9bcfe9bb4061cc528b817a952e 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public RevokeAndACK clone() {
                number ret = bindings.RevokeAndACK_clone(this.ptr);
                const ret_hu_conv: RevokeAndACK = new RevokeAndACK(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,6 +55,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static RevokeAndACK constructor_new(Uint8Array channel_id_arg, Uint8Array per_commitment_secret_arg, Uint8Array next_per_commitment_point_arg) {
                number ret = bindings.RevokeAndACK_new(channel_id_arg, per_commitment_secret_arg, next_per_commitment_point_arg);
                const ret_hu_conv: RevokeAndACK = new RevokeAndACK(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -65,6 +67,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static RevokeAndACK constructor_read(Uint8Array ser) {
                number ret = bindings.RevokeAndACK_read(ser);
                const ret_hu_conv: RevokeAndACK = new RevokeAndACK(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index d54afc71e9b622a61567df2fe901a3a57cd33884..e8d32809419fc467438833f22a9cbf6da29d564a 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public Route clone() {
                number ret = bindings.Route_clone(this.ptr);
                const ret_hu_conv: Route = new Route(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -32,6 +33,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static Route constructor_new(RouteHop[][] paths_arg) {
                number ret = bindings.Route_new((number[][])Arrays.stream(paths_arg).map(arr_conv_12 -> (number[])Arrays.stream(arr_conv_12).map(arr_conv_10 -> arr_conv_10 == null ? 0 : arr_conv_10.ptr & ~1).toArray()).toArray());
                const ret_hu_conv: Route = new Route(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                /* TODO 2 RouteHop[]  */;
                return ret_hu_conv;
        }
index 35ff0051ad11073af6aa5852d8b57ecefb620fa6..a5e312e95ae591eccc5ea4c801a8904754fbfcfd 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public RouteHint clone() {
                number ret = bindings.RouteHint_clone(this.ptr);
                const ret_hu_conv: RouteHint = new RouteHint(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public RoutingFees get_fees() {
                number ret = bindings.RouteHint_get_fees(this.ptr);
                const ret_hu_conv: RoutingFees = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -74,6 +76,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static RouteHint constructor_new(Uint8Array src_node_id_arg, number short_channel_id_arg, RoutingFees fees_arg, number cltv_expiry_delta_arg, number htlc_minimum_msat_arg) {
                number ret = bindings.RouteHint_new(src_node_id_arg, short_channel_id_arg, fees_arg == null ? 0 : fees_arg.ptr & ~1, cltv_expiry_delta_arg, htlc_minimum_msat_arg);
                const ret_hu_conv: RouteHint = new RouteHint(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(fees_arg);
                return ret_hu_conv;
        }
index 6a943251a6123b289cc2177e1bf8998e85818796..f03f698946c28badb6ab6702ea519b94eee9c016 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public RouteHop clone() {
                number ret = bindings.RouteHop_clone(this.ptr);
                const ret_hu_conv: RouteHop = new RouteHop(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -36,12 +37,21 @@ import * as bindings from '../bindings' // TODO: figure out location
        public NodeFeatures get_node_features() {
                number ret = bindings.RouteHop_get_node_features(this.ptr);
                const ret_hu_conv: NodeFeatures = new NodeFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_node_features(NodeFeatures val) {
                bindings.RouteHop_set_node_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public number get_short_channel_id() {
@@ -56,12 +66,21 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelFeatures get_channel_features() {
                number ret = bindings.RouteHop_get_channel_features(this.ptr);
                const ret_hu_conv: ChannelFeatures = new ChannelFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_channel_features(ChannelFeatures val) {
                bindings.RouteHop_set_channel_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public number get_fee_msat() {
@@ -85,8 +104,25 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static RouteHop constructor_new(Uint8Array pubkey_arg, NodeFeatures node_features_arg, number short_channel_id_arg, ChannelFeatures channel_features_arg, number fee_msat_arg, number cltv_expiry_delta_arg) {
                number ret = bindings.RouteHop_new(pubkey_arg, node_features_arg == null ? 0 : node_features_arg.ptr & ~1, short_channel_id_arg, channel_features_arg == null ? 0 : channel_features_arg.ptr & ~1, fee_msat_arg, cltv_expiry_delta_arg);
                const ret_hu_conv: RouteHop = new RouteHop(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(node_features_arg);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid ret_hu_conv being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after ret_hu_conv call, node_features_arg is reset to null and is now a dummy object.
+               node_features_arg.ptr = 0;
                ret_hu_conv.ptrs_to.add(channel_features_arg);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid ret_hu_conv being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after ret_hu_conv call, channel_features_arg is reset to null and is now a dummy object.
+               channel_features_arg.ptr = 0;
                return ret_hu_conv;
        }
 
index 0a0a55cbd7e60d9d7c93574a0f31ddf19c53c20d..f71fd081fb6e6bb8ebfa874503250fa21e9a4234 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public RoutingFees clone() {
                number ret = bindings.RoutingFees_clone(this.ptr);
                const ret_hu_conv: RoutingFees = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static RoutingFees constructor_new(number base_msat_arg, number proportional_millionths_arg) {
                number ret = bindings.RoutingFees_new(base_msat_arg, proportional_millionths_arg);
                const ret_hu_conv: RoutingFees = new RoutingFees(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index f7fc16cf938e284e9406682f0c967cd72cc3af9b..2ab676ca407715b6aec957cb26e98ee455fefc03 100644 (file)
@@ -61,7 +61,7 @@ import * as bindings from '../bindings' // TODO: figure out location
 
                                                get_next_channel_announcements (starting_point: number, batch_amount: number): number[] {
                                                        ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate>[] ret = arg.get_next_channel_announcements(starting_point, batch_amount);
-                               result: number[] = (number[])Arrays.stream(ret).map(arr_conv_63 -> bindings.C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(arr_conv_63.a == null ? 0 : arr_conv_63.a.ptr & ~1/*XXX: this.ptrs_to.add(arr_conv_63_a)*/, arr_conv_63.b == null ? 0 : arr_conv_63.b.ptr & ~1/*XXX: this.ptrs_to.add(arr_conv_63_b)*/, arr_conv_63.c == null ? 0 : arr_conv_63.c.ptr & ~1/*XXX: this.ptrs_to.add(arr_conv_63_c)*/)).toArray();
+                               result: number[] = (number[])Arrays.stream(ret).map(arr_conv_63 -> bindings.C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_new(arr_conv_63.a == null ? 0 : arr_conv_63.a.ptr & ~1, arr_conv_63.b == null ? 0 : arr_conv_63.b.ptr & ~1, arr_conv_63.c == null ? 0 : arr_conv_63.c.ptr & ~1)).toArray();
                                /* TODO 2 ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate>  */;
                                return result;
                                                },
@@ -80,6 +80,7 @@ import * as bindings from '../bindings' // TODO: figure out location
 
                                                handle_reply_channel_range (their_node_id: Uint8Array, msg: number): number {
                                                        const msg_hu_conv: ReplyChannelRange = new ReplyChannelRange(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                                        Result_NoneLightningErrorZ ret = arg.handle_reply_channel_range(their_node_id, msg_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
                                return result;
@@ -87,6 +88,7 @@ import * as bindings from '../bindings' // TODO: figure out location
 
                                                handle_reply_short_channel_ids_end (their_node_id: Uint8Array, msg: number): number {
                                                        const msg_hu_conv: ReplyShortChannelIdsEnd = new ReplyShortChannelIdsEnd(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                                        Result_NoneLightningErrorZ ret = arg.handle_reply_short_channel_ids_end(their_node_id, msg_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
                                return result;
@@ -94,6 +96,7 @@ import * as bindings from '../bindings' // TODO: figure out location
 
                                                handle_query_channel_range (their_node_id: Uint8Array, msg: number): number {
                                                        const msg_hu_conv: QueryChannelRange = new QueryChannelRange(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                                        Result_NoneLightningErrorZ ret = arg.handle_query_channel_range(their_node_id, msg_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
                                return result;
@@ -101,6 +104,7 @@ import * as bindings from '../bindings' // TODO: figure out location
 
                                                handle_query_short_channel_ids (their_node_id: Uint8Array, msg: number): number {
                                                        const msg_hu_conv: QueryShortChannelIds = new QueryShortChannelIds(null, msg);
+                               msg_hu_conv.ptrs_to.add(this);
                                                        Result_NoneLightningErrorZ ret = arg.handle_query_short_channel_ids(their_node_id, msg_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
                                return result;
@@ -162,11 +166,14 @@ import * as bindings from '../bindings' // TODO: figure out location
                for (int l = 0; l < ret.length; l++) {
                        number arr_conv_63 = ret[l];
                        number arr_conv_63_a = bindings.LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_a(arr_conv_63);
-                       const arr_conv_63_a_hu_conv: ChannelAnnouncement = new ChannelAnnouncement(null, arr_conv_63_a);;
+                       const arr_conv_63_a_hu_conv: ChannelAnnouncement = new ChannelAnnouncement(null, arr_conv_63_a);
+                       arr_conv_63_a_hu_conv.ptrs_to.add(this);;
                        number arr_conv_63_b = bindings.LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_b(arr_conv_63);
-                       const arr_conv_63_b_hu_conv: ChannelUpdate = new ChannelUpdate(null, arr_conv_63_b);;
+                       const arr_conv_63_b_hu_conv: ChannelUpdate = new ChannelUpdate(null, arr_conv_63_b);
+                       arr_conv_63_b_hu_conv.ptrs_to.add(this);;
                        number arr_conv_63_c = bindings.LDKC3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZ_get_c(arr_conv_63);
-                       const arr_conv_63_c_hu_conv: ChannelUpdate = new ChannelUpdate(null, arr_conv_63_c);;
+                       const arr_conv_63_c_hu_conv: ChannelUpdate = new ChannelUpdate(null, arr_conv_63_c);
+                       arr_conv_63_c_hu_conv.ptrs_to.add(this);;
                        ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate> arr_conv_63_conv = new ThreeTuple<ChannelAnnouncement, ChannelUpdate, ChannelUpdate>(arr_conv_63_a_hu_conv, arr_conv_63_b_hu_conv, arr_conv_63_c_hu_conv);
                        arr_conv_63_arr[l] = arr_conv_63_conv;
                }
@@ -179,6 +186,7 @@ import * as bindings from '../bindings' // TODO: figure out location
                for (int s = 0; s < ret.length; s++) {
                        number arr_conv_18 = ret[s];
                        const arr_conv_18_hu_conv: NodeAnnouncement = new NodeAnnouncement(null, arr_conv_18);
+                       arr_conv_18_hu_conv.ptrs_to.add(this);
                        arr_conv_18_arr[s] = arr_conv_18_hu_conv;
                }
                return arr_conv_18_arr;
index 683f9025722f05de2e6c206aef453596c65b9691..0301af6b6890d0ecc899bd2255389e1be56d8bb5 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public Shutdown clone() {
                number ret = bindings.Shutdown_clone(this.ptr);
                const ret_hu_conv: Shutdown = new Shutdown(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static Shutdown constructor_new(Uint8Array channel_id_arg, Uint8Array scriptpubkey_arg) {
                number ret = bindings.Shutdown_new(channel_id_arg, scriptpubkey_arg);
                const ret_hu_conv: Shutdown = new Shutdown(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -56,6 +58,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static Shutdown constructor_read(Uint8Array ser) {
                number ret = bindings.Shutdown_read(ser);
                const ret_hu_conv: Shutdown = new Shutdown(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 3746a1abf22653b40691aed6c89103c9513be795..79a3f6ce0b53d52d582fe6750a15da23a9af4898 100644 (file)
@@ -30,6 +30,7 @@ export class StaticOutput extends SpendableOutputDescriptor {
                super(null, ptr);
                const outpoint: number = obj.outpoint;
                const outpoint_hu_conv: OutPoint = new OutPoint(null, outpoint);
+                       outpoint_hu_conv.ptrs_to.add(this);
                this.outpoint = outpoint_hu_conv;
                const output: number = obj.output;
                TxOut output_conv = new TxOut(null, output);
@@ -47,6 +48,7 @@ export class DynamicOutputP2WSH extends SpendableOutputDescriptor {
                super(null, ptr);
                const outpoint: number = obj.outpoint;
                const outpoint_hu_conv: OutPoint = new OutPoint(null, outpoint);
+                       outpoint_hu_conv.ptrs_to.add(this);
                this.outpoint = outpoint_hu_conv;
                this.per_commitment_point = obj.per_commitment_point;
                this.to_self_delay = obj.to_self_delay;
@@ -69,6 +71,7 @@ export class StaticOutputCounterpartyPayment extends SpendableOutputDescriptor {
                super(null, ptr);
                const outpoint: number = obj.outpoint;
                const outpoint_hu_conv: OutPoint = new OutPoint(null, outpoint);
+                       outpoint_hu_conv.ptrs_to.add(this);
                this.outpoint = outpoint_hu_conv;
                const output: number = obj.output;
                TxOut output_conv = new TxOut(null, output);
index b40e528eebb45d410bf76cab890b9aa98d2f0c79..5448f12e841226975df97e9713a198c9e7527809 100644 (file)
@@ -26,12 +26,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public BuiltCommitmentTransaction built_transaction() {
                number ret = bindings.TrustedCommitmentTransaction_built_transaction(this.ptr);
                const ret_hu_conv: BuiltCommitmentTransaction = new BuiltCommitmentTransaction(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public TxCreationKeys keys() {
                number ret = bindings.TrustedCommitmentTransaction_keys(this.ptr);
                const ret_hu_conv: TxCreationKeys = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index 83aeb58883ddd46e52d7f9e1e519377e1e214049..1b8b616b6d6baae060312549783f511b044f6e44 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public TxCreationKeys clone() {
                number ret = bindings.TxCreationKeys_clone(this.ptr);
                const ret_hu_conv: TxCreationKeys = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -72,6 +73,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static TxCreationKeys constructor_new(Uint8Array per_commitment_point_arg, Uint8Array revocation_key_arg, Uint8Array broadcaster_htlc_key_arg, Uint8Array countersignatory_htlc_key_arg, Uint8Array broadcaster_delayed_payment_key_arg) {
                number ret = bindings.TxCreationKeys_new(per_commitment_point_arg, revocation_key_arg, broadcaster_htlc_key_arg, countersignatory_htlc_key_arg, broadcaster_delayed_payment_key_arg);
                const ret_hu_conv: TxCreationKeys = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -83,6 +85,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static TxCreationKeys constructor_read(Uint8Array ser) {
                number ret = bindings.TxCreationKeys_read(ser);
                const ret_hu_conv: TxCreationKeys = new TxCreationKeys(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index af0338363e7224638ab3867043159b47092290ba..84b2ca7f7b0f075fd07cb1606ebdbae39fc11eab 100644 (file)
@@ -21,18 +21,28 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UnsignedChannelAnnouncement clone() {
                number ret = bindings.UnsignedChannelAnnouncement_clone(this.ptr);
                const ret_hu_conv: UnsignedChannelAnnouncement = new UnsignedChannelAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelFeatures get_features() {
                number ret = bindings.UnsignedChannelAnnouncement_get_features(this.ptr);
                const ret_hu_conv: ChannelFeatures = new ChannelFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(ChannelFeatures val) {
                bindings.UnsignedChannelAnnouncement_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public Uint8Array get_chain_hash() {
index a002dfc2af732fd3bef4bab1af61bfb4c914c745..133bc91f19d878843afb9d80fd01b06a91a2a4d7 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UnsignedChannelUpdate clone() {
                number ret = bindings.UnsignedChannelUpdate_clone(this.ptr);
                const ret_hu_conv: UnsignedChannelUpdate = new UnsignedChannelUpdate(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
index abd16c565f98658f159561a023f086d859370e70..c874fc3be00e7297de7591cc485d372a67158739 100644 (file)
@@ -21,18 +21,28 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UnsignedNodeAnnouncement clone() {
                number ret = bindings.UnsignedNodeAnnouncement_clone(this.ptr);
                const ret_hu_conv: UnsignedNodeAnnouncement = new UnsignedNodeAnnouncement(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public NodeFeatures get_features() {
                number ret = bindings.UnsignedNodeAnnouncement_get_features(this.ptr);
                const ret_hu_conv: NodeFeatures = new NodeFeatures(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public void set_features(NodeFeatures val) {
                bindings.UnsignedNodeAnnouncement_set_features(this.ptr, val == null ? 0 : val.ptr & ~1);
                this.ptrs_to.add(val);
+               // Due to rust's strict-ownership memory model, in some cases we need to "move"
+               // an object to pass exclusive ownership to the function being called.
+               // In most cases, we avoid this being visible in GC'd languages by cloning the object
+               // at the FFI layer, creating a new object which Rust can claim ownership of
+               // However, in some cases (eg here), there is no way to clone an object, and thus
+               // we actually have to pass full ownership to Rust.
+               // Thus, after this call, val is reset to null and is now a dummy object.
+               val.ptr = 0;
        }
 
        public number get_timestamp() {
index 52c5ed48199a19a25a176f85656e0c6f47970457..862a8763a093dc86e854521cdaf8293ad9f67c05 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UpdateAddHTLC clone() {
                number ret = bindings.UpdateAddHTLC_clone(this.ptr);
                const ret_hu_conv: UpdateAddHTLC = new UpdateAddHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -77,6 +78,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UpdateAddHTLC constructor_read(Uint8Array ser) {
                number ret = bindings.UpdateAddHTLC_read(ser);
                const ret_hu_conv: UpdateAddHTLC = new UpdateAddHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index c838d7c55e1567627f573c6659efd1544e631ae6..bf4a4763688188e7f05917c6ffa48df315b8bea9 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UpdateFailHTLC clone() {
                number ret = bindings.UpdateFailHTLC_clone(this.ptr);
                const ret_hu_conv: UpdateFailHTLC = new UpdateFailHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -50,6 +51,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UpdateFailHTLC constructor_read(Uint8Array ser) {
                number ret = bindings.UpdateFailHTLC_read(ser);
                const ret_hu_conv: UpdateFailHTLC = new UpdateFailHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 10072c0998d68783168dc532603beab66555b5a3..52b6a71d572b4caddfedd18c11f841d4db8342e1 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UpdateFailMalformedHTLC clone() {
                number ret = bindings.UpdateFailMalformedHTLC_clone(this.ptr);
                const ret_hu_conv: UpdateFailMalformedHTLC = new UpdateFailMalformedHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -59,6 +60,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UpdateFailMalformedHTLC constructor_read(Uint8Array ser) {
                number ret = bindings.UpdateFailMalformedHTLC_read(ser);
                const ret_hu_conv: UpdateFailMalformedHTLC = new UpdateFailMalformedHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index ed504174cd0ca578bb52808dcd77738b3cd2c625..b6b189ba7a1cb9bfb7b373e91bddb905d0e1275e 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UpdateFee clone() {
                number ret = bindings.UpdateFee_clone(this.ptr);
                const ret_hu_conv: UpdateFee = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -45,6 +46,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UpdateFee constructor_new(Uint8Array channel_id_arg, number feerate_per_kw_arg) {
                number ret = bindings.UpdateFee_new(channel_id_arg, feerate_per_kw_arg);
                const ret_hu_conv: UpdateFee = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -56,6 +58,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UpdateFee constructor_read(Uint8Array ser) {
                number ret = bindings.UpdateFee_read(ser);
                const ret_hu_conv: UpdateFee = new UpdateFee(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 63962f776685333a0d6869d092bfda873e446dd0..9e030d62da0edeb6b972fe4231d8cedd4638e680 100644 (file)
@@ -21,6 +21,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UpdateFulfillHTLC clone() {
                number ret = bindings.UpdateFulfillHTLC_clone(this.ptr);
                const ret_hu_conv: UpdateFulfillHTLC = new UpdateFulfillHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -54,6 +55,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UpdateFulfillHTLC constructor_new(Uint8Array channel_id_arg, number htlc_id_arg, Uint8Array payment_preimage_arg) {
                number ret = bindings.UpdateFulfillHTLC_new(channel_id_arg, htlc_id_arg, payment_preimage_arg);
                const ret_hu_conv: UpdateFulfillHTLC = new UpdateFulfillHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
@@ -65,6 +67,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UpdateFulfillHTLC constructor_read(Uint8Array ser) {
                number ret = bindings.UpdateFulfillHTLC_read(ser);
                const ret_hu_conv: UpdateFulfillHTLC = new UpdateFulfillHTLC(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
index 44c586570cb8ce2b8467e66e907cef35f1b8f88c..a4cd7e8ce75a07a268ef7ce7dff1f3e789ef91bf 100644 (file)
@@ -21,12 +21,14 @@ import * as bindings from '../bindings' // TODO: figure out location
        public UserConfig clone() {
                number ret = bindings.UserConfig_clone(this.ptr);
                const ret_hu_conv: UserConfig = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
        public ChannelHandshakeConfig get_own_channel_config() {
                number ret = bindings.UserConfig_get_own_channel_config(this.ptr);
                const ret_hu_conv: ChannelHandshakeConfig = new ChannelHandshakeConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -38,6 +40,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelHandshakeLimits get_peer_channel_config_limits() {
                number ret = bindings.UserConfig_get_peer_channel_config_limits(this.ptr);
                const ret_hu_conv: ChannelHandshakeLimits = new ChannelHandshakeLimits(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -49,6 +52,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public ChannelConfig get_channel_options() {
                number ret = bindings.UserConfig_get_channel_options(this.ptr);
                const ret_hu_conv: ChannelConfig = new ChannelConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(this);
                return ret_hu_conv;
        }
 
@@ -60,6 +64,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UserConfig constructor_new(ChannelHandshakeConfig own_channel_config_arg, ChannelHandshakeLimits peer_channel_config_limits_arg, ChannelConfig channel_options_arg) {
                number ret = bindings.UserConfig_new(own_channel_config_arg == null ? 0 : own_channel_config_arg.ptr & ~1, peer_channel_config_limits_arg == null ? 0 : peer_channel_config_limits_arg.ptr & ~1, channel_options_arg == null ? 0 : channel_options_arg.ptr & ~1);
                const ret_hu_conv: UserConfig = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                ret_hu_conv.ptrs_to.add(own_channel_config_arg);
                ret_hu_conv.ptrs_to.add(peer_channel_config_limits_arg);
                ret_hu_conv.ptrs_to.add(channel_options_arg);
@@ -69,6 +74,7 @@ import * as bindings from '../bindings' // TODO: figure out location
        public static UserConfig constructor_default() {
                number ret = bindings.UserConfig_default();
                const ret_hu_conv: UserConfig = new UserConfig(null, ret);
+               ret_hu_conv.ptrs_to.add(ret_hu_conv);
                return ret_hu_conv;
        }
 
diff --git a/ts/structs/UtilMethods.ts b/ts/structs/UtilMethods.ts
new file mode 100644 (file)
index 0000000..aa56072
--- /dev/null
@@ -0,0 +1,20 @@
+       public static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ constructor_BlockHashChannelMonitorZ_read(Uint8Array ser, KeysInterface arg) {
+               number ret = bindings.C2Tuple_BlockHashChannelMonitorZ_read(ser, arg == null ? 0 : arg.ptr);
+               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg);
+               return ret_hu_conv;
+       }
+
+       public static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ constructor_BlockHashChannelManagerZ_read(Uint8Array ser, KeysInterface arg_keys_manager, FeeEstimator arg_fee_estimator, Watch arg_chain_monitor, BroadcasterInterface arg_tx_broadcaster, Logger arg_logger, UserConfig arg_default_config, ChannelMonitor[] arg_channel_monitors) {
+               number ret = bindings.C2Tuple_BlockHashChannelManagerZ_read(ser, bindings.ChannelManagerReadArgs_new(arg_keys_manager == null ? 0 : arg_keys_manager.ptr, arg_fee_estimator == null ? 0 : arg_fee_estimator.ptr, arg_chain_monitor == null ? 0 : arg_chain_monitor.ptr, arg_tx_broadcaster == null ? 0 : arg_tx_broadcaster.ptr, arg_logger == null ? 0 : arg_logger.ptr, arg_default_config == null ? 0 : arg_default_config.ptr & ~1, (number[])Arrays.stream(arg_channel_monitors).map(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray()));
+               Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg_keys_manager);
+               ret_hu_conv.ptrs_to.add(arg_fee_estimator);
+               ret_hu_conv.ptrs_to.add(arg_chain_monitor);
+               ret_hu_conv.ptrs_to.add(arg_tx_broadcaster);
+               ret_hu_conv.ptrs_to.add(arg_logger);
+               ret_hu_conv.ptrs_to.add(arg_default_config);
+               /* TODO 2 ChannelMonitor  */;
+               return ret_hu_conv;
+       }
+
index ea0bdf4b1d8d804f888855247fabfc3effcdcd64..269905b0a0b926e5668dd0faff44e0a8dd386033 100644 (file)
@@ -34,7 +34,9 @@ import * as bindings from '../bindings' // TODO: figure out location
                         // todo: in-line interface filling
                         watch_channel (funding_txo: number, monitor: number): number {
                                                        const funding_txo_hu_conv: OutPoint = new OutPoint(null, funding_txo);
+                               funding_txo_hu_conv.ptrs_to.add(this);
                                                        const monitor_hu_conv: ChannelMonitor = new ChannelMonitor(null, monitor);
+                               monitor_hu_conv.ptrs_to.add(this);
                                                        Result_NoneChannelMonitorUpdateErrZ ret = arg.watch_channel(funding_txo_hu_conv, monitor_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
                                return result;
@@ -42,7 +44,9 @@ import * as bindings from '../bindings' // TODO: figure out location
 
                                                update_channel (funding_txo: number, update: number): number {
                                                        const funding_txo_hu_conv: OutPoint = new OutPoint(null, funding_txo);
+                               funding_txo_hu_conv.ptrs_to.add(this);
                                                        const update_hu_conv: ChannelMonitorUpdate = new ChannelMonitorUpdate(null, update);
+                               update_hu_conv.ptrs_to.add(this);
                                                        Result_NoneChannelMonitorUpdateErrZ ret = arg.update_channel(funding_txo_hu_conv, update_hu_conv);
                                result: number = ret != null ? ret.ptr : 0;
                                return result;
@@ -93,6 +97,7 @@ import * as bindings from '../bindings' // TODO: figure out location
                for (int o = 0; o < ret.length; o++) {
                        number arr_conv_14 = ret[o];
                        const arr_conv_14_hu_conv: MonitorEvent = new MonitorEvent(null, arr_conv_14);
+                       arr_conv_14_hu_conv.ptrs_to.add(this);
                        arr_conv_14_arr[o] = arr_conv_14_hu_conv;
                }
                return arr_conv_14_arr;
diff --git a/ts/util/UtilMethods.ts b/ts/util/UtilMethods.ts
new file mode 100644 (file)
index 0000000..aa56072
--- /dev/null
@@ -0,0 +1,20 @@
+       public static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ constructor_BlockHashChannelMonitorZ_read(Uint8Array ser, KeysInterface arg) {
+               number ret = bindings.C2Tuple_BlockHashChannelMonitorZ_read(ser, arg == null ? 0 : arg.ptr);
+               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg);
+               return ret_hu_conv;
+       }
+
+       public static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ constructor_BlockHashChannelManagerZ_read(Uint8Array ser, KeysInterface arg_keys_manager, FeeEstimator arg_fee_estimator, Watch arg_chain_monitor, BroadcasterInterface arg_tx_broadcaster, Logger arg_logger, UserConfig arg_default_config, ChannelMonitor[] arg_channel_monitors) {
+               number ret = bindings.C2Tuple_BlockHashChannelManagerZ_read(ser, bindings.ChannelManagerReadArgs_new(arg_keys_manager == null ? 0 : arg_keys_manager.ptr, arg_fee_estimator == null ? 0 : arg_fee_estimator.ptr, arg_chain_monitor == null ? 0 : arg_chain_monitor.ptr, arg_tx_broadcaster == null ? 0 : arg_tx_broadcaster.ptr, arg_logger == null ? 0 : arg_logger.ptr, arg_default_config == null ? 0 : arg_default_config.ptr & ~1, (number[])Arrays.stream(arg_channel_monitors).map(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray()));
+               Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg_keys_manager);
+               ret_hu_conv.ptrs_to.add(arg_fee_estimator);
+               ret_hu_conv.ptrs_to.add(arg_chain_monitor);
+               ret_hu_conv.ptrs_to.add(arg_tx_broadcaster);
+               ret_hu_conv.ptrs_to.add(arg_logger);
+               ret_hu_conv.ptrs_to.add(arg_default_config);
+               /* TODO 2 ChannelMonitor  */;
+               return ret_hu_conv;
+       }
+
diff --git a/ts/util/functions.ts b/ts/util/functions.ts
new file mode 100644 (file)
index 0000000..aa56072
--- /dev/null
@@ -0,0 +1,20 @@
+       public static Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ constructor_BlockHashChannelMonitorZ_read(Uint8Array ser, KeysInterface arg) {
+               number ret = bindings.C2Tuple_BlockHashChannelMonitorZ_read(ser, arg == null ? 0 : arg.ptr);
+               Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg);
+               return ret_hu_conv;
+       }
+
+       public static Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ constructor_BlockHashChannelManagerZ_read(Uint8Array ser, KeysInterface arg_keys_manager, FeeEstimator arg_fee_estimator, Watch arg_chain_monitor, BroadcasterInterface arg_tx_broadcaster, Logger arg_logger, UserConfig arg_default_config, ChannelMonitor[] arg_channel_monitors) {
+               number ret = bindings.C2Tuple_BlockHashChannelManagerZ_read(ser, bindings.ChannelManagerReadArgs_new(arg_keys_manager == null ? 0 : arg_keys_manager.ptr, arg_fee_estimator == null ? 0 : arg_fee_estimator.ptr, arg_chain_monitor == null ? 0 : arg_chain_monitor.ptr, arg_tx_broadcaster == null ? 0 : arg_tx_broadcaster.ptr, arg_logger == null ? 0 : arg_logger.ptr, arg_default_config == null ? 0 : arg_default_config.ptr & ~1, (number[])Arrays.stream(arg_channel_monitors).map(arr_conv_16 -> arr_conv_16 == null ? 0 : arr_conv_16.ptr & ~1).toArray()));
+               Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ ret_hu_conv = Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.constr_from_ptr(ret);
+               ret_hu_conv.ptrs_to.add(arg_keys_manager);
+               ret_hu_conv.ptrs_to.add(arg_fee_estimator);
+               ret_hu_conv.ptrs_to.add(arg_chain_monitor);
+               ret_hu_conv.ptrs_to.add(arg_tx_broadcaster);
+               ret_hu_conv.ptrs_to.add(arg_logger);
+               ret_hu_conv.ptrs_to.add(arg_default_config);
+               /* TODO 2 ChannelMonitor  */;
+               return ret_hu_conv;
+       }
+