[C#] Update auto-generated C# bindings
authorMatt Corallo <git@bluematt.me>
Wed, 24 Jan 2024 03:32:37 +0000 (03:32 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 29 Jan 2024 16:37:42 +0000 (16:37 +0000)
187 files changed:
c_sharp/bindings.c
c_sharp/bindings.c.body
c_sharp/src/org/ldk/enums/BlindedFailure.cs [new file with mode: 0644]
c_sharp/src/org/ldk/enums/ConfirmationTarget.cs
c_sharp/src/org/ldk/impl/bindings.cs
c_sharp/src/org/ldk/structs/AcceptChannel.cs
c_sharp/src/org/ldk/structs/AcceptChannelV2.cs
c_sharp/src/org/ldk/structs/AnnouncementSignatures.cs
c_sharp/src/org/ldk/structs/BlindedForward.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/BlindedHopFeatures.cs
c_sharp/src/org/ldk/structs/BlindedPathCandidate.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Bolt11InvoiceFeatures.cs
c_sharp/src/org/ldk/structs/Bolt12InvoiceFeatures.cs
c_sharp/src/org/ldk/structs/BroadcasterInterface.cs
c_sharp/src/org/ldk/structs/CandidateRouteHop.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ChannelAnnouncement.cs
c_sharp/src/org/ldk/structs/ChannelConfig.cs
c_sharp/src/org/ldk/structs/ChannelFeatures.cs
c_sharp/src/org/ldk/structs/ChannelManager.cs
c_sharp/src/org/ldk/structs/ChannelMessageHandler.cs
c_sharp/src/org/ldk/structs/ChannelMonitor.cs
c_sharp/src/org/ldk/structs/ChannelPublicKeys.cs
c_sharp/src/org/ldk/structs/ChannelReady.cs
c_sharp/src/org/ldk/structs/ChannelReestablish.cs
c_sharp/src/org/ldk/structs/ChannelSigner.cs
c_sharp/src/org/ldk/structs/ChannelTypeFeatures.cs
c_sharp/src/org/ldk/structs/ChannelUpdate.cs
c_sharp/src/org/ldk/structs/ClaimedHTLC.cs
c_sharp/src/org/ldk/structs/ClosingSigned.cs
c_sharp/src/org/ldk/structs/ClosingSignedFeeRange.cs
c_sharp/src/org/ldk/structs/CoinSelectionSource.cs
c_sharp/src/org/ldk/structs/CommitmentSigned.cs
c_sharp/src/org/ldk/structs/CommitmentUpdate.cs
c_sharp/src/org/ldk/structs/Confirm.cs
c_sharp/src/org/ldk/structs/DecodeError.cs
c_sharp/src/org/ldk/structs/DefaultMessageRouter.cs
c_sharp/src/org/ldk/structs/DefaultRouter.cs
c_sharp/src/org/ldk/structs/DelayedPaymentBasepoint.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/DelayedPaymentKey.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/DelayedPaymentOutputDescriptor.cs
c_sharp/src/org/ldk/structs/Description.cs
c_sharp/src/org/ldk/structs/DirectedChannelInfo.cs
c_sharp/src/org/ldk/structs/EcdsaChannelSigner.cs
c_sharp/src/org/ldk/structs/ErrorAction.cs
c_sharp/src/org/ldk/structs/ErrorMessage.cs
c_sharp/src/org/ldk/structs/Event.cs
c_sharp/src/org/ldk/structs/FinalOnionHopData.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/FirstHopCandidate.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/FundingCreated.cs
c_sharp/src/org/ldk/structs/FundingSigned.cs
c_sharp/src/org/ldk/structs/GossipTimestampFilter.cs
c_sharp/src/org/ldk/structs/Hostname.cs
c_sharp/src/org/ldk/structs/HtlcBasepoint.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/HtlcKey.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/IgnoringMessageHandler.cs
c_sharp/src/org/ldk/structs/InMemorySigner.cs
c_sharp/src/org/ldk/structs/InboundHTLCErr.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Init.cs
c_sharp/src/org/ldk/structs/InitFeatures.cs
c_sharp/src/org/ldk/structs/InvalidShutdownScript.cs
c_sharp/src/org/ldk/structs/InvoiceRequestFeatures.cs
c_sharp/src/org/ldk/structs/Logger.cs
c_sharp/src/org/ldk/structs/MessageHandler.cs
c_sharp/src/org/ldk/structs/MessageRouter.cs
c_sharp/src/org/ldk/structs/MessageSendEvent.cs
c_sharp/src/org/ldk/structs/MonitorUpdatingPersister.cs
c_sharp/src/org/ldk/structs/NodeAlias.cs
c_sharp/src/org/ldk/structs/NodeAnnouncement.cs
c_sharp/src/org/ldk/structs/NodeFeatures.cs
c_sharp/src/org/ldk/structs/NodeId.cs
c_sharp/src/org/ldk/structs/Offer.cs
c_sharp/src/org/ldk/structs/OfferFeatures.cs
c_sharp/src/org/ldk/structs/OffersMessage.cs
c_sharp/src/org/ldk/structs/OffersMessageHandler.cs
c_sharp/src/org/ldk/structs/OneHopBlindedPathCandidate.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/OnionMessage.cs
c_sharp/src/org/ldk/structs/OnionMessageContents.cs
c_sharp/src/org/ldk/structs/OnionMessageHandler.cs
c_sharp/src/org/ldk/structs/OnionMessagePath.cs
c_sharp/src/org/ldk/structs/OnionMessenger.cs
c_sharp/src/org/ldk/structs/OnionPacket.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/OpenChannel.cs
c_sharp/src/org/ldk/structs/OpenChannelV2.cs
c_sharp/src/org/ldk/structs/Packet.cs
c_sharp/src/org/ldk/structs/PaymentError.cs [deleted file]
c_sharp/src/org/ldk/structs/PaymentParameters.cs
c_sharp/src/org/ldk/structs/PaymentPurpose.cs
c_sharp/src/org/ldk/structs/PendingHTLCInfo.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/PendingHTLCRouting.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Ping.cs
c_sharp/src/org/ldk/structs/Pong.cs
c_sharp/src/org/ldk/structs/PrivateHopCandidate.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ProbabilisticScorer.cs
c_sharp/src/org/ldk/structs/ProbabilisticScoringDecayParameters.cs
c_sharp/src/org/ldk/structs/ProbingError.cs [deleted file]
c_sharp/src/org/ldk/structs/PublicHopCandidate.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/QueryChannelRange.cs
c_sharp/src/org/ldk/structs/QueryShortChannelIds.cs
c_sharp/src/org/ldk/structs/ReceiveTlvs.cs
c_sharp/src/org/ldk/structs/Record.cs
c_sharp/src/org/ldk/structs/Refund.cs
c_sharp/src/org/ldk/structs/ReplyChannelRange.cs
c_sharp/src/org/ldk/structs/ReplyShortChannelIdsEnd.cs
c_sharp/src/org/ldk/structs/Result_BlindedFailureDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_BlindedForwardDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_CVec_u8Zu64ZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C2Tuple_CVec_u8ZusizeZNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_BlindedPathZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_CVec_CVec_u8ZZNoneZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_DelayedPaymentBasepointDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_DelayedPaymentKeyDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_FinalOnionHopDataDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_HtlcBasepointDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_HtlcKeyDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_NonePaymentErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_NoneSendErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_OnionPacketDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PendingHTLCInfoDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PendingHTLCInfoInboundHTLCErrZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_PendingHTLCRoutingDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ReceiveTlvsDecodeErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_RevocationBasepointDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_RevocationKeyDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_SendSuccessSendErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_SpliceAckDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_SpliceDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_SpliceLockedDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_StfuDecodeErrorZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesPaymentErrorZ.cs [deleted file]
c_sharp/src/org/ldk/structs/Result_WitnessNoneZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/RevocationBasepoint.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/RevocationKey.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/RevokeAndACK.cs
c_sharp/src/org/ldk/structs/RouteHintHop.cs
c_sharp/src/org/ldk/structs/Router.cs
c_sharp/src/org/ldk/structs/ScoreLookUp.cs
c_sharp/src/org/ldk/structs/ScoreUpdate.cs
c_sharp/src/org/ldk/structs/SendError.cs
c_sharp/src/org/ldk/structs/SendSuccess.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Shutdown.cs
c_sharp/src/org/ldk/structs/ShutdownScript.cs
c_sharp/src/org/ldk/structs/SignerProvider.cs
c_sharp/src/org/ldk/structs/SocketAddress.cs
c_sharp/src/org/ldk/structs/SpendableOutputDescriptor.cs
c_sharp/src/org/ldk/structs/Splice.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/SpliceAck.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/SpliceLocked.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/Stfu.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TaggedHash.cs
c_sharp/src/org/ldk/structs/ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TransactionU16LenLimited.cs
c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8Zu64Z.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8ZusizeZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyCVec_SocketAddressZZ.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyOnionMessageZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ.cs [deleted file]
c_sharp/src/org/ldk/structs/TwoTuple__u832u16Z.cs [new file with mode: 0644]
c_sharp/src/org/ldk/structs/TxAbort.cs
c_sharp/src/org/ldk/structs/TxAckRbf.cs
c_sharp/src/org/ldk/structs/TxAddInput.cs
c_sharp/src/org/ldk/structs/TxAddOutput.cs
c_sharp/src/org/ldk/structs/TxComplete.cs
c_sharp/src/org/ldk/structs/TxCreationKeys.cs
c_sharp/src/org/ldk/structs/TxInitRbf.cs
c_sharp/src/org/ldk/structs/TxRemoveInput.cs
c_sharp/src/org/ldk/structs/TxRemoveOutput.cs
c_sharp/src/org/ldk/structs/TxSignatures.cs
c_sharp/src/org/ldk/structs/UnsignedChannelAnnouncement.cs
c_sharp/src/org/ldk/structs/UnsignedChannelUpdate.cs
c_sharp/src/org/ldk/structs/UnsignedNodeAnnouncement.cs
c_sharp/src/org/ldk/structs/UntrustedString.cs
c_sharp/src/org/ldk/structs/UpdateAddHTLC.cs
c_sharp/src/org/ldk/structs/UpdateFailHTLC.cs
c_sharp/src/org/ldk/structs/UpdateFailMalformedHTLC.cs
c_sharp/src/org/ldk/structs/UpdateFee.cs
c_sharp/src/org/ldk/structs/UpdateFulfillHTLC.cs
c_sharp/src/org/ldk/structs/UtilMethods.cs
c_sharp/src/org/ldk/structs/WalletSource.cs
c_sharp/src/org/ldk/structs/WarningMessage.cs
c_sharp/src/org/ldk/structs/WitnessProgram.cs [new file with mode: 0644]

index 5f7c5c2e2f235a0c96bd4ad3a7863aa12ee00a5f..aa2a9f13ec762b9a6d51c0749e968fdbebbe6ca5 100644 (file)
@@ -31,6 +31,18 @@ _Static_assert(offsetof(LDKCVec_u8Z, datalen) == offsetof(LDKu8slice, datalen),
 
 _Static_assert(sizeof(void*) <= 8, "Pointers must fit into 64 bits");
 
+// Int types across Windows/Linux are different, so make sure we're using the right headers.
+_Static_assert(sizeof(void*) == sizeof(uintptr_t), "stdints must be correct");
+_Static_assert(sizeof(void*) == sizeof(intptr_t), "stdints must be correct");
+_Static_assert(sizeof(uint64_t) == 8, "stdints must be correct");
+_Static_assert(sizeof(int64_t) == 8, "stdints must be correct");
+_Static_assert(sizeof(uint32_t) == 4, "stdints must be correct");
+_Static_assert(sizeof(int32_t) == 4, "stdints must be correct");
+_Static_assert(sizeof(uint16_t) == 2, "stdints must be correct");
+_Static_assert(sizeof(int16_t) == 2, "stdints must be correct");
+_Static_assert(sizeof(uint8_t) == 1, "stdints must be correct");
+_Static_assert(sizeof(int8_t) == 1, "stdints must be correct");
+
 #define DECL_ARR_TYPE(ty, name) \
        struct name##array { \
                uint64_t arr_len; /* uint32_t would suffice but we want to align uint64_ts as well */ \
@@ -115,6 +127,13 @@ int CS_LDK_register_void_l_invoker(invoker_void_l invoker) {
        return 0;
 }
 
+typedef int64_t (*invoker_l_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
+static invoker_l_lll js_invoke_function_l_lll;
+int CS_LDK_register_l_lll_invoker(invoker_l_lll invoker) {
+       js_invoke_function_l_lll = invoker;
+       return 0;
+}
+
 typedef int64_t (*invoker_l_llll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c, int64_t d);
 static invoker_l_llll js_invoke_function_l_llll;
 int CS_LDK_register_l_llll_invoker(invoker_l_llll invoker) {
@@ -129,10 +148,10 @@ int CS_LDK_register_l_lllll_invoker(invoker_l_lllll invoker) {
        return 0;
 }
 
-typedef int64_t (*invoker_l_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
-static invoker_l_lll js_invoke_function_l_lll;
-int CS_LDK_register_l_lll_invoker(invoker_l_lll invoker) {
-       js_invoke_function_l_lll = invoker;
+typedef void (*invoker_void_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
+static invoker_void_lll js_invoke_function_void_lll;
+int CS_LDK_register_void_lll_invoker(invoker_void_lll invoker) {
+       js_invoke_function_void_lll = invoker;
        return 0;
 }
 
@@ -339,6 +358,20 @@ static inline uint64_t tag_ptr(const void* ptr, bool is_owned) {
        }
 }
 
+static inline LDKBlindedFailure LDKBlindedFailure_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKBlindedFailure_FromIntroductionNode;
+               case 1: return LDKBlindedFailure_FromBlindedNode;
+               default: abort();
+       }
+}
+static inline int32_t LDKBlindedFailure_to_cs(LDKBlindedFailure val) {
+       switch (val) {
+               case LDKBlindedFailure_FromIntroductionNode: return 0;
+               case LDKBlindedFailure_FromBlindedNode: return 1;
+               default: abort();
+       }
+}
 static inline LDKBolt11SemanticError LDKBolt11SemanticError_from_cs(int32_t ord) {
        switch (ord) {
                case 0: return LDKBolt11SemanticError_NoPaymentHash;
@@ -486,24 +519,22 @@ static inline int32_t LDKChannelShutdownState_to_cs(LDKChannelShutdownState val)
 static inline LDKConfirmationTarget LDKConfirmationTarget_from_cs(int32_t ord) {
        switch (ord) {
                case 0: return LDKConfirmationTarget_OnChainSweep;
-               case 1: return LDKConfirmationTarget_MaxAllowedNonAnchorChannelRemoteFee;
-               case 2: return LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee;
-               case 3: return LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee;
-               case 4: return LDKConfirmationTarget_AnchorChannelFee;
-               case 5: return LDKConfirmationTarget_NonAnchorChannelFee;
-               case 6: return LDKConfirmationTarget_ChannelCloseMinimum;
+               case 1: return LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee;
+               case 2: return LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee;
+               case 3: return LDKConfirmationTarget_AnchorChannelFee;
+               case 4: return LDKConfirmationTarget_NonAnchorChannelFee;
+               case 5: return LDKConfirmationTarget_ChannelCloseMinimum;
                default: abort();
        }
 }
 static inline int32_t LDKConfirmationTarget_to_cs(LDKConfirmationTarget val) {
        switch (val) {
                case LDKConfirmationTarget_OnChainSweep: return 0;
-               case LDKConfirmationTarget_MaxAllowedNonAnchorChannelRemoteFee: return 1;
-               case LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee: return 2;
-               case LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee: return 3;
-               case LDKConfirmationTarget_AnchorChannelFee: return 4;
-               case LDKConfirmationTarget_NonAnchorChannelFee: return 5;
-               case LDKConfirmationTarget_ChannelCloseMinimum: return 6;
+               case LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee: return 1;
+               case LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee: return 2;
+               case LDKConfirmationTarget_AnchorChannelFee: return 3;
+               case LDKConfirmationTarget_NonAnchorChannelFee: return 4;
+               case LDKConfirmationTarget_ChannelCloseMinimum: return 5;
                default: abort();
        }
 }
@@ -789,6 +820,11 @@ static inline int32_t LDKUtxoLookupError_to_cs(LDKUtxoLookupError val) {
                default: abort();
        }
 }
+static inline LDKCVec_u8Z CVec_u8Z_clone(const LDKCVec_u8Z *orig) {
+       LDKCVec_u8Z ret = { .data = MALLOC(sizeof(int8_t) * orig->datalen, "LDKCVec_u8Z clone bytes"), .datalen = orig->datalen };
+       memcpy(ret.data, orig->data, sizeof(int8_t) * ret.datalen);
+       return ret;
+}
 struct LDKThirtyTwoBytes BigEndianScalar_get_bytes (struct LDKBigEndianScalar* thing) {
        LDKThirtyTwoBytes ret = { .data = *thing->big_endian_bytes };
        return ret;
@@ -835,63 +871,6 @@ int8_t CS_LDK_LDKBech32Error_InvalidData_get_invalid_data(int64_t ptr) {
        int8_t invalid_data_conv = obj->invalid_data;
        return invalid_data_conv;
 }
-static inline LDKCVec_u8Z CVec_u8Z_clone(const LDKCVec_u8Z *orig) {
-       LDKCVec_u8Z ret = { .data = MALLOC(sizeof(int8_t) * orig->datalen, "LDKCVec_u8Z clone bytes"), .datalen = orig->datalen };
-       memcpy(ret.data, orig->data, sizeof(int8_t) * ret.datalen);
-       return ret;
-}
-struct LDKWitness TxIn_get_witness (struct LDKTxIn* thing) {   return Witness_clone(&thing->witness);}int8_tArray  CS_LDK_TxIn_get_witness(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       LDKWitness ret_var = TxIn_get_witness(thing_conv);
-       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
-       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
-       Witness_free(ret_var);
-       return ret_arr;
-}
-
-struct LDKCVec_u8Z TxIn_get_script_sig (struct LDKTxIn* thing) {       return CVec_u8Z_clone(&thing->script_sig);}int8_tArray  CS_LDK_TxIn_get_script_sig(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       LDKCVec_u8Z ret_var = TxIn_get_script_sig(thing_conv);
-       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
-       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
-       CVec_u8Z_free(ret_var);
-       return ret_arr;
-}
-
-LDKThirtyTwoBytes TxIn_get_previous_txid (struct LDKTxIn* thing) {     return thing->previous_txid;}int8_tArray  CS_LDK_TxIn_get_previous_txid(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(ret_arr->elems, TxIn_get_previous_txid(thing_conv).data, 32);
-       return ret_arr;
-}
-
-uint32_t TxIn_get_previous_vout (struct LDKTxIn* thing) {      return thing->previous_vout;}int32_t  CS_LDK_TxIn_get_previous_vout(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       int32_t ret_conv = TxIn_get_previous_vout(thing_conv);
-       return ret_conv;
-}
-
-uint32_t TxIn_get_sequence (struct LDKTxIn* thing) {   return thing->sequence;}int32_t  CS_LDK_TxIn_get_sequence(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       int32_t ret_conv = TxIn_get_sequence(thing_conv);
-       return ret_conv;
-}
-
-struct LDKCVec_u8Z TxOut_get_script_pubkey (struct LDKTxOut* thing) {  return CVec_u8Z_clone(&thing->script_pubkey);}int8_tArray  CS_LDK_TxOut_get_script_pubkey(int64_t thing) {
-       LDKTxOut* thing_conv = (LDKTxOut*)untag_ptr(thing);
-       LDKCVec_u8Z ret_var = TxOut_get_script_pubkey(thing_conv);
-       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
-       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
-       CVec_u8Z_free(ret_var);
-       return ret_arr;
-}
-
-uint64_t TxOut_get_value (struct LDKTxOut* thing) {    return thing->value;}int64_t  CS_LDK_TxOut_get_value(int64_t thing) {
-       LDKTxOut* thing_conv = (LDKTxOut*)untag_ptr(thing);
-       int64_t ret_conv = TxOut_get_value(thing_conv);
-       return ret_conv;
-}
-
 uint32_t CS_LDK_LDKCOption_u64Z_ty_from_ptr(int64_t ptr) {
        LDKCOption_u64Z *obj = (LDKCOption_u64Z*)untag_ptr(ptr);
        switch(obj->tag) {
@@ -1354,6 +1333,13 @@ int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_output(int64_t ptr)
        LDKTxOut* output_ref = &obj->static_output.output;
        return tag_ptr(output_ref, false);
 }
+int8_tArray CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_channel_keys_id(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticOutput);
+       int8_tArray channel_keys_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_keys_id_arr->elems, obj->static_output.channel_keys_id.data, 32);
+       return channel_keys_id_arr;
+}
 int64_t CS_LDK_LDKSpendableOutputDescriptor_DelayedPaymentOutput_get_delayed_payment_output(int64_t ptr) {
        LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
        CHECK(obj->tag == LDKSpendableOutputDescriptor_DelayedPaymentOutput);
@@ -1424,45 +1410,45 @@ int32_t CS_LDK_LDKCOption_u32Z_Some_get_some(int64_t ptr) {
        int32_t some_conv = obj->some;
        return some_conv;
 }
-static inline struct LDKCVec_u8Z C2Tuple_CVec_u8ZusizeZ_get_a(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR owner){
+static inline struct LDKCVec_u8Z C2Tuple_CVec_u8Zu64Z_get_a(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR owner){
        return CVec_u8Z_clone(&owner->a);
 }
-int8_tArray  CS_LDK_C2Tuple_CVec_u8ZusizeZ_get_a(int64_t owner) {
-       LDKC2Tuple_CVec_u8ZusizeZ* owner_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(owner);
-       LDKCVec_u8Z ret_var = C2Tuple_CVec_u8ZusizeZ_get_a(owner_conv);
+int8_tArray  CS_LDK_C2Tuple_CVec_u8Zu64Z_get_a(int64_t owner) {
+       LDKC2Tuple_CVec_u8Zu64Z* owner_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_CVec_u8Zu64Z_get_a(owner_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
        CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
-static inline uintptr_t C2Tuple_CVec_u8ZusizeZ_get_b(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR owner){
+static inline uint64_t C2Tuple_CVec_u8Zu64Z_get_b(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR owner){
        return owner->b;
 }
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_get_b(int64_t owner) {
-       LDKC2Tuple_CVec_u8ZusizeZ* owner_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(owner);
-       int64_t ret_conv = C2Tuple_CVec_u8ZusizeZ_get_b(owner_conv);
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_get_b(int64_t owner) {
+       LDKC2Tuple_CVec_u8Zu64Z* owner_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_CVec_u8Zu64Z_get_b(owner_conv);
        return ret_conv;
 }
 
-static inline struct LDKC2Tuple_CVec_u8ZusizeZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner){
+static inline struct LDKC2Tuple_CVec_u8Zu64Z CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return C2Tuple_CVec_u8ZusizeZ_clone(&*owner->contents.result);
+       return C2Tuple_CVec_u8Zu64Z_clone(&*owner->contents.result);
 }
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(int64_t owner) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(owner);
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(owner_conv);
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(owner_conv);
        return tag_ptr(ret_conv, true);
 }
 
-static inline void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner){
+static inline void CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return *owner->contents.err;
 }
-void  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(int64_t owner) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(owner);
-       CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(owner_conv);
+void  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(owner_conv);
 }
 
 static inline struct LDKChannelDerivationParameters CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner){
@@ -1535,74 +1521,6 @@ void  CS_LDK_CResult_NoneNoneZ_get_err(int64_t owner) {
        CResult_NoneNoneZ_get_err(owner_conv);
 }
 
-static inline struct LDKECDSASignature C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
-       return owner->a;
-}
-int8_tArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(int64_t owner) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
-       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
-       memcpy(ret_arr->elems, C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(owner_conv).compact_form, 64);
-       return ret_arr;
-}
-
-static inline struct LDKCVec_ECDSASignatureZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
-       return owner->b;
-}
-ptrArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(int64_t owner) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
-       LDKCVec_ECDSASignatureZ ret_var = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(owner_conv);
-       ptrArray ret_arr = NULL;
-       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
-       int8_tArray *ret_arr_ptr = (int8_tArray*)(((uint8_t*)ret_arr) + 8);
-       for (size_t i = 0; i < ret_var.datalen; i++) {
-               int8_tArray ret_conv_8_arr = init_int8_tArray(64, __LINE__);
-               memcpy(ret_conv_8_arr->elems, ret_var.data[i].compact_form, 64);
-               ret_arr_ptr[i] = ret_conv_8_arr;
-       }
-       
-       return ret_arr;
-}
-
-static inline struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(&*owner->contents.result);
-}
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(int64_t owner) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(owner_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-static inline void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return *owner->contents.err;
-}
-void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(int64_t owner) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
-       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(owner_conv);
-}
-
-static inline struct LDKECDSASignature CResult_ECDSASignatureNoneZ_get_ok(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return *owner->contents.result;
-}
-int8_tArray  CS_LDK_CResult_ECDSASignatureNoneZ_get_ok(int64_t owner) {
-       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
-       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
-       memcpy(ret_arr->elems, CResult_ECDSASignatureNoneZ_get_ok(owner_conv).compact_form, 64);
-       return ret_arr;
-}
-
-static inline void CResult_ECDSASignatureNoneZ_get_err(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return *owner->contents.err;
-}
-void  CS_LDK_CResult_ECDSASignatureNoneZ_get_err(int64_t owner) {
-       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
-       CResult_ECDSASignatureNoneZ_get_err(owner_conv);
-}
-
 static inline struct LDKPublicKey CResult_PublicKeyNoneZ_get_ok(LDKCResult_PublicKeyNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
        return *owner->contents.result;
@@ -1677,6 +1595,74 @@ void  CS_LDK_CResult_SchnorrSignatureNoneZ_get_err(int64_t owner) {
        CResult_SchnorrSignatureNoneZ_get_err(owner_conv);
 }
 
+static inline struct LDKECDSASignature CResult_ECDSASignatureNoneZ_get_ok(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_ECDSASignatureNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, CResult_ECDSASignatureNoneZ_get_ok(owner_conv).compact_form, 64);
+       return ret_arr;
+}
+
+static inline void CResult_ECDSASignatureNoneZ_get_err(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ECDSASignatureNoneZ_get_err(int64_t owner) {
+       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
+       CResult_ECDSASignatureNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKECDSASignature C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(int64_t owner) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(owner_conv).compact_form, 64);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_ECDSASignatureZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
+       return owner->b;
+}
+ptrArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
+       LDKCVec_ECDSASignatureZ ret_var = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(owner_conv);
+       ptrArray ret_arr = NULL;
+       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
+       int8_tArray *ret_arr_ptr = (int8_tArray*)(((uint8_t*)ret_arr) + 8);
+       for (size_t i = 0; i < ret_var.datalen; i++) {
+               int8_tArray ret_conv_8_arr = init_int8_tArray(64, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].compact_form, 64);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       return ret_arr;
+}
+
+static inline struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(owner_conv);
+}
+
 typedef struct LDKChannelSigner_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -1705,25 +1691,37 @@ LDKThirtyTwoBytes release_commitment_secret_LDKChannelSigner_jcall(const void* t
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
        return ret_ref;
 }
-LDKCResult_NoneNoneZ validate_holder_commitment_LDKChannelSigner_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * holder_tx, LDKCVec_ThirtyTwoBytesZ preimages) {
+LDKCResult_NoneNoneZ validate_holder_commitment_LDKChannelSigner_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * holder_tx, LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages) {
        LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
        LDKHolderCommitmentTransaction holder_tx_var = *holder_tx;
        int64_t holder_tx_ref = 0;
        holder_tx_var = HolderCommitmentTransaction_clone(&holder_tx_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_tx_var);
        holder_tx_ref = tag_ptr(holder_tx_var.inner, holder_tx_var.is_owned);
-       LDKCVec_ThirtyTwoBytesZ preimages_var = preimages;
-       ptrArray preimages_arr = NULL;
-       preimages_arr = init_ptrArray(preimages_var.datalen, __LINE__);
-       int8_tArray *preimages_arr_ptr = (int8_tArray*)(((uint8_t*)preimages_arr) + 8);
-       for (size_t i = 0; i < preimages_var.datalen; i++) {
-               int8_tArray preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
-               memcpy(preimages_conv_8_arr->elems, preimages_var.data[i].data, 32);
-               preimages_arr_ptr[i] = preimages_conv_8_arr;
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_var = outbound_htlc_preimages;
+       ptrArray outbound_htlc_preimages_arr = NULL;
+       outbound_htlc_preimages_arr = init_ptrArray(outbound_htlc_preimages_var.datalen, __LINE__);
+       int8_tArray *outbound_htlc_preimages_arr_ptr = (int8_tArray*)(((uint8_t*)outbound_htlc_preimages_arr) + 8);
+       for (size_t i = 0; i < outbound_htlc_preimages_var.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
+               memcpy(outbound_htlc_preimages_conv_8_arr->elems, outbound_htlc_preimages_var.data[i].data, 32);
+               outbound_htlc_preimages_arr_ptr[i] = outbound_htlc_preimages_conv_8_arr;
        }
        
-       FREE(preimages_var.data);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 2, holder_tx_ref, (int64_t)preimages_arr);
+       FREE(outbound_htlc_preimages_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 2, holder_tx_ref, (int64_t)outbound_htlc_preimages_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneNoneZ validate_counterparty_revocation_LDKChannelSigner_jcall(const void* this_arg, uint64_t idx, const uint8_t (* secret)[32]) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       int64_t idx_conv = idx;
+       int8_tArray secret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(secret_arr->elems, *secret, 32);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 3, idx_conv, (int64_t)secret_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -1732,7 +1730,7 @@ LDKCResult_NoneNoneZ validate_holder_commitment_LDKChannelSigner_jcall(const voi
 }
 LDKThirtyTwoBytes channel_keys_id_LDKChannelSigner_jcall(const void* this_arg) {
        LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 3);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 4);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -1745,7 +1743,7 @@ void provide_channel_parameters_LDKChannelSigner_jcall(void* this_arg, const LDK
        channel_parameters_var = ChannelTransactionParameters_clone(&channel_parameters_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_var);
        channel_parameters_ref = tag_ptr(channel_parameters_var.inner, channel_parameters_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 4, channel_parameters_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 5, channel_parameters_ref);
 }
 static void LDKChannelSigner_JCalls_cloned(LDKChannelSigner* new_obj) {
        LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) new_obj->this_arg;
@@ -1766,6 +1764,7 @@ static inline LDKChannelSigner LDKChannelSigner_init (int64_t o, int64_t pubkeys
                .get_per_commitment_point = get_per_commitment_point_LDKChannelSigner_jcall,
                .release_commitment_secret = release_commitment_secret_LDKChannelSigner_jcall,
                .validate_holder_commitment = validate_holder_commitment_LDKChannelSigner_jcall,
+               .validate_counterparty_revocation = validate_counterparty_revocation_LDKChannelSigner_jcall,
                .channel_keys_id = channel_keys_id_LDKChannelSigner_jcall,
                .provide_channel_parameters = provide_channel_parameters_LDKChannelSigner_jcall,
                .free = LDKChannelSigner_JCalls_free,
@@ -1797,7 +1796,7 @@ int8_tArray  CS_LDK_ChannelSigner_release_commitment_secret(int64_t this_arg, in
        return ret_arr;
 }
 
-int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64_t holder_tx, ptrArray preimages) {
+int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64_t holder_tx, ptrArray outbound_htlc_preimages) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKChannelSigner* this_arg_conv = (LDKChannelSigner*)this_arg_ptr;
@@ -1806,23 +1805,36 @@ int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64
        holder_tx_conv.is_owned = ptr_is_owned(holder_tx);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_tx_conv);
        holder_tx_conv.is_owned = false;
-       LDKCVec_ThirtyTwoBytesZ preimages_constr;
-       preimages_constr.datalen = preimages->arr_len;
-       if (preimages_constr.datalen > 0)
-               preimages_constr.data = MALLOC(preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_constr;
+       outbound_htlc_preimages_constr.datalen = outbound_htlc_preimages->arr_len;
+       if (outbound_htlc_preimages_constr.datalen > 0)
+               outbound_htlc_preimages_constr.data = MALLOC(outbound_htlc_preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
        else
-               preimages_constr.data = NULL;
-       int8_tArray* preimages_vals = (void*) preimages->elems;
-       for (size_t i = 0; i < preimages_constr.datalen; i++) {
-               int8_tArray preimages_conv_8 = preimages_vals[i];
-               LDKThirtyTwoBytes preimages_conv_8_ref;
-               CHECK(preimages_conv_8->arr_len == 32);
-               memcpy(preimages_conv_8_ref.data, preimages_conv_8->elems, 32); FREE(preimages_conv_8);
-               preimages_constr.data[i] = preimages_conv_8_ref;
-       }
-       FREE(preimages);
+               outbound_htlc_preimages_constr.data = NULL;
+       int8_tArray* outbound_htlc_preimages_vals = (void*) outbound_htlc_preimages->elems;
+       for (size_t i = 0; i < outbound_htlc_preimages_constr.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8 = outbound_htlc_preimages_vals[i];
+               LDKThirtyTwoBytes outbound_htlc_preimages_conv_8_ref;
+               CHECK(outbound_htlc_preimages_conv_8->arr_len == 32);
+               memcpy(outbound_htlc_preimages_conv_8_ref.data, outbound_htlc_preimages_conv_8->elems, 32); FREE(outbound_htlc_preimages_conv_8);
+               outbound_htlc_preimages_constr.data[i] = outbound_htlc_preimages_conv_8_ref;
+       }
+       FREE(outbound_htlc_preimages);
        LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
-       *ret_conv = (this_arg_conv->validate_holder_commitment)(this_arg_conv->this_arg, &holder_tx_conv, preimages_constr);
+       *ret_conv = (this_arg_conv->validate_holder_commitment)(this_arg_conv->this_arg, &holder_tx_conv, outbound_htlc_preimages_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelSigner_validate_counterparty_revocation(int64_t this_arg, int64_t idx, int8_tArray secret) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelSigner* this_arg_conv = (LDKChannelSigner*)this_arg_ptr;
+       uint8_t secret_arr[32];
+       CHECK(secret->arr_len == 32);
+       memcpy(secret_arr, secret->elems, 32); FREE(secret);
+       uint8_t (*secret_ref)[32] = &secret_arr;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->validate_counterparty_revocation)(this_arg_conv->this_arg, idx, secret_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -1874,43 +1886,42 @@ static void LDKEcdsaChannelSigner_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKCommitmentTransaction * commitment_tx, LDKCVec_ThirtyTwoBytesZ preimages) {
+LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKCommitmentTransaction * commitment_tx, LDKCVec_ThirtyTwoBytesZ inbound_htlc_preimages, LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages) {
        LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
        LDKCommitmentTransaction commitment_tx_var = *commitment_tx;
        int64_t commitment_tx_ref = 0;
        commitment_tx_var = CommitmentTransaction_clone(&commitment_tx_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_tx_var);
        commitment_tx_ref = tag_ptr(commitment_tx_var.inner, commitment_tx_var.is_owned);
-       LDKCVec_ThirtyTwoBytesZ preimages_var = preimages;
-       ptrArray preimages_arr = NULL;
-       preimages_arr = init_ptrArray(preimages_var.datalen, __LINE__);
-       int8_tArray *preimages_arr_ptr = (int8_tArray*)(((uint8_t*)preimages_arr) + 8);
-       for (size_t i = 0; i < preimages_var.datalen; i++) {
-               int8_tArray preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
-               memcpy(preimages_conv_8_arr->elems, preimages_var.data[i].data, 32);
-               preimages_arr_ptr[i] = preimages_conv_8_arr;
+       LDKCVec_ThirtyTwoBytesZ inbound_htlc_preimages_var = inbound_htlc_preimages;
+       ptrArray inbound_htlc_preimages_arr = NULL;
+       inbound_htlc_preimages_arr = init_ptrArray(inbound_htlc_preimages_var.datalen, __LINE__);
+       int8_tArray *inbound_htlc_preimages_arr_ptr = (int8_tArray*)(((uint8_t*)inbound_htlc_preimages_arr) + 8);
+       for (size_t i = 0; i < inbound_htlc_preimages_var.datalen; i++) {
+               int8_tArray inbound_htlc_preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
+               memcpy(inbound_htlc_preimages_conv_8_arr->elems, inbound_htlc_preimages_var.data[i].data, 32);
+               inbound_htlc_preimages_arr_ptr[i] = inbound_htlc_preimages_conv_8_arr;
+       }
+       
+       FREE(inbound_htlc_preimages_var.data);
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_var = outbound_htlc_preimages;
+       ptrArray outbound_htlc_preimages_arr = NULL;
+       outbound_htlc_preimages_arr = init_ptrArray(outbound_htlc_preimages_var.datalen, __LINE__);
+       int8_tArray *outbound_htlc_preimages_arr_ptr = (int8_tArray*)(((uint8_t*)outbound_htlc_preimages_arr) + 8);
+       for (size_t i = 0; i < outbound_htlc_preimages_var.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
+               memcpy(outbound_htlc_preimages_conv_8_arr->elems, outbound_htlc_preimages_var.data[i].data, 32);
+               outbound_htlc_preimages_arr_ptr[i] = outbound_htlc_preimages_conv_8_arr;
        }
        
-       FREE(preimages_var.data);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 5, commitment_tx_ref, (int64_t)preimages_arr);
+       FREE(outbound_htlc_preimages_var.data);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 6, commitment_tx_ref, (int64_t)inbound_htlc_preimages_arr, (int64_t)outbound_htlc_preimages_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_NoneNoneZ validate_counterparty_revocation_LDKEcdsaChannelSigner_jcall(const void* this_arg, uint64_t idx, const uint8_t (* secret)[32]) {
-       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
-       int64_t idx_conv = idx;
-       int8_tArray secret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(secret_arr->elems, *secret, 32);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 6, idx_conv, (int64_t)secret_arr);
-       void* ret_ptr = untag_ptr(ret);
-       CHECK_ACCESS(ret_ptr);
-       LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
-       FREE(untag_ptr(ret));
-       return ret_conv;
-}
 LDKCResult_ECDSASignatureNoneZ sign_holder_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
        LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
        LDKHolderCommitmentTransaction commitment_tx_var = *commitment_tx;
@@ -2065,7 +2076,6 @@ static inline LDKEcdsaChannelSigner LDKEcdsaChannelSigner_init (int64_t o, int64
        LDKEcdsaChannelSigner ret = {
                .this_arg = (void*) calls,
                .sign_counterparty_commitment = sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall,
-               .validate_counterparty_revocation = validate_counterparty_revocation_LDKEcdsaChannelSigner_jcall,
                .sign_holder_commitment = sign_holder_commitment_LDKEcdsaChannelSigner_jcall,
                .sign_justice_revoked_output = sign_justice_revoked_output_LDKEcdsaChannelSigner_jcall,
                .sign_justice_revoked_htlc = sign_justice_revoked_htlc_LDKEcdsaChannelSigner_jcall,
@@ -2085,7 +2095,7 @@ uint64_t  CS_LDK_LDKEcdsaChannelSigner_new(int32_t o, int32_t ChannelSigner, int
        *res_ptr = LDKEcdsaChannelSigner_init(o, ChannelSigner, pubkeys);
        return tag_ptr(res_ptr, true);
 }
-int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment(int64_t this_arg, int64_t commitment_tx, ptrArray preimages) {
+int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment(int64_t this_arg, int64_t commitment_tx, ptrArray inbound_htlc_preimages, ptrArray outbound_htlc_preimages) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKEcdsaChannelSigner* this_arg_conv = (LDKEcdsaChannelSigner*)this_arg_ptr;
@@ -2094,36 +2104,38 @@ int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment(int64_t this_arg
        commitment_tx_conv.is_owned = ptr_is_owned(commitment_tx);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_tx_conv);
        commitment_tx_conv.is_owned = false;
-       LDKCVec_ThirtyTwoBytesZ preimages_constr;
-       preimages_constr.datalen = preimages->arr_len;
-       if (preimages_constr.datalen > 0)
-               preimages_constr.data = MALLOC(preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       LDKCVec_ThirtyTwoBytesZ inbound_htlc_preimages_constr;
+       inbound_htlc_preimages_constr.datalen = inbound_htlc_preimages->arr_len;
+       if (inbound_htlc_preimages_constr.datalen > 0)
+               inbound_htlc_preimages_constr.data = MALLOC(inbound_htlc_preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
        else
-               preimages_constr.data = NULL;
-       int8_tArray* preimages_vals = (void*) preimages->elems;
-       for (size_t i = 0; i < preimages_constr.datalen; i++) {
-               int8_tArray preimages_conv_8 = preimages_vals[i];
-               LDKThirtyTwoBytes preimages_conv_8_ref;
-               CHECK(preimages_conv_8->arr_len == 32);
-               memcpy(preimages_conv_8_ref.data, preimages_conv_8->elems, 32); FREE(preimages_conv_8);
-               preimages_constr.data[i] = preimages_conv_8_ref;
-       }
-       FREE(preimages);
+               inbound_htlc_preimages_constr.data = NULL;
+       int8_tArray* inbound_htlc_preimages_vals = (void*) inbound_htlc_preimages->elems;
+       for (size_t i = 0; i < inbound_htlc_preimages_constr.datalen; i++) {
+               int8_tArray inbound_htlc_preimages_conv_8 = inbound_htlc_preimages_vals[i];
+               LDKThirtyTwoBytes inbound_htlc_preimages_conv_8_ref;
+               CHECK(inbound_htlc_preimages_conv_8->arr_len == 32);
+               memcpy(inbound_htlc_preimages_conv_8_ref.data, inbound_htlc_preimages_conv_8->elems, 32); FREE(inbound_htlc_preimages_conv_8);
+               inbound_htlc_preimages_constr.data[i] = inbound_htlc_preimages_conv_8_ref;
+       }
+       FREE(inbound_htlc_preimages);
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_constr;
+       outbound_htlc_preimages_constr.datalen = outbound_htlc_preimages->arr_len;
+       if (outbound_htlc_preimages_constr.datalen > 0)
+               outbound_htlc_preimages_constr.data = MALLOC(outbound_htlc_preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       else
+               outbound_htlc_preimages_constr.data = NULL;
+       int8_tArray* outbound_htlc_preimages_vals = (void*) outbound_htlc_preimages->elems;
+       for (size_t i = 0; i < outbound_htlc_preimages_constr.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8 = outbound_htlc_preimages_vals[i];
+               LDKThirtyTwoBytes outbound_htlc_preimages_conv_8_ref;
+               CHECK(outbound_htlc_preimages_conv_8->arr_len == 32);
+               memcpy(outbound_htlc_preimages_conv_8_ref.data, outbound_htlc_preimages_conv_8->elems, 32); FREE(outbound_htlc_preimages_conv_8);
+               outbound_htlc_preimages_constr.data[i] = outbound_htlc_preimages_conv_8_ref;
+       }
+       FREE(outbound_htlc_preimages);
        LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = (this_arg_conv->sign_counterparty_commitment)(this_arg_conv->this_arg, &commitment_tx_conv, preimages_constr);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_EcdsaChannelSigner_validate_counterparty_revocation(int64_t this_arg, int64_t idx, int8_tArray secret) {
-       void* this_arg_ptr = untag_ptr(this_arg);
-       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
-       LDKEcdsaChannelSigner* this_arg_conv = (LDKEcdsaChannelSigner*)this_arg_ptr;
-       uint8_t secret_arr[32];
-       CHECK(secret->arr_len == 32);
-       memcpy(secret_arr, secret->elems, 32); FREE(secret);
-       uint8_t (*secret_ref)[32] = &secret_arr;
-       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
-       *ret_conv = (this_arg_conv->validate_counterparty_revocation)(this_arg_conv->this_arg, idx, secret_ref);
+       *ret_conv = (this_arg_conv->sign_counterparty_commitment)(this_arg_conv->this_arg, &commitment_tx_conv, inbound_htlc_preimages_constr, outbound_htlc_preimages_constr);
        return tag_ptr(ret_conv, true);
 }
 
@@ -2425,42 +2437,26 @@ jboolean CS_LDK_LDKCOption_boolZ_Some_get_some(int64_t ptr) {
        jboolean some_conv = obj->some;
        return some_conv;
 }
-static inline LDKCVec_CVec_u8ZZ CVec_CVec_u8ZZ_clone(const LDKCVec_CVec_u8ZZ *orig) {
-       LDKCVec_CVec_u8ZZ ret = { .data = MALLOC(sizeof(LDKCVec_u8Z) * orig->datalen, "LDKCVec_CVec_u8ZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = CVec_u8Z_clone(&orig->data[i]);
-       }
-       return ret;
-}
-static inline struct LDKCVec_CVec_u8ZZ CResult_CVec_CVec_u8ZZNoneZ_get_ok(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR owner){
+static inline struct LDKWitness CResult_WitnessNoneZ_get_ok(LDKCResult_WitnessNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return CVec_CVec_u8ZZ_clone(&*owner->contents.result);
+       return Witness_clone(&*owner->contents.result);
 }
-ptrArray  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_get_ok(int64_t owner) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* owner_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(owner);
-       LDKCVec_CVec_u8ZZ ret_var = CResult_CVec_CVec_u8ZZNoneZ_get_ok(owner_conv);
-       ptrArray ret_arr = NULL;
-       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
-       int8_tArray *ret_arr_ptr = (int8_tArray*)(((uint8_t*)ret_arr) + 8);
-       for (size_t i = 0; i < ret_var.datalen; i++) {
-               LDKCVec_u8Z ret_conv_8_var = ret_var.data[i];
-               int8_tArray ret_conv_8_arr = init_int8_tArray(ret_conv_8_var.datalen, __LINE__);
-               memcpy(ret_conv_8_arr->elems, ret_conv_8_var.data, ret_conv_8_var.datalen);
-               CVec_u8Z_free(ret_conv_8_var);
-               ret_arr_ptr[i] = ret_conv_8_arr;
-       }
-       
-       FREE(ret_var.data);
+int8_tArray  CS_LDK_CResult_WitnessNoneZ_get_ok(int64_t owner) {
+       LDKCResult_WitnessNoneZ* owner_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(owner);
+       LDKWitness ret_var = CResult_WitnessNoneZ_get_ok(owner_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       Witness_free(ret_var);
        return ret_arr;
 }
 
-static inline void CResult_CVec_CVec_u8ZZNoneZ_get_err(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR owner){
+static inline void CResult_WitnessNoneZ_get_err(LDKCResult_WitnessNoneZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return *owner->contents.err;
 }
-void  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_get_err(int64_t owner) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* owner_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(owner);
-       CResult_CVec_CVec_u8ZZNoneZ_get_err(owner_conv);
+void  CS_LDK_CResult_WitnessNoneZ_get_err(int64_t owner) {
+       LDKCResult_WitnessNoneZ* owner_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(owner);
+       CResult_WitnessNoneZ_get_err(owner_conv);
 }
 
 static inline struct LDKInMemorySigner CResult_InMemorySignerDecodeErrorZ_get_ok(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner){
@@ -2510,6 +2506,62 @@ void  CS_LDK_CResult_TransactionNoneZ_get_err(int64_t owner) {
        CResult_TransactionNoneZ_get_err(owner_conv);
 }
 
+uint32_t CS_LDK_LDKCandidateRouteHop_ty_from_ptr(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCandidateRouteHop_FirstHop: return 0;
+               case LDKCandidateRouteHop_PublicHop: return 1;
+               case LDKCandidateRouteHop_PrivateHop: return 2;
+               case LDKCandidateRouteHop_Blinded: return 3;
+               case LDKCandidateRouteHop_OneHopBlinded: return 4;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCandidateRouteHop_FirstHop_get_first_hop(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_FirstHop);
+       LDKFirstHopCandidate first_hop_var = obj->first_hop;
+                       int64_t first_hop_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(first_hop_var);
+                       first_hop_ref = tag_ptr(first_hop_var.inner, false);
+       return first_hop_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_PublicHop_get_public_hop(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_PublicHop);
+       LDKPublicHopCandidate public_hop_var = obj->public_hop;
+                       int64_t public_hop_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(public_hop_var);
+                       public_hop_ref = tag_ptr(public_hop_var.inner, false);
+       return public_hop_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_PrivateHop_get_private_hop(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_PrivateHop);
+       LDKPrivateHopCandidate private_hop_var = obj->private_hop;
+                       int64_t private_hop_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(private_hop_var);
+                       private_hop_ref = tag_ptr(private_hop_var.inner, false);
+       return private_hop_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_Blinded_get_blinded(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_Blinded);
+       LDKBlindedPathCandidate blinded_var = obj->blinded;
+                       int64_t blinded_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_var);
+                       blinded_ref = tag_ptr(blinded_var.inner, false);
+       return blinded_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_OneHopBlinded_get_one_hop_blinded(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_OneHopBlinded);
+       LDKOneHopBlindedPathCandidate one_hop_blinded_var = obj->one_hop_blinded;
+                       int64_t one_hop_blinded_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(one_hop_blinded_var);
+                       one_hop_blinded_ref = tag_ptr(one_hop_blinded_var.inner, false);
+       return one_hop_blinded_ref;
+}
 typedef struct LDKScoreLookUp_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -2520,19 +2572,11 @@ static void LDKScoreLookUp_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-uint64_t channel_penalty_msat_LDKScoreLookUp_jcall(const void* this_arg, uint64_t short_channel_id, const LDKNodeId * source, const LDKNodeId * target, LDKChannelUsage usage, const LDKProbabilisticScoringFeeParameters * score_params) {
+uint64_t channel_penalty_msat_LDKScoreLookUp_jcall(const void* this_arg, const LDKCandidateRouteHop * candidate, LDKChannelUsage usage, const LDKProbabilisticScoringFeeParameters * score_params) {
        LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) this_arg;
-       int64_t short_channel_id_conv = short_channel_id;
-       LDKNodeId source_var = *source;
-       int64_t source_ref = 0;
-       source_var = NodeId_clone(&source_var);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(source_var);
-       source_ref = tag_ptr(source_var.inner, source_var.is_owned);
-       LDKNodeId target_var = *target;
-       int64_t target_ref = 0;
-       target_var = NodeId_clone(&target_var);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(target_var);
-       target_ref = tag_ptr(target_var.inner, target_var.is_owned);
+       LDKCandidateRouteHop *ret_candidate = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop ret conversion");
+       *ret_candidate = CandidateRouteHop_clone(candidate);
+       int64_t ref_candidate = tag_ptr(ret_candidate, true);
        LDKChannelUsage usage_var = usage;
        int64_t usage_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(usage_var);
@@ -2542,7 +2586,7 @@ uint64_t channel_penalty_msat_LDKScoreLookUp_jcall(const void* this_arg, uint64_
        score_params_var = ProbabilisticScoringFeeParameters_clone(&score_params_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(score_params_var);
        score_params_ref = tag_ptr(score_params_var.inner, score_params_var.is_owned);
-       return js_invoke_function_l_lllll(j_calls->instance_ptr, 16, short_channel_id_conv, source_ref, target_ref, usage_ref, score_params_ref);
+       return js_invoke_function_l_lll(j_calls->instance_ptr, 16, ref_candidate, usage_ref, score_params_ref);
 }
 static void LDKScoreLookUp_JCalls_cloned(LDKScoreLookUp* new_obj) {
        LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) new_obj->this_arg;
@@ -2565,20 +2609,11 @@ uint64_t  CS_LDK_LDKScoreLookUp_new(int32_t o) {
        *res_ptr = LDKScoreLookUp_init(o);
        return tag_ptr(res_ptr, true);
 }
-int64_t  CS_LDK_ScoreLookUp_channel_penalty_msat(int64_t this_arg, int64_t short_channel_id, int64_t source, int64_t target, int64_t usage, int64_t score_params) {
+int64_t  CS_LDK_ScoreLookUp_channel_penalty_msat(int64_t this_arg, int64_t candidate, int64_t usage, int64_t score_params) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreLookUp* this_arg_conv = (LDKScoreLookUp*)this_arg_ptr;
-       LDKNodeId source_conv;
-       source_conv.inner = untag_ptr(source);
-       source_conv.is_owned = ptr_is_owned(source);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(source_conv);
-       source_conv.is_owned = false;
-       LDKNodeId target_conv;
-       target_conv.inner = untag_ptr(target);
-       target_conv.is_owned = ptr_is_owned(target);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(target_conv);
-       target_conv.is_owned = false;
+       LDKCandidateRouteHop* candidate_conv = (LDKCandidateRouteHop*)untag_ptr(candidate);
        LDKChannelUsage usage_conv;
        usage_conv.inner = untag_ptr(usage);
        usage_conv.is_owned = ptr_is_owned(usage);
@@ -2589,7 +2624,7 @@ int64_t  CS_LDK_ScoreLookUp_channel_penalty_msat(int64_t this_arg, int64_t short
        score_params_conv.is_owned = ptr_is_owned(score_params);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(score_params_conv);
        score_params_conv.is_owned = false;
-       int64_t ret_conv = (this_arg_conv->channel_penalty_msat)(this_arg_conv->this_arg, short_channel_id, &source_conv, &target_conv, usage_conv, &score_params_conv);
+       int64_t ret_conv = (this_arg_conv->channel_penalty_msat)(this_arg_conv->this_arg, candidate_conv, usage_conv, &score_params_conv);
        return ret_conv;
 }
 
@@ -2603,7 +2638,7 @@ static void LDKScoreUpdate_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
@@ -2611,18 +2646,20 @@ void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * pa
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
        int64_t short_channel_id_conv = short_channel_id;
-       js_invoke_function_void_ll(j_calls->instance_ptr, 17, path_ref, short_channel_id_conv);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_lll(j_calls->instance_ptr, 17, path_ref, short_channel_id_conv, duration_since_epoch_conv);
 }
-void payment_path_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+void payment_path_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
        path_var = Path_clone(&path_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 18, path_ref);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_ll(j_calls->instance_ptr, 18, path_ref, duration_since_epoch_conv);
 }
-void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
@@ -2630,16 +2667,23 @@ void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uin
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
        int64_t short_channel_id_conv = short_channel_id;
-       js_invoke_function_void_ll(j_calls->instance_ptr, 19, path_ref, short_channel_id_conv);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_lll(j_calls->instance_ptr, 19, path_ref, short_channel_id_conv, duration_since_epoch_conv);
 }
-void probe_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+void probe_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
        path_var = Path_clone(&path_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 20, path_ref);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_ll(j_calls->instance_ptr, 20, path_ref, duration_since_epoch_conv);
+}
+void time_passed_LDKScoreUpdate_jcall(void* this_arg, uint64_t duration_since_epoch) {
+       LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_l(j_calls->instance_ptr, 21, duration_since_epoch_conv);
 }
 static void LDKScoreUpdate_JCalls_cloned(LDKScoreUpdate* new_obj) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) new_obj->this_arg;
@@ -2656,6 +2700,7 @@ static inline LDKScoreUpdate LDKScoreUpdate_init (int64_t o) {
                .payment_path_successful = payment_path_successful_LDKScoreUpdate_jcall,
                .probe_failed = probe_failed_LDKScoreUpdate_jcall,
                .probe_successful = probe_successful_LDKScoreUpdate_jcall,
+               .time_passed = time_passed_LDKScoreUpdate_jcall,
                .free = LDKScoreUpdate_JCalls_free,
        };
        return ret;
@@ -2665,7 +2710,7 @@ uint64_t  CS_LDK_LDKScoreUpdate_new(int32_t o) {
        *res_ptr = LDKScoreUpdate_init(o);
        return tag_ptr(res_ptr, true);
 }
-void  CS_LDK_ScoreUpdate_payment_path_failed(int64_t this_arg, int64_t path, int64_t short_channel_id) {
+void  CS_LDK_ScoreUpdate_payment_path_failed(int64_t this_arg, int64_t path, int64_t short_channel_id, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2674,10 +2719,10 @@ void  CS_LDK_ScoreUpdate_payment_path_failed(int64_t this_arg, int64_t path, int
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->payment_path_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+       (this_arg_conv->payment_path_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id, duration_since_epoch);
 }
 
-void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path) {
+void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2686,10 +2731,10 @@ void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path)
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->payment_path_successful)(this_arg_conv->this_arg, &path_conv);
+       (this_arg_conv->payment_path_successful)(this_arg_conv->this_arg, &path_conv, duration_since_epoch);
 }
 
-void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t short_channel_id) {
+void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t short_channel_id, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2698,10 +2743,10 @@ void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t sh
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->probe_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+       (this_arg_conv->probe_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id, duration_since_epoch);
 }
 
-void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path) {
+void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2710,7 +2755,14 @@ void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path) {
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->probe_successful)(this_arg_conv->this_arg, &path_conv);
+       (this_arg_conv->probe_successful)(this_arg_conv->this_arg, &path_conv, duration_since_epoch);
+}
+
+void  CS_LDK_ScoreUpdate_time_passed(int64_t this_arg, int64_t duration_since_epoch) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
+       (this_arg_conv->time_passed)(this_arg_conv->this_arg, duration_since_epoch);
 }
 
 typedef struct LDKLockableScore_JCalls {
@@ -2725,7 +2777,7 @@ static void LDKLockableScore_JCalls_free(void* this_arg) {
 }
 LDKScoreLookUp read_lock_LDKLockableScore_jcall(const void* this_arg) {
        LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 21);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 22);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKScoreLookUp ret_conv = *(LDKScoreLookUp*)(ret_ptr);
@@ -2738,7 +2790,7 @@ LDKScoreLookUp read_lock_LDKLockableScore_jcall(const void* this_arg) {
 }
 LDKScoreUpdate write_lock_LDKLockableScore_jcall(const void* this_arg) {
        LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 22);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 23);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKScoreUpdate ret_conv = *(LDKScoreUpdate*)(ret_ptr);
@@ -2802,7 +2854,7 @@ static void LDKWriteableScore_JCalls_free(void* this_arg) {
 }
 LDKCVec_u8Z write_LDKWriteableScore_jcall(const void* this_arg) {
        LDKWriteableScore_JCalls *j_calls = (LDKWriteableScore_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 23);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 24);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
@@ -2918,6 +2970,124 @@ int64_t  CS_LDK_CResult_RouteLightningErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKBlindedPayInfo C2Tuple_BlindedPayInfoBlindedPathZ_get_a(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPayInfo ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_a(int64_t owner) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPayInfo ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_a(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath C2Tuple_BlindedPayInfoBlindedPathZ_get_b(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_b(int64_t owner) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_b(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_clone(const LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ *orig) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ) * orig->datalen, "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_BlindedPayInfoBlindedPathZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* owner_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ ret_var = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(owner_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t l = 0; l < ret_var.datalen; l++) {
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv_37_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+               *ret_conv_37_conv = ret_var.data[l];
+               ret_arr_ptr[l] = tag_ptr(ret_conv_37_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* owner_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(owner);
+       CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKOnionMessagePath CResult_OnionMessagePathNoneZ_get_ok(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
+       LDKOnionMessagePath ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_get_ok(int64_t owner) {
+       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
+       LDKOnionMessagePath ret_var = CResult_OnionMessagePathNoneZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline void CResult_OnionMessagePathNoneZ_get_err(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_OnionMessagePathNoneZ_get_err(int64_t owner) {
+       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
+       CResult_OnionMessagePathNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCVec_BlindedPathZ CResult_CVec_BlindedPathZNoneZ_get_ok(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_BlindedPathZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_BlindedPathZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_BlindedPathZNoneZ* owner_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(owner);
+       LDKCVec_BlindedPathZ ret_var = CResult_CVec_BlindedPathZNoneZ_get_ok(owner_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t n = 0; n < ret_var.datalen; n++) {
+               LDKBlindedPath ret_conv_13_var = ret_var.data[n];
+               int64_t ret_conv_13_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_13_var);
+               ret_conv_13_ref = tag_ptr(ret_conv_13_var.inner, ret_conv_13_var.is_owned);
+               ret_arr_ptr[n] = ret_conv_13_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_BlindedPathZNoneZ_get_err(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_BlindedPathZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_BlindedPathZNoneZ* owner_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(owner);
+       CResult_CVec_BlindedPathZNoneZ_get_err(owner_conv);
+}
+
 static inline struct LDKInFlightHtlcs CResult_InFlightHtlcsDecodeErrorZ_get_ok(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner){
        LDKInFlightHtlcs ret = *owner->contents.result;
        ret.is_owned = false;
@@ -3100,41 +3270,6 @@ int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
-static inline struct LDKBlindedPayInfo C2Tuple_BlindedPayInfoBlindedPathZ_get_a(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
-       LDKBlindedPayInfo ret = owner->a;
-       ret.is_owned = false;
-       return ret;
-}
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_a(int64_t owner) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
-       LDKBlindedPayInfo ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_a(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
-}
-
-static inline struct LDKBlindedPath C2Tuple_BlindedPayInfoBlindedPathZ_get_b(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
-       LDKBlindedPath ret = owner->b;
-       ret.is_owned = false;
-       return ret;
-}
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_b(int64_t owner) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
-       LDKBlindedPath ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_b(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
-}
-
-static inline LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_clone(const LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ *orig) {
-       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ) * orig->datalen, "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C2Tuple_BlindedPayInfoBlindedPathZ_clone(&orig->data[i]);
-       }
-       return ret;
-}
 static inline LDKCVec_RouteHintZ CVec_RouteHintZ_clone(const LDKCVec_RouteHintZ *orig) {
        LDKCVec_RouteHintZ ret = { .data = MALLOC(sizeof(LDKRouteHint) * orig->datalen, "LDKCVec_RouteHintZ clone bytes"), .datalen = orig->datalen };
        for (size_t i = 0; i < ret.datalen; i++) {
@@ -3347,14 +3482,13 @@ static void LDKLogger_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-void log_LDKLogger_jcall(const void* this_arg, const LDKRecord * record) {
+void log_LDKLogger_jcall(const void* this_arg, LDKRecord record) {
        LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) this_arg;
-       LDKRecord record_var = *record;
+       LDKRecord record_var = record;
        int64_t record_ref = 0;
-       record_var = Record_clone(&record_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(record_var);
        record_ref = tag_ptr(record_var.inner, record_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 24, record_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 25, record_ref);
 }
 static void LDKLogger_JCalls_cloned(LDKLogger* new_obj) {
        LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) new_obj->this_arg;
@@ -3430,31 +3564,40 @@ static inline LDKCVec_C2Tuple_usizeTransactionZZ CVec_C2Tuple_usizeTransactionZZ
        }
        return ret;
 }
-static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
+static inline struct LDKThirtyTwoBytes C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
        return ThirtyTwoBytes_clone(&owner->a);
 }
-int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(int64_t owner) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+int8_tArray  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(owner);
        int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(owner_conv).data, 32);
+       memcpy(ret_arr->elems, C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(owner_conv).data, 32);
        return ret_arr;
 }
 
-static inline struct LDKCOption_ThirtyTwoBytesZ C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
-       return COption_ThirtyTwoBytesZ_clone(&owner->b);
+static inline uint32_t C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
+       return owner->b;
 }
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(int64_t owner) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+int32_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+       int32_t ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKCOption_ThirtyTwoBytesZ C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
+       return COption_ThirtyTwoBytesZ_clone(&owner->c);
+}
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(owner);
        LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
-       *ret_copy = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(owner_conv);
+       *ret_copy = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(owner_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
 
-static inline LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ *orig) {
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ clone bytes"), .datalen = orig->datalen };
+static inline LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_clone(const LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ *orig) {
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ) * orig->datalen, "LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ clone bytes"), .datalen = orig->datalen };
        for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(&orig->data[i]);
+               ret.data[i] = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(&orig->data[i]);
        }
        return ret;
 }
@@ -3976,7 +4119,7 @@ LDKUtxoResult get_utxo_LDKUtxoLookup_jcall(const void* this_arg, const uint8_t (
        int8_tArray chain_hash_arr = init_int8_tArray(32, __LINE__);
        memcpy(chain_hash_arr->elems, *chain_hash, 32);
        int64_t short_channel_id_conv = short_channel_id;
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 25, (int64_t)chain_hash_arr, short_channel_id_conv);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 26, (int64_t)chain_hash_arr, short_channel_id_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKUtxoResult ret_conv = *(LDKUtxoResult*)(ret_ptr);
@@ -4213,32 +4356,36 @@ uint32_t CS_LDK_LDKMessageSendEvent_ty_from_ptr(int64_t ptr) {
                case LDKMessageSendEvent_SendOpenChannelV2: return 3;
                case LDKMessageSendEvent_SendFundingCreated: return 4;
                case LDKMessageSendEvent_SendFundingSigned: return 5;
-               case LDKMessageSendEvent_SendTxAddInput: return 6;
-               case LDKMessageSendEvent_SendTxAddOutput: return 7;
-               case LDKMessageSendEvent_SendTxRemoveInput: return 8;
-               case LDKMessageSendEvent_SendTxRemoveOutput: return 9;
-               case LDKMessageSendEvent_SendTxComplete: return 10;
-               case LDKMessageSendEvent_SendTxSignatures: return 11;
-               case LDKMessageSendEvent_SendTxInitRbf: return 12;
-               case LDKMessageSendEvent_SendTxAckRbf: return 13;
-               case LDKMessageSendEvent_SendTxAbort: return 14;
-               case LDKMessageSendEvent_SendChannelReady: return 15;
-               case LDKMessageSendEvent_SendAnnouncementSignatures: return 16;
-               case LDKMessageSendEvent_UpdateHTLCs: return 17;
-               case LDKMessageSendEvent_SendRevokeAndACK: return 18;
-               case LDKMessageSendEvent_SendClosingSigned: return 19;
-               case LDKMessageSendEvent_SendShutdown: return 20;
-               case LDKMessageSendEvent_SendChannelReestablish: return 21;
-               case LDKMessageSendEvent_SendChannelAnnouncement: return 22;
-               case LDKMessageSendEvent_BroadcastChannelAnnouncement: return 23;
-               case LDKMessageSendEvent_BroadcastChannelUpdate: return 24;
-               case LDKMessageSendEvent_BroadcastNodeAnnouncement: return 25;
-               case LDKMessageSendEvent_SendChannelUpdate: return 26;
-               case LDKMessageSendEvent_HandleError: return 27;
-               case LDKMessageSendEvent_SendChannelRangeQuery: return 28;
-               case LDKMessageSendEvent_SendShortIdsQuery: return 29;
-               case LDKMessageSendEvent_SendReplyChannelRange: return 30;
-               case LDKMessageSendEvent_SendGossipTimestampFilter: return 31;
+               case LDKMessageSendEvent_SendStfu: return 6;
+               case LDKMessageSendEvent_SendSplice: return 7;
+               case LDKMessageSendEvent_SendSpliceAck: return 8;
+               case LDKMessageSendEvent_SendSpliceLocked: return 9;
+               case LDKMessageSendEvent_SendTxAddInput: return 10;
+               case LDKMessageSendEvent_SendTxAddOutput: return 11;
+               case LDKMessageSendEvent_SendTxRemoveInput: return 12;
+               case LDKMessageSendEvent_SendTxRemoveOutput: return 13;
+               case LDKMessageSendEvent_SendTxComplete: return 14;
+               case LDKMessageSendEvent_SendTxSignatures: return 15;
+               case LDKMessageSendEvent_SendTxInitRbf: return 16;
+               case LDKMessageSendEvent_SendTxAckRbf: return 17;
+               case LDKMessageSendEvent_SendTxAbort: return 18;
+               case LDKMessageSendEvent_SendChannelReady: return 19;
+               case LDKMessageSendEvent_SendAnnouncementSignatures: return 20;
+               case LDKMessageSendEvent_UpdateHTLCs: return 21;
+               case LDKMessageSendEvent_SendRevokeAndACK: return 22;
+               case LDKMessageSendEvent_SendClosingSigned: return 23;
+               case LDKMessageSendEvent_SendShutdown: return 24;
+               case LDKMessageSendEvent_SendChannelReestablish: return 25;
+               case LDKMessageSendEvent_SendChannelAnnouncement: return 26;
+               case LDKMessageSendEvent_BroadcastChannelAnnouncement: return 27;
+               case LDKMessageSendEvent_BroadcastChannelUpdate: return 28;
+               case LDKMessageSendEvent_BroadcastNodeAnnouncement: return 29;
+               case LDKMessageSendEvent_SendChannelUpdate: return 30;
+               case LDKMessageSendEvent_HandleError: return 31;
+               case LDKMessageSendEvent_SendChannelRangeQuery: return 32;
+               case LDKMessageSendEvent_SendShortIdsQuery: return 33;
+               case LDKMessageSendEvent_SendReplyChannelRange: return 34;
+               case LDKMessageSendEvent_SendGossipTimestampFilter: return 35;
                default: abort();
        }
 }
@@ -4338,6 +4485,70 @@ int64_t CS_LDK_LDKMessageSendEvent_SendFundingSigned_get_msg(int64_t ptr) {
                        msg_ref = tag_ptr(msg_var.inner, false);
        return msg_ref;
 }
+int8_tArray CS_LDK_LDKMessageSendEvent_SendStfu_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendStfu);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_stfu.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendStfu_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendStfu);
+       LDKStfu msg_var = obj->send_stfu.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendSplice_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSplice);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_splice.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendSplice_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSplice);
+       LDKSplice msg_var = obj->send_splice.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendSpliceAck_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceAck);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_splice_ack.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendSpliceAck_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceAck);
+       LDKSpliceAck msg_var = obj->send_splice_ack.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendSpliceLocked_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceLocked);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_splice_locked.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendSpliceLocked_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceLocked);
+       LDKSpliceLocked msg_var = obj->send_splice_locked.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
 int8_tArray CS_LDK_LDKMessageSendEvent_SendTxAddInput_get_node_id(int64_t ptr) {
        LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
        CHECK(obj->tag == LDKMessageSendEvent_SendTxAddInput);
@@ -5050,6 +5261,34 @@ int64_tArray CS_LDK_LDKCOption_CVec_SocketAddressZZ_Some_get_some(int64_t ptr) {
                        
        return some_arr;
 }
+static inline struct LDKPendingHTLCInfo CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(LDKCResult_PendingHTLCInfoInboundHTLCErrZ *NONNULL_PTR owner){
+       LDKPendingHTLCInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(int64_t owner) {
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* owner_conv = (LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)untag_ptr(owner);
+       LDKPendingHTLCInfo ret_var = CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKInboundHTLCErr CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(LDKCResult_PendingHTLCInfoInboundHTLCErrZ *NONNULL_PTR owner){
+       LDKInboundHTLCErr ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(int64_t owner) {
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* owner_conv = (LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)untag_ptr(owner);
+       LDKInboundHTLCErr ret_var = CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 static inline LDKCVec_HTLCOutputInCommitmentZ CVec_HTLCOutputInCommitmentZ_clone(const LDKCVec_HTLCOutputInCommitmentZ *orig) {
        LDKCVec_HTLCOutputInCommitmentZ ret = { .data = MALLOC(sizeof(LDKHTLCOutputInCommitment) * orig->datalen, "LDKCVec_HTLCOutputInCommitmentZ clone bytes"), .datalen = orig->datalen };
        for (size_t i = 0; i < ret.datalen; i++) {
@@ -5849,6 +6088,231 @@ int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKBlindedForward CResult_BlindedForwardDecodeErrorZ_get_ok(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedForward ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedForwardDecodeErrorZ* owner_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedForward ret_var = CResult_BlindedForwardDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_BlindedForwardDecodeErrorZ_get_err(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedForwardDecodeErrorZ* owner_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedForwardDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKPendingHTLCRouting_ty_from_ptr(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPendingHTLCRouting_Forward: return 0;
+               case LDKPendingHTLCRouting_Receive: return 1;
+               case LDKPendingHTLCRouting_ReceiveKeysend: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Forward_get_onion_packet(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Forward);
+       LDKOnionPacket onion_packet_var = obj->forward.onion_packet;
+                       int64_t onion_packet_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_packet_var);
+                       onion_packet_ref = tag_ptr(onion_packet_var.inner, false);
+       return onion_packet_ref;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Forward_get_short_channel_id(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Forward);
+       int64_t short_channel_id_conv = obj->forward.short_channel_id;
+       return short_channel_id_conv;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Forward_get_blinded(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Forward);
+       LDKBlindedForward blinded_var = obj->forward.blinded;
+                       int64_t blinded_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_var);
+                       blinded_ref = tag_ptr(blinded_var.inner, false);
+       return blinded_ref;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Receive_get_payment_data(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       LDKFinalOnionHopData payment_data_var = obj->receive.payment_data;
+                       int64_t payment_data_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_var);
+                       payment_data_ref = tag_ptr(payment_data_var.inner, false);
+       return payment_data_ref;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Receive_get_payment_metadata(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       int64_t payment_metadata_ref = tag_ptr(&obj->receive.payment_metadata, false);
+       return payment_metadata_ref;
+}
+int32_t CS_LDK_LDKPendingHTLCRouting_Receive_get_incoming_cltv_expiry(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       int32_t incoming_cltv_expiry_conv = obj->receive.incoming_cltv_expiry;
+       return incoming_cltv_expiry_conv;
+}
+int8_tArray CS_LDK_LDKPendingHTLCRouting_Receive_get_phantom_shared_secret(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       int8_tArray phantom_shared_secret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(phantom_shared_secret_arr->elems, obj->receive.phantom_shared_secret.data, 32);
+       return phantom_shared_secret_arr;
+}
+int64_tArray CS_LDK_LDKPendingHTLCRouting_Receive_get_custom_tlvs(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_var = obj->receive.custom_tlvs;
+                       int64_tArray custom_tlvs_arr = NULL;
+                       custom_tlvs_arr = init_int64_tArray(custom_tlvs_var.datalen, __LINE__);
+                       int64_t *custom_tlvs_arr_ptr = (int64_t*)(((uint8_t*)custom_tlvs_arr) + 8);
+                       for (size_t x = 0; x < custom_tlvs_var.datalen; x++) {
+                               LDKC2Tuple_u64CVec_u8ZZ* custom_tlvs_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+                               *custom_tlvs_conv_23_conv = custom_tlvs_var.data[x];
+                               *custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone(custom_tlvs_conv_23_conv);
+                               custom_tlvs_arr_ptr[x] = tag_ptr(custom_tlvs_conv_23_conv, true);
+                       }
+                       
+       return custom_tlvs_arr;
+}
+jboolean CS_LDK_LDKPendingHTLCRouting_Receive_get_requires_blinded_error(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       jboolean requires_blinded_error_conv = obj->receive.requires_blinded_error;
+       return requires_blinded_error_conv;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_data(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       LDKFinalOnionHopData payment_data_var = obj->receive_keysend.payment_data;
+                       int64_t payment_data_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_var);
+                       payment_data_ref = tag_ptr(payment_data_var.inner, false);
+       return payment_data_ref;
+}
+int8_tArray CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_preimage(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       int8_tArray payment_preimage_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_preimage_arr->elems, obj->receive_keysend.payment_preimage.data, 32);
+       return payment_preimage_arr;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_metadata(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       int64_t payment_metadata_ref = tag_ptr(&obj->receive_keysend.payment_metadata, false);
+       return payment_metadata_ref;
+}
+int32_t CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_incoming_cltv_expiry(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       int32_t incoming_cltv_expiry_conv = obj->receive_keysend.incoming_cltv_expiry;
+       return incoming_cltv_expiry_conv;
+}
+int64_tArray CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_custom_tlvs(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_var = obj->receive_keysend.custom_tlvs;
+                       int64_tArray custom_tlvs_arr = NULL;
+                       custom_tlvs_arr = init_int64_tArray(custom_tlvs_var.datalen, __LINE__);
+                       int64_t *custom_tlvs_arr_ptr = (int64_t*)(((uint8_t*)custom_tlvs_arr) + 8);
+                       for (size_t x = 0; x < custom_tlvs_var.datalen; x++) {
+                               LDKC2Tuple_u64CVec_u8ZZ* custom_tlvs_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+                               *custom_tlvs_conv_23_conv = custom_tlvs_var.data[x];
+                               *custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone(custom_tlvs_conv_23_conv);
+                               custom_tlvs_arr_ptr[x] = tag_ptr(custom_tlvs_conv_23_conv, true);
+                       }
+                       
+       return custom_tlvs_arr;
+}
+static inline struct LDKPendingHTLCRouting CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PendingHTLCRouting_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(owner);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_PendingHTLCRoutingDecodeErrorZ_get_err(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PendingHTLCRoutingDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPendingHTLCInfo CResult_PendingHTLCInfoDecodeErrorZ_get_ok(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKPendingHTLCInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKPendingHTLCInfo ret_var = CResult_PendingHTLCInfoDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_PendingHTLCInfoDecodeErrorZ_get_err(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PendingHTLCInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline enum LDKBlindedFailure CResult_BlindedFailureDecodeErrorZ_get_ok(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return BlindedFailure_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedFailureDecodeErrorZ* owner_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBlindedFailure_to_cs(CResult_BlindedFailureDecodeErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDecodeError CResult_BlindedFailureDecodeErrorZ_get_err(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedFailureDecodeErrorZ* owner_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedFailureDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline enum LDKChannelShutdownState CResult_ChannelShutdownStateDecodeErrorZ_get_ok(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
        return ChannelShutdownState_clone(&*owner->contents.result);
@@ -5898,7 +6362,7 @@ LDKCResult_ChannelMonitorUpdateStatusNoneZ watch_channel_LDKWatch_jcall(const vo
        int64_t monitor_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(monitor_var);
        monitor_ref = tag_ptr(monitor_var.inner, monitor_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 26, funding_txo_ref, monitor_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 27, funding_txo_ref, monitor_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ChannelMonitorUpdateStatusNoneZ ret_conv = *(LDKCResult_ChannelMonitorUpdateStatusNoneZ*)(ret_ptr);
@@ -5916,13 +6380,13 @@ LDKChannelMonitorUpdateStatus update_channel_LDKWatch_jcall(const void* this_arg
        update_var = ChannelMonitorUpdate_clone(&update_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(update_var);
        update_ref = tag_ptr(update_var.inner, update_var.is_owned);
-       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_ll(j_calls->instance_ptr, 27, funding_txo_ref, update_ref);
+       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_ll(j_calls->instance_ptr, 28, funding_txo_ref, update_ref);
        LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
        return ret_conv;
 }
 LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ release_pending_monitor_events_LDKWatch_jcall(const void* this_arg) {
        LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 28);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 29);
        LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -6044,7 +6508,7 @@ void broadcast_transactions_LDKBroadcasterInterface_jcall(const void* this_arg,
        }
        
        FREE(txs_var.data);
-       js_invoke_function_void_l(j_calls->instance_ptr, 29, (int64_t)txs_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 30, (int64_t)txs_arr);
 }
 static void LDKBroadcasterInterface_JCalls_cloned(LDKBroadcasterInterface* new_obj) {
        LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) new_obj->this_arg;
@@ -6103,7 +6567,7 @@ static void LDKEntropySource_JCalls_free(void* this_arg) {
 }
 LDKThirtyTwoBytes get_secure_random_bytes_LDKEntropySource_jcall(const void* this_arg) {
        LDKEntropySource_JCalls *j_calls = (LDKEntropySource_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 30);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 31);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -6187,7 +6651,7 @@ static void LDKNodeSigner_JCalls_free(void* this_arg) {
 }
 LDKThirtyTwoBytes get_inbound_payment_key_material_LDKNodeSigner_jcall(const void* this_arg) {
        LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 31);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 32);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -6196,7 +6660,7 @@ LDKThirtyTwoBytes get_inbound_payment_key_material_LDKNodeSigner_jcall(const voi
 LDKCResult_PublicKeyNoneZ get_node_id_LDKNodeSigner_jcall(const void* this_arg, LDKRecipient recipient) {
        LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
        int32_t recipient_conv = LDKRecipient_to_cs(recipient);
-       uint64_t ret = js_invoke_function_l_Recipient(j_calls->instance_ptr, 32, recipient_conv);
+       uint64_t ret = js_invoke_function_l_Recipient(j_calls->instance_ptr, 33, recipient_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_PublicKeyNoneZ ret_conv = *(LDKCResult_PublicKeyNoneZ*)(ret_ptr);
@@ -6211,7 +6675,7 @@ LDKCResult_ThirtyTwoBytesNoneZ ecdh_LDKNodeSigner_jcall(const void* this_arg, LD
        LDKCOption_BigEndianScalarZ *tweak_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
        *tweak_copy = tweak;
        int64_t tweak_ref = tag_ptr(tweak_copy, true);
-       uint64_t ret = js_invoke_function_l_Recipientll(j_calls->instance_ptr, 33, recipient_conv, (int64_t)other_key_arr, tweak_ref);
+       uint64_t ret = js_invoke_function_l_Recipientll(j_calls->instance_ptr, 34, recipient_conv, (int64_t)other_key_arr, tweak_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ThirtyTwoBytesNoneZ ret_conv = *(LDKCResult_ThirtyTwoBytesNoneZ*)(ret_ptr);
@@ -6234,7 +6698,7 @@ LDKCResult_RecoverableSignatureNoneZ sign_invoice_LDKNodeSigner_jcall(const void
        
        FREE(invoice_data_var.data);
        int32_t recipient_conv = LDKRecipient_to_cs(recipient);
-       uint64_t ret = js_invoke_function_l_llRecipient(j_calls->instance_ptr, 34, (int64_t)hrp_bytes_arr, (int64_t)invoice_data_arr, recipient_conv);
+       uint64_t ret = js_invoke_function_l_llRecipient(j_calls->instance_ptr, 35, (int64_t)hrp_bytes_arr, (int64_t)invoice_data_arr, recipient_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_RecoverableSignatureNoneZ ret_conv = *(LDKCResult_RecoverableSignatureNoneZ*)(ret_ptr);
@@ -6248,7 +6712,7 @@ LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_request_LDKNodeSigner_jcall
        // WARNING: we may need a move here but no clone is available for LDKUnsignedInvoiceRequest
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_request_var);
        invoice_request_ref = tag_ptr(invoice_request_var.inner, invoice_request_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 35, invoice_request_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 36, invoice_request_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
@@ -6262,7 +6726,7 @@ LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_LDKNodeSigner_jcall(const v
        // WARNING: we may need a move here but no clone is available for LDKUnsignedBolt12Invoice
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_var);
        invoice_ref = tag_ptr(invoice_var.inner, invoice_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 36, invoice_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 37, invoice_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
@@ -6274,7 +6738,7 @@ LDKCResult_ECDSASignatureNoneZ sign_gossip_message_LDKNodeSigner_jcall(const voi
        LDKUnsignedGossipMessage *msg_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
        *msg_copy = msg;
        int64_t msg_ref = tag_ptr(msg_copy, true);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 37, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 38, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
@@ -6428,7 +6892,7 @@ LDKThirtyTwoBytes generate_channel_keys_id_LDKSignerProvider_jcall(const void* t
        int64_t channel_value_satoshis_conv = channel_value_satoshis;
        int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
        memcpy(user_channel_id_arr->elems, user_channel_id.le_bytes, 16);
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_bll(j_calls->instance_ptr, 38, inbound_conv, channel_value_satoshis_conv, (int64_t)user_channel_id_arr);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_bll(j_calls->instance_ptr, 39, inbound_conv, channel_value_satoshis_conv, (int64_t)user_channel_id_arr);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -6439,7 +6903,7 @@ LDKWriteableEcdsaChannelSigner derive_channel_signer_LDKSignerProvider_jcall(con
        int64_t channel_value_satoshis_conv = channel_value_satoshis;
        int8_tArray channel_keys_id_arr = init_int8_tArray(32, __LINE__);
        memcpy(channel_keys_id_arr->elems, channel_keys_id.data, 32);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 39, channel_value_satoshis_conv, (int64_t)channel_keys_id_arr);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 40, channel_value_satoshis_conv, (int64_t)channel_keys_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKWriteableEcdsaChannelSigner ret_conv = *(LDKWriteableEcdsaChannelSigner*)(ret_ptr);
@@ -6451,16 +6915,18 @@ LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ read_chan_signer_LDKSignerPro
        LDKu8slice reader_var = reader;
        int8_tArray reader_arr = init_int8_tArray(reader_var.datalen, __LINE__);
        memcpy(reader_arr->elems, reader_var.data, reader_var.datalen);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 40, (int64_t)reader_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 41, (int64_t)reader_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ ret_conv = *(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_CVec_u8ZNoneZ get_destination_script_LDKSignerProvider_jcall(const void* this_arg) {
+LDKCResult_CVec_u8ZNoneZ get_destination_script_LDKSignerProvider_jcall(const void* this_arg, LDKThirtyTwoBytes channel_keys_id) {
        LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 41);
+       int8_tArray channel_keys_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_keys_id_arr->elems, channel_keys_id.data, 32);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 42, (int64_t)channel_keys_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_u8ZNoneZ ret_conv = *(LDKCResult_CVec_u8ZNoneZ*)(ret_ptr);
@@ -6469,7 +6935,7 @@ LDKCResult_CVec_u8ZNoneZ get_destination_script_LDKSignerProvider_jcall(const vo
 }
 LDKCResult_ShutdownScriptNoneZ get_shutdown_scriptpubkey_LDKSignerProvider_jcall(const void* this_arg) {
        LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 42);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 43);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ShutdownScriptNoneZ ret_conv = *(LDKCResult_ShutdownScriptNoneZ*)(ret_ptr);
@@ -6538,12 +7004,15 @@ int64_t  CS_LDK_SignerProvider_read_chan_signer(int64_t this_arg, int8_tArray re
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_SignerProvider_get_destination_script(int64_t this_arg) {
+int64_t  CS_LDK_SignerProvider_get_destination_script(int64_t this_arg, int8_tArray channel_keys_id) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKSignerProvider* this_arg_conv = (LDKSignerProvider*)this_arg_ptr;
+       LDKThirtyTwoBytes channel_keys_id_ref;
+       CHECK(channel_keys_id->arr_len == 32);
+       memcpy(channel_keys_id_ref.data, channel_keys_id->elems, 32); FREE(channel_keys_id);
        LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
-       *ret_conv = (this_arg_conv->get_destination_script)(this_arg_conv->this_arg);
+       *ret_conv = (this_arg_conv->get_destination_script)(this_arg_conv->this_arg, channel_keys_id_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -6569,7 +7038,7 @@ static void LDKFeeEstimator_JCalls_free(void* this_arg) {
 uint32_t get_est_sat_per_1000_weight_LDKFeeEstimator_jcall(const void* this_arg, LDKConfirmationTarget confirmation_target) {
        LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) this_arg;
        int32_t confirmation_target_conv = LDKConfirmationTarget_to_cs(confirmation_target);
-       return js_invoke_function_i_ConfirmationTarget(j_calls->instance_ptr, 43, confirmation_target_conv);
+       return js_invoke_function_i_ConfirmationTarget(j_calls->instance_ptr, 44, confirmation_target_conv);
 }
 static void LDKFeeEstimator_JCalls_cloned(LDKFeeEstimator* new_obj) {
        LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) new_obj->this_arg;
@@ -6601,9 +7070,147 @@ int32_t  CS_LDK_FeeEstimator_get_est_sat_per_1000_weight(int64_t this_arg, int32
        return ret_conv;
 }
 
+typedef struct LDKMessageRouter_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKMessageRouter_JCalls;
+static void LDKMessageRouter_JCalls_free(void* this_arg) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_OnionMessagePathNoneZ find_path_LDKMessageRouter_jcall(const void* this_arg, LDKPublicKey sender, LDKCVec_PublicKeyZ peers, LDKDestination destination) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
+       int8_tArray sender_arr = init_int8_tArray(33, __LINE__);
+       memcpy(sender_arr->elems, sender.compressed_form, 33);
+       LDKCVec_PublicKeyZ peers_var = peers;
+       ptrArray peers_arr = NULL;
+       peers_arr = init_ptrArray(peers_var.datalen, __LINE__);
+       int8_tArray *peers_arr_ptr = (int8_tArray*)(((uint8_t*)peers_arr) + 8);
+       for (size_t i = 0; i < peers_var.datalen; i++) {
+               int8_tArray peers_conv_8_arr = init_int8_tArray(33, __LINE__);
+               memcpy(peers_conv_8_arr->elems, peers_var.data[i].compressed_form, 33);
+               peers_arr_ptr[i] = peers_conv_8_arr;
+       }
+       
+       FREE(peers_var.data);
+       LDKDestination *destination_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *destination_copy = destination;
+       int64_t destination_ref = tag_ptr(destination_copy, true);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 45, (int64_t)sender_arr, (int64_t)peers_arr, destination_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_OnionMessagePathNoneZ ret_conv = *(LDKCResult_OnionMessagePathNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_CVec_BlindedPathZNoneZ create_blinded_paths_LDKMessageRouter_jcall(const void* this_arg, LDKPublicKey recipient, LDKCVec_PublicKeyZ peers) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
+       int8_tArray recipient_arr = init_int8_tArray(33, __LINE__);
+       memcpy(recipient_arr->elems, recipient.compressed_form, 33);
+       LDKCVec_PublicKeyZ peers_var = peers;
+       ptrArray peers_arr = NULL;
+       peers_arr = init_ptrArray(peers_var.datalen, __LINE__);
+       int8_tArray *peers_arr_ptr = (int8_tArray*)(((uint8_t*)peers_arr) + 8);
+       for (size_t i = 0; i < peers_var.datalen; i++) {
+               int8_tArray peers_conv_8_arr = init_int8_tArray(33, __LINE__);
+               memcpy(peers_conv_8_arr->elems, peers_var.data[i].compressed_form, 33);
+               peers_arr_ptr[i] = peers_conv_8_arr;
+       }
+       
+       FREE(peers_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 46, (int64_t)recipient_arr, (int64_t)peers_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_BlindedPathZNoneZ ret_conv = *(LDKCResult_CVec_BlindedPathZNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKMessageRouter_JCalls_cloned(LDKMessageRouter* new_obj) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKMessageRouter LDKMessageRouter_init (int64_t o) {
+       LDKMessageRouter_JCalls *calls = MALLOC(sizeof(LDKMessageRouter_JCalls), "LDKMessageRouter_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKMessageRouter ret = {
+               .this_arg = (void*) calls,
+               .find_path = find_path_LDKMessageRouter_jcall,
+               .create_blinded_paths = create_blinded_paths_LDKMessageRouter_jcall,
+               .free = LDKMessageRouter_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKMessageRouter_new(int32_t o) {
+       LDKMessageRouter *res_ptr = MALLOC(sizeof(LDKMessageRouter), "LDKMessageRouter");
+       *res_ptr = LDKMessageRouter_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_MessageRouter_find_path(int64_t this_arg, int8_tArray sender, ptrArray peers, int64_t destination) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKMessageRouter* this_arg_conv = (LDKMessageRouter*)this_arg_ptr;
+       LDKPublicKey sender_ref;
+       CHECK(sender->arr_len == 33);
+       memcpy(sender_ref.compressed_form, sender->elems, 33); FREE(sender);
+       LDKCVec_PublicKeyZ peers_constr;
+       peers_constr.datalen = peers->arr_len;
+       if (peers_constr.datalen > 0)
+               peers_constr.data = MALLOC(peers_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               peers_constr.data = NULL;
+       int8_tArray* peers_vals = (void*) peers->elems;
+       for (size_t i = 0; i < peers_constr.datalen; i++) {
+               int8_tArray peers_conv_8 = peers_vals[i];
+               LDKPublicKey peers_conv_8_ref;
+               CHECK(peers_conv_8->arr_len == 33);
+               memcpy(peers_conv_8_ref.compressed_form, peers_conv_8->elems, 33); FREE(peers_conv_8);
+               peers_constr.data[i] = peers_conv_8_ref;
+       }
+       FREE(peers);
+       void* destination_ptr = untag_ptr(destination);
+       CHECK_ACCESS(destination_ptr);
+       LDKDestination destination_conv = *(LDKDestination*)(destination_ptr);
+       destination_conv = Destination_clone((LDKDestination*)untag_ptr(destination));
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = (this_arg_conv->find_path)(this_arg_conv->this_arg, sender_ref, peers_constr, destination_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MessageRouter_create_blinded_paths(int64_t this_arg, int8_tArray recipient, ptrArray peers) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKMessageRouter* this_arg_conv = (LDKMessageRouter*)this_arg_ptr;
+       LDKPublicKey recipient_ref;
+       CHECK(recipient->arr_len == 33);
+       memcpy(recipient_ref.compressed_form, recipient->elems, 33); FREE(recipient);
+       LDKCVec_PublicKeyZ peers_constr;
+       peers_constr.datalen = peers->arr_len;
+       if (peers_constr.datalen > 0)
+               peers_constr.data = MALLOC(peers_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               peers_constr.data = NULL;
+       int8_tArray* peers_vals = (void*) peers->elems;
+       for (size_t i = 0; i < peers_constr.datalen; i++) {
+               int8_tArray peers_conv_8 = peers_vals[i];
+               LDKPublicKey peers_conv_8_ref;
+               CHECK(peers_conv_8->arr_len == 33);
+               memcpy(peers_conv_8_ref.compressed_form, peers_conv_8->elems, 33); FREE(peers_conv_8);
+               peers_constr.data[i] = peers_conv_8_ref;
+       }
+       FREE(peers);
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = (this_arg_conv->create_blinded_paths)(this_arg_conv->this_arg, recipient_ref, peers_constr);
+       return tag_ptr(ret_conv, true);
+}
+
 typedef struct LDKRouter_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
+       LDKMessageRouter_JCalls* MessageRouter;
 } LDKRouter_JCalls;
 static void LDKRouter_JCalls_free(void* this_arg) {
        LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
@@ -6639,7 +7246,7 @@ LDKCResult_RouteLightningErrorZ find_route_LDKRouter_jcall(const void* this_arg,
        int64_t inflight_htlcs_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_var);
        inflight_htlcs_ref = tag_ptr(inflight_htlcs_var.inner, inflight_htlcs_var.is_owned);
-       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 44, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref);
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 47, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_RouteLightningErrorZ ret_conv = *(LDKCResult_RouteLightningErrorZ*)(ret_ptr);
@@ -6678,18 +7285,48 @@ LDKCResult_RouteLightningErrorZ find_route_with_id_LDKRouter_jcall(const void* t
        memcpy(_payment_hash_arr->elems, _payment_hash.data, 32);
        int8_tArray _payment_id_arr = init_int8_tArray(32, __LINE__);
        memcpy(_payment_id_arr->elems, _payment_id.data, 32);
-       uint64_t ret = js_invoke_function_l_llllll(j_calls->instance_ptr, 45, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref, (int64_t)_payment_hash_arr, (int64_t)_payment_id_arr);
+       uint64_t ret = js_invoke_function_l_llllll(j_calls->instance_ptr, 48, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref, (int64_t)_payment_hash_arr, (int64_t)_payment_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_RouteLightningErrorZ ret_conv = *(LDKCResult_RouteLightningErrorZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
+LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ create_blinded_payment_paths_LDKRouter_jcall(const void* this_arg, LDKPublicKey recipient, LDKCVec_ChannelDetailsZ first_hops, LDKReceiveTlvs tlvs, uint64_t amount_msats) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       int8_tArray recipient_arr = init_int8_tArray(33, __LINE__);
+       memcpy(recipient_arr->elems, recipient.compressed_form, 33);
+       LDKCVec_ChannelDetailsZ first_hops_var = first_hops;
+       int64_tArray first_hops_arr = NULL;
+       first_hops_arr = init_int64_tArray(first_hops_var.datalen, __LINE__);
+       int64_t *first_hops_arr_ptr = (int64_t*)(((uint8_t*)first_hops_arr) + 8);
+       for (size_t q = 0; q < first_hops_var.datalen; q++) {
+               LDKChannelDetails first_hops_conv_16_var = first_hops_var.data[q];
+               int64_t first_hops_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(first_hops_conv_16_var);
+               first_hops_conv_16_ref = tag_ptr(first_hops_conv_16_var.inner, first_hops_conv_16_var.is_owned);
+               first_hops_arr_ptr[q] = first_hops_conv_16_ref;
+       }
+       
+       FREE(first_hops_var.data);
+       LDKReceiveTlvs tlvs_var = tlvs;
+       int64_t tlvs_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(tlvs_var);
+       tlvs_ref = tag_ptr(tlvs_var.inner, tlvs_var.is_owned);
+       int64_t amount_msats_conv = amount_msats;
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 49, (int64_t)recipient_arr, (int64_t)first_hops_arr, tlvs_ref, amount_msats_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ret_conv = *(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
 static void LDKRouter_JCalls_cloned(LDKRouter* new_obj) {
        LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) new_obj->this_arg;
        atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->MessageRouter->refcnt, 1, memory_order_release);
 }
-static inline LDKRouter LDKRouter_init (int64_t o) {
+static inline LDKRouter LDKRouter_init (int64_t o, int64_t MessageRouter) {
        LDKRouter_JCalls *calls = MALLOC(sizeof(LDKRouter_JCalls), "LDKRouter_JCalls");
        atomic_init(&calls->refcnt, 1);
        calls->instance_ptr = o;
@@ -6698,13 +7335,16 @@ static inline LDKRouter LDKRouter_init (int64_t o) {
                .this_arg = (void*) calls,
                .find_route = find_route_LDKRouter_jcall,
                .find_route_with_id = find_route_with_id_LDKRouter_jcall,
+               .create_blinded_payment_paths = create_blinded_payment_paths_LDKRouter_jcall,
                .free = LDKRouter_JCalls_free,
+               .MessageRouter = LDKMessageRouter_init(MessageRouter),
        };
+       calls->MessageRouter = ret.MessageRouter.this_arg;
        return ret;
 }
-uint64_t  CS_LDK_LDKRouter_new(int32_t o) {
+uint64_t  CS_LDK_LDKRouter_new(int32_t o, int32_t MessageRouter) {
        LDKRouter *res_ptr = MALLOC(sizeof(LDKRouter), "LDKRouter");
-       *res_ptr = LDKRouter_init(o);
+       *res_ptr = LDKRouter_init(o, MessageRouter);
        return tag_ptr(res_ptr, true);
 }
 int64_t  CS_LDK_Router_find_route(int64_t this_arg, int8_tArray payer, int64_t route_params, int64_tArray first_hops, int64_t inflight_htlcs) {
@@ -6801,6 +7441,40 @@ int64_t  CS_LDK_Router_find_route_with_id(int64_t this_arg, int8_tArray payer, i
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_Router_create_blinded_payment_paths(int64_t this_arg, int8_tArray recipient, int64_tArray first_hops, int64_t tlvs, int64_t amount_msats) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRouter* this_arg_conv = (LDKRouter*)this_arg_ptr;
+       LDKPublicKey recipient_ref;
+       CHECK(recipient->arr_len == 33);
+       memcpy(recipient_ref.compressed_form, recipient->elems, 33); FREE(recipient);
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       first_hops_constr.datalen = first_hops->arr_len;
+       if (first_hops_constr.datalen > 0)
+               first_hops_constr.data = MALLOC(first_hops_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               first_hops_constr.data = NULL;
+       int64_t* first_hops_vals = first_hops->elems;
+       for (size_t q = 0; q < first_hops_constr.datalen; q++) {
+               int64_t first_hops_conv_16 = first_hops_vals[q];
+               LDKChannelDetails first_hops_conv_16_conv;
+               first_hops_conv_16_conv.inner = untag_ptr(first_hops_conv_16);
+               first_hops_conv_16_conv.is_owned = ptr_is_owned(first_hops_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(first_hops_conv_16_conv);
+               first_hops_conv_16_conv = ChannelDetails_clone(&first_hops_conv_16_conv);
+               first_hops_constr.data[q] = first_hops_conv_16_conv;
+       }
+       FREE(first_hops);
+       LDKReceiveTlvs tlvs_conv;
+       tlvs_conv.inner = untag_ptr(tlvs);
+       tlvs_conv.is_owned = ptr_is_owned(tlvs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(tlvs_conv);
+       tlvs_conv = ReceiveTlvs_clone(&tlvs_conv);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = (this_arg_conv->create_blinded_payment_paths)(this_arg_conv->this_arg, recipient_ref, first_hops_constr, tlvs_conv, amount_msats);
+       return tag_ptr(ret_conv, true);
+}
+
 static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner){
        return ThirtyTwoBytes_clone(&owner->a);
 }
@@ -7384,17 +8058,17 @@ static void LDKType_JCalls_free(void* this_arg) {
 }
 uint16_t type_id_LDKType_jcall(const void* this_arg) {
        LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
-       return js_invoke_function_s_(j_calls->instance_ptr, 46);
+       return js_invoke_function_s_(j_calls->instance_ptr, 50);
 }
 LDKStr debug_str_LDKType_jcall(const void* this_arg) {
        LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
-       jstring ret = (jstring)js_invoke_function_l_(j_calls->instance_ptr, 47);
+       jstring ret = (jstring)js_invoke_function_l_(j_calls->instance_ptr, 51);
        LDKStr ret_conv = str_ref_to_owned_c(ret);
        return ret_conv;
 }
 LDKCVec_u8Z write_LDKType_jcall(const void* this_arg) {
        LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 48);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 52);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
@@ -7481,6 +8155,43 @@ static inline LDKCVec_C2Tuple_PublicKeyTypeZZ CVec_C2Tuple_PublicKeyTypeZZ_clone
        }
        return ret;
 }
+static inline struct LDKPublicKey C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(int64_t owner) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_SocketAddressZ C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR owner){
+       return CVec_SocketAddressZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(int64_t owner) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(owner);
+       LDKCVec_SocketAddressZ ret_var = C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(owner_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t p = 0; p < ret_var.datalen; p++) {
+               LDKSocketAddress *ret_conv_15_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+               *ret_conv_15_copy = ret_var.data[p];
+               int64_t ret_conv_15_ref = tag_ptr(ret_conv_15_copy, true);
+               ret_arr_ptr[p] = ret_conv_15_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_clone(const LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ *orig) {
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ) * orig->datalen, "LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
 typedef struct LDKOnionMessageContents_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -7493,17 +8204,23 @@ static void LDKOnionMessageContents_JCalls_free(void* this_arg) {
 }
 uint64_t tlv_type_LDKOnionMessageContents_jcall(const void* this_arg) {
        LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
-       return js_invoke_function_l_(j_calls->instance_ptr, 49);
+       return js_invoke_function_l_(j_calls->instance_ptr, 53);
 }
 LDKCVec_u8Z write_LDKOnionMessageContents_jcall(const void* this_arg) {
        LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 50);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 54);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
        memcpy(ret_ref.data, ret->elems, ret_ref.datalen); FREE(ret);
        return ret_ref;
 }
+LDKStr debug_str_LDKOnionMessageContents_jcall(const void* this_arg) {
+       LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
+       jstring ret = (jstring)js_invoke_function_l_(j_calls->instance_ptr, 55);
+       LDKStr ret_conv = str_ref_to_owned_c(ret);
+       return ret_conv;
+}
 static void LDKOnionMessageContents_JCalls_cloned(LDKOnionMessageContents* new_obj) {
        LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) new_obj->this_arg;
        atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
@@ -7517,6 +8234,7 @@ static inline LDKOnionMessageContents LDKOnionMessageContents_init (int64_t o) {
                .this_arg = (void*) calls,
                .tlv_type = tlv_type_LDKOnionMessageContents_jcall,
                .write = write_LDKOnionMessageContents_jcall,
+               .debug_str = debug_str_LDKOnionMessageContents_jcall,
                .cloned = LDKOnionMessageContents_JCalls_cloned,
                .free = LDKOnionMessageContents_JCalls_free,
        };
@@ -7546,6 +8264,16 @@ int8_tArray  CS_LDK_OnionMessageContents_write(int64_t this_arg) {
        return ret_arr;
 }
 
+jstring  CS_LDK_OnionMessageContents_debug_str(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOnionMessageContents* this_arg_conv = (LDKOnionMessageContents*)this_arg_ptr;
+       LDKStr ret_str = (this_arg_conv->debug_str)(this_arg_conv->this_arg);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
 uint32_t CS_LDK_LDKCOption_OnionMessageContentsZ_ty_from_ptr(int64_t ptr) {
        LDKCOption_OnionMessageContentsZ *obj = (LDKCOption_OnionMessageContentsZ*)untag_ptr(ptr);
        switch(obj->tag) {
@@ -8122,6 +8850,110 @@ int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKStfu CResult_StfuDecodeErrorZ_get_ok(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR owner){
+       LDKStfu ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_StfuDecodeErrorZ* owner_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(owner);
+       LDKStfu ret_var = CResult_StfuDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_StfuDecodeErrorZ_get_err(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_StfuDecodeErrorZ* owner_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_StfuDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSplice CResult_SpliceDecodeErrorZ_get_ok(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR owner){
+       LDKSplice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpliceDecodeErrorZ* owner_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(owner);
+       LDKSplice ret_var = CResult_SpliceDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpliceDecodeErrorZ_get_err(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpliceDecodeErrorZ* owner_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpliceDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSpliceAck CResult_SpliceAckDecodeErrorZ_get_ok(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR owner){
+       LDKSpliceAck ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpliceAckDecodeErrorZ* owner_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(owner);
+       LDKSpliceAck ret_var = CResult_SpliceAckDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpliceAckDecodeErrorZ_get_err(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpliceAckDecodeErrorZ* owner_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpliceAckDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSpliceLocked CResult_SpliceLockedDecodeErrorZ_get_ok(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR owner){
+       LDKSpliceLocked ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpliceLockedDecodeErrorZ* owner_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(owner);
+       LDKSpliceLocked ret_var = CResult_SpliceLockedDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpliceLockedDecodeErrorZ_get_err(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpliceLockedDecodeErrorZ* owner_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpliceLockedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline struct LDKTxAddInput CResult_TxAddInputDecodeErrorZ_get_ok(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR owner){
        LDKTxAddInput ret = *owner->contents.result;
        ret.is_owned = false;
@@ -8798,6 +9630,32 @@ int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKOnionPacket CResult_OnionPacketDecodeErrorZ_get_ok(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR owner){
+       LDKOnionPacket ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OnionPacketDecodeErrorZ* owner_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(owner);
+       LDKOnionPacket ret_var = CResult_OnionPacketDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_OnionPacketDecodeErrorZ_get_err(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OnionPacketDecodeErrorZ* owner_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OnionPacketDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline struct LDKUpdateAddHTLC CResult_UpdateAddHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR owner){
        LDKUpdateAddHTLC ret = *owner->contents.result;
        ret.is_owned = false;
@@ -8850,6 +9708,32 @@ int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKFinalOnionHopData CResult_FinalOnionHopDataDecodeErrorZ_get_ok(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR owner){
+       LDKFinalOnionHopData ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* owner_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(owner);
+       LDKFinalOnionHopData ret_var = CResult_FinalOnionHopDataDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_FinalOnionHopDataDecodeErrorZ_get_err(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* owner_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FinalOnionHopDataDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline struct LDKPing CResult_PingDecodeErrorZ_get_ok(LDKCResult_PingDecodeErrorZ *NONNULL_PTR owner){
        LDKPing ret = *owner->contents.result;
        ret.is_owned = false;
@@ -10156,24 +11040,25 @@ uint32_t CS_LDK_LDKEvent_ty_from_ptr(int64_t ptr) {
                case LDKEvent_FundingGenerationReady: return 0;
                case LDKEvent_PaymentClaimable: return 1;
                case LDKEvent_PaymentClaimed: return 2;
-               case LDKEvent_InvoiceRequestFailed: return 3;
-               case LDKEvent_PaymentSent: return 4;
-               case LDKEvent_PaymentFailed: return 5;
-               case LDKEvent_PaymentPathSuccessful: return 6;
-               case LDKEvent_PaymentPathFailed: return 7;
-               case LDKEvent_ProbeSuccessful: return 8;
-               case LDKEvent_ProbeFailed: return 9;
-               case LDKEvent_PendingHTLCsForwardable: return 10;
-               case LDKEvent_HTLCIntercepted: return 11;
-               case LDKEvent_SpendableOutputs: return 12;
-               case LDKEvent_PaymentForwarded: return 13;
-               case LDKEvent_ChannelPending: return 14;
-               case LDKEvent_ChannelReady: return 15;
-               case LDKEvent_ChannelClosed: return 16;
-               case LDKEvent_DiscardFunding: return 17;
-               case LDKEvent_OpenChannelRequest: return 18;
-               case LDKEvent_HTLCHandlingFailed: return 19;
-               case LDKEvent_BumpTransaction: return 20;
+               case LDKEvent_ConnectionNeeded: return 3;
+               case LDKEvent_InvoiceRequestFailed: return 4;
+               case LDKEvent_PaymentSent: return 5;
+               case LDKEvent_PaymentFailed: return 6;
+               case LDKEvent_PaymentPathSuccessful: return 7;
+               case LDKEvent_PaymentPathFailed: return 8;
+               case LDKEvent_ProbeSuccessful: return 9;
+               case LDKEvent_ProbeFailed: return 10;
+               case LDKEvent_PendingHTLCsForwardable: return 11;
+               case LDKEvent_HTLCIntercepted: return 12;
+               case LDKEvent_SpendableOutputs: return 13;
+               case LDKEvent_PaymentForwarded: return 14;
+               case LDKEvent_ChannelPending: return 15;
+               case LDKEvent_ChannelReady: return 16;
+               case LDKEvent_ChannelClosed: return 17;
+               case LDKEvent_DiscardFunding: return 18;
+               case LDKEvent_OpenChannelRequest: return 19;
+               case LDKEvent_HTLCHandlingFailed: return 20;
+               case LDKEvent_BumpTransaction: return 21;
                default: abort();
        }
 }
@@ -10320,6 +11205,27 @@ int64_t CS_LDK_LDKEvent_PaymentClaimed_get_sender_intended_total_msat(int64_t pt
        int64_t sender_intended_total_msat_ref = tag_ptr(&obj->payment_claimed.sender_intended_total_msat, false);
        return sender_intended_total_msat_ref;
 }
+int8_tArray CS_LDK_LDKEvent_ConnectionNeeded_get_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ConnectionNeeded);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->connection_needed.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_tArray CS_LDK_LDKEvent_ConnectionNeeded_get_addresses(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ConnectionNeeded);
+       LDKCVec_SocketAddressZ addresses_var = obj->connection_needed.addresses;
+                       int64_tArray addresses_arr = NULL;
+                       addresses_arr = init_int64_tArray(addresses_var.datalen, __LINE__);
+                       int64_t *addresses_arr_ptr = (int64_t*)(((uint8_t*)addresses_arr) + 8);
+                       for (size_t p = 0; p < addresses_var.datalen; p++) {
+                               int64_t addresses_conv_15_ref = tag_ptr(&addresses_var.data[p], false);
+                               addresses_arr_ptr[p] = addresses_conv_15_ref;
+                       }
+                       
+       return addresses_arr;
+}
 int8_tArray CS_LDK_LDKEvent_InvoiceRequestFailed_get_payment_id(int64_t ptr) {
        LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
        CHECK(obj->tag == LDKEvent_InvoiceRequestFailed);
@@ -10674,6 +11580,15 @@ int64_t CS_LDK_LDKEvent_ChannelClosed_get_channel_capacity_sats(int64_t ptr) {
        int64_t channel_capacity_sats_ref = tag_ptr(&obj->channel_closed.channel_capacity_sats, false);
        return channel_capacity_sats_ref;
 }
+int64_t CS_LDK_LDKEvent_ChannelClosed_get_channel_funding_txo(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       LDKOutPoint channel_funding_txo_var = obj->channel_closed.channel_funding_txo;
+                       int64_t channel_funding_txo_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_funding_txo_var);
+                       channel_funding_txo_ref = tag_ptr(channel_funding_txo_var.inner, false);
+       return channel_funding_txo_ref;
+}
 int8_tArray CS_LDK_LDKEvent_DiscardFunding_get_channel_id(int64_t ptr) {
        LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
        CHECK(obj->tag == LDKEvent_DiscardFunding);
@@ -11267,30 +12182,23 @@ int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
-static inline struct LDKReceiveTlvs CResult_ReceiveTlvsDecodeErrorZ_get_ok(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner){
-       LDKReceiveTlvs ret = *owner->contents.result;
-       ret.is_owned = false;
-       return ret;
+static inline struct LDKThirtyTwoBytes C2Tuple__u832u16Z_get_a(LDKC2Tuple__u832u16Z *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
 }
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_get_ok(int64_t owner) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* owner_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(owner);
-       LDKReceiveTlvs ret_var = CResult_ReceiveTlvsDecodeErrorZ_get_ok(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
+int8_tArray  CS_LDK_C2Tuple__u832u16Z_get_a(int64_t owner) {
+       LDKC2Tuple__u832u16Z* owner_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple__u832u16Z_get_a(owner_conv).data, 32);
+       return ret_arr;
 }
 
-static inline struct LDKDecodeError CResult_ReceiveTlvsDecodeErrorZ_get_err(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return DecodeError_clone(&*owner->contents.err);
+static inline uint16_t C2Tuple__u832u16Z_get_b(LDKC2Tuple__u832u16Z *NONNULL_PTR owner){
+       return owner->b;
 }
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_get_err(int64_t owner) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* owner_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(owner);
-       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
-       *ret_copy = CResult_ReceiveTlvsDecodeErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
+int16_t  CS_LDK_C2Tuple__u832u16Z_get_b(int64_t owner) {
+       LDKC2Tuple__u832u16Z* owner_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(owner);
+       int16_t ret_conv = C2Tuple__u832u16Z_get_b(owner_conv);
+       return ret_conv;
 }
 
 static inline struct LDKPaymentRelay CResult_PaymentRelayDecodeErrorZ_get_ok(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner){
@@ -11345,122 +12253,62 @@ int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
-uint32_t CS_LDK_LDKPaymentError_ty_from_ptr(int64_t ptr) {
-       LDKPaymentError *obj = (LDKPaymentError*)untag_ptr(ptr);
-       switch(obj->tag) {
-               case LDKPaymentError_Invoice: return 0;
-               case LDKPaymentError_Sending: return 1;
-               default: abort();
-       }
-}
-jstring CS_LDK_LDKPaymentError_Invoice_get_invoice(int64_t ptr) {
-       LDKPaymentError *obj = (LDKPaymentError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKPaymentError_Invoice);
-       LDKStr invoice_str = obj->invoice;
-                       jstring invoice_conv = str_ref_to_cs(invoice_str.chars, invoice_str.len);
-       return invoice_conv;
-}
-int32_t CS_LDK_LDKPaymentError_Sending_get_sending(int64_t ptr) {
-       LDKPaymentError *obj = (LDKPaymentError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKPaymentError_Sending);
-       int32_t sending_conv = LDKRetryableSendFailure_to_cs(obj->sending);
-       return sending_conv;
-}
-static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return ThirtyTwoBytes_clone(&*owner->contents.result);
+static inline struct LDKThirtyTwoBytes C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
 }
-int8_tArray  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(int64_t owner) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(owner);
+int8_tArray  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(owner);
        int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(owner_conv).data, 32);
+       memcpy(ret_arr->elems, C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(owner_conv).data, 32);
        return ret_arr;
 }
 
-static inline struct LDKPaymentError CResult_ThirtyTwoBytesPaymentErrorZ_get_err(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return PaymentError_clone(&*owner->contents.err);
+static inline struct LDKRecipientOnionFields C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner){
+       LDKRecipientOnionFields ret = owner->b;
+       ret.is_owned = false;
+       return ret;
 }
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_err(int64_t owner) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(owner);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = CResult_ThirtyTwoBytesPaymentErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(owner);
+       LDKRecipientOnionFields ret_var = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
        return ret_ref;
 }
 
-static inline void CResult_NonePaymentErrorZ_get_ok(LDKCResult_NonePaymentErrorZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return *owner->contents.result;
-}
-void  CS_LDK_CResult_NonePaymentErrorZ_get_ok(int64_t owner) {
-       LDKCResult_NonePaymentErrorZ* owner_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(owner);
-       CResult_NonePaymentErrorZ_get_ok(owner_conv);
-}
-
-static inline struct LDKPaymentError CResult_NonePaymentErrorZ_get_err(LDKCResult_NonePaymentErrorZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return PaymentError_clone(&*owner->contents.err);
+static inline struct LDKRouteParameters C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner){
+       LDKRouteParameters ret = owner->c;
+       ret.is_owned = false;
+       return ret;
 }
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_get_err(int64_t owner) {
-       LDKCResult_NonePaymentErrorZ* owner_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(owner);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = CResult_NonePaymentErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(owner);
+       LDKRouteParameters ret_var = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
        return ret_ref;
 }
 
-uint32_t CS_LDK_LDKProbingError_ty_from_ptr(int64_t ptr) {
-       LDKProbingError *obj = (LDKProbingError*)untag_ptr(ptr);
-       switch(obj->tag) {
-               case LDKProbingError_Invoice: return 0;
-               case LDKProbingError_Sending: return 1;
-               default: abort();
-       }
-}
-jstring CS_LDK_LDKProbingError_Invoice_get_invoice(int64_t ptr) {
-       LDKProbingError *obj = (LDKProbingError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKProbingError_Invoice);
-       LDKStr invoice_str = obj->invoice;
-                       jstring invoice_conv = str_ref_to_cs(invoice_str.chars, invoice_str.len);
-       return invoice_conv;
-}
-int64_t CS_LDK_LDKProbingError_Sending_get_sending(int64_t ptr) {
-       LDKProbingError *obj = (LDKProbingError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKProbingError_Sending);
-       int64_t sending_ref = tag_ptr(&obj->sending, false);
-       return sending_ref;
-}
-static inline struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner){
+static inline struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_clone(&*owner->contents.result);
+       return C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(&*owner->contents.result);
 }
-int64_tArray  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(int64_t owner) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(owner);
-       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ ret_var = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(owner_conv);
-       int64_tArray ret_arr = NULL;
-       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
-       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
-       for (size_t o = 0; o < ret_var.datalen; o++) {
-               LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv_40_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
-               *ret_conv_40_conv = ret_var.data[o];
-               ret_arr_ptr[o] = tag_ptr(ret_conv_40_conv, true);
-       }
-       
-       FREE(ret_var.data);
-       return ret_arr;
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* owner_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(owner);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
 }
 
-static inline struct LDKProbingError CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner){
+static inline void CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
-       return ProbingError_clone(&*owner->contents.err);
+       return *owner->contents.err;
 }
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(int64_t owner) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(owner);
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
+void  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* owner_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(owner);
+       CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(owner_conv);
 }
 
 static inline struct LDKStr CResult_StrSecp256k1ErrorZ_get_ok(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner){
@@ -11484,53 +12332,41 @@ int32_t  CS_LDK_CResult_StrSecp256k1ErrorZ_get_err(int64_t owner) {
        return ret_conv;
 }
 
-static inline struct LDKOnionMessagePath CResult_OnionMessagePathNoneZ_get_ok(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
-       LDKOnionMessagePath ret = *owner->contents.result;
-       ret.is_owned = false;
-       return ret;
-}
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_get_ok(int64_t owner) {
-       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
-       LDKOnionMessagePath ret_var = CResult_OnionMessagePathNoneZ_get_ok(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
-}
-
-static inline void CResult_OnionMessagePathNoneZ_get_err(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return *owner->contents.err;
-}
-void  CS_LDK_CResult_OnionMessagePathNoneZ_get_err(int64_t owner) {
-       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
-       CResult_OnionMessagePathNoneZ_get_err(owner_conv);
-}
-
-static inline struct LDKPublicKey C2Tuple_PublicKeyOnionMessageZ_get_a(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR owner){
+static inline struct LDKPublicKey C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner){
        return owner->a;
 }
-int8_tArray  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_get_a(int64_t owner) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* owner_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(owner);
+int8_tArray  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(int64_t owner) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* owner_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(owner);
        int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, C2Tuple_PublicKeyOnionMessageZ_get_a(owner_conv).compressed_form, 33);
+       memcpy(ret_arr->elems, C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(owner_conv).compressed_form, 33);
        return ret_arr;
 }
 
-static inline struct LDKOnionMessage C2Tuple_PublicKeyOnionMessageZ_get_b(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR owner){
+static inline struct LDKOnionMessage C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner){
        LDKOnionMessage ret = owner->b;
        ret.is_owned = false;
        return ret;
 }
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_get_b(int64_t owner) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* owner_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(owner);
-       LDKOnionMessage ret_var = C2Tuple_PublicKeyOnionMessageZ_get_b(owner_conv);
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(int64_t owner) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* owner_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(owner);
+       LDKOnionMessage ret_var = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(owner_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
        return ret_ref;
 }
 
+static inline struct LDKCOption_CVec_SocketAddressZZ C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner){
+       return COption_CVec_SocketAddressZZ_clone(&owner->c);
+}
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(int64_t owner) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* owner_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(owner);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 uint32_t CS_LDK_LDKSendError_ty_from_ptr(int64_t ptr) {
        LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
        switch(obj->tag) {
@@ -11538,10 +12374,11 @@ uint32_t CS_LDK_LDKSendError_ty_from_ptr(int64_t ptr) {
                case LDKSendError_TooBigPacket: return 1;
                case LDKSendError_TooFewBlindedHops: return 2;
                case LDKSendError_InvalidFirstHop: return 3;
-               case LDKSendError_InvalidMessage: return 4;
-               case LDKSendError_BufferFull: return 5;
-               case LDKSendError_GetNodeIdFailed: return 6;
-               case LDKSendError_BlindedPathAdvanceFailed: return 7;
+               case LDKSendError_PathNotFound: return 4;
+               case LDKSendError_InvalidMessage: return 5;
+               case LDKSendError_BufferFull: return 6;
+               case LDKSendError_GetNodeIdFailed: return 7;
+               case LDKSendError_BlindedPathAdvanceFailed: return 8;
                default: abort();
        }
 }
@@ -11551,25 +12388,32 @@ int32_t CS_LDK_LDKSendError_Secp256k1_get_secp256k1(int64_t ptr) {
        int32_t secp256k1_conv = LDKSecp256k1Error_to_cs(obj->secp256k1);
        return secp256k1_conv;
 }
-static inline struct LDKC2Tuple_PublicKeyOnionMessageZ CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *NONNULL_PTR owner){
+int8_tArray CS_LDK_LDKSendError_InvalidFirstHop_get_invalid_first_hop(int64_t ptr) {
+       LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSendError_InvalidFirstHop);
+       int8_tArray invalid_first_hop_arr = init_int8_tArray(33, __LINE__);
+       memcpy(invalid_first_hop_arr->elems, obj->invalid_first_hop.compressed_form, 33);
+       return invalid_first_hop_arr;
+}
+static inline struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return C2Tuple_PublicKeyOnionMessageZ_clone(&*owner->contents.result);
+       return C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(&*owner->contents.result);
 }
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(int64_t owner) {
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* owner_conv = (LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)untag_ptr(owner);
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(owner_conv);
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* owner_conv = (LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)untag_ptr(owner);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(owner_conv);
        return tag_ptr(ret_conv, true);
 }
 
-static inline struct LDKSendError CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *NONNULL_PTR owner){
+static inline struct LDKSendError CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return SendError_clone(&*owner->contents.err);
 }
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(int64_t owner) {
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* owner_conv = (LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)untag_ptr(owner);
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(int64_t owner) {
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* owner_conv = (LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)untag_ptr(owner);
        LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
-       *ret_copy = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(owner_conv);
+       *ret_copy = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(owner_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -11662,23 +12506,41 @@ void  CS_LDK_CResult_PeeledOnionNoneZ_get_err(int64_t owner) {
        CResult_PeeledOnionNoneZ_get_err(owner_conv);
 }
 
-static inline void CResult_NoneSendErrorZ_get_ok(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner){
+uint32_t CS_LDK_LDKSendSuccess_ty_from_ptr(int64_t ptr) {
+       LDKSendSuccess *obj = (LDKSendSuccess*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSendSuccess_Buffered: return 0;
+               case LDKSendSuccess_BufferedAwaitingConnection: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKSendSuccess_BufferedAwaitingConnection_get_buffered_awaiting_connection(int64_t ptr) {
+       LDKSendSuccess *obj = (LDKSendSuccess*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSendSuccess_BufferedAwaitingConnection);
+       int8_tArray buffered_awaiting_connection_arr = init_int8_tArray(33, __LINE__);
+       memcpy(buffered_awaiting_connection_arr->elems, obj->buffered_awaiting_connection.compressed_form, 33);
+       return buffered_awaiting_connection_arr;
+}
+static inline struct LDKSendSuccess CResult_SendSuccessSendErrorZ_get_ok(LDKCResult_SendSuccessSendErrorZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return *owner->contents.result;
+       return SendSuccess_clone(&*owner->contents.result);
 }
-void  CS_LDK_CResult_NoneSendErrorZ_get_ok(int64_t owner) {
-       LDKCResult_NoneSendErrorZ* owner_conv = (LDKCResult_NoneSendErrorZ*)untag_ptr(owner);
-       CResult_NoneSendErrorZ_get_ok(owner_conv);
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SendSuccessSendErrorZ* owner_conv = (LDKCResult_SendSuccessSendErrorZ*)untag_ptr(owner);
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = CResult_SendSuccessSendErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
 }
 
-static inline struct LDKSendError CResult_NoneSendErrorZ_get_err(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner){
+static inline struct LDKSendError CResult_SendSuccessSendErrorZ_get_err(LDKCResult_SendSuccessSendErrorZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return SendError_clone(&*owner->contents.err);
 }
-int64_t  CS_LDK_CResult_NoneSendErrorZ_get_err(int64_t owner) {
-       LDKCResult_NoneSendErrorZ* owner_conv = (LDKCResult_NoneSendErrorZ*)untag_ptr(owner);
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_get_err(int64_t owner) {
+       LDKCResult_SendSuccessSendErrorZ* owner_conv = (LDKCResult_SendSuccessSendErrorZ*)untag_ptr(owner);
        LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
-       *ret_copy = CResult_NoneSendErrorZ_get_err(owner_conv);
+       *ret_copy = CResult_SendSuccessSendErrorZ_get_err(owner_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -11726,6 +12588,13 @@ void  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(int64_t own
        CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(owner_conv);
 }
 
+static inline LDKCVec_ForwardNodeZ CVec_ForwardNodeZ_clone(const LDKCVec_ForwardNodeZ *orig) {
+       LDKCVec_ForwardNodeZ ret = { .data = MALLOC(sizeof(LDKForwardNode) * orig->datalen, "LDKCVec_ForwardNodeZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ForwardNode_clone(&orig->data[i]);
+       }
+       return ret;
+}
 static inline struct LDKBlindedPath CResult_BlindedPathDecodeErrorZ_get_ok(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner){
        LDKBlindedPath ret = *owner->contents.result;
        ret.is_owned = false;
@@ -11804,6 +12673,162 @@ int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKDelayedPaymentBasepoint CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR owner){
+       LDKDelayedPaymentBasepoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDelayedPaymentBasepoint ret_var = CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDelayedPaymentKey CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR owner){
+       LDKDelayedPaymentKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDelayedPaymentKey ret_var = CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_DelayedPaymentKeyDecodeErrorZ_get_err(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_DelayedPaymentKeyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHtlcBasepoint CResult_HtlcBasepointDecodeErrorZ_get_ok(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR owner){
+       LDKHtlcBasepoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* owner_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKHtlcBasepoint ret_var = CResult_HtlcBasepointDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_HtlcBasepointDecodeErrorZ_get_err(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* owner_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HtlcBasepointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHtlcKey CResult_HtlcKeyDecodeErrorZ_get_ok(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR owner){
+       LDKHtlcKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HtlcKeyDecodeErrorZ* owner_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKHtlcKey ret_var = CResult_HtlcKeyDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_HtlcKeyDecodeErrorZ_get_err(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HtlcKeyDecodeErrorZ* owner_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HtlcKeyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRevocationBasepoint CResult_RevocationBasepointDecodeErrorZ_get_ok(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR owner){
+       LDKRevocationBasepoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* owner_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKRevocationBasepoint ret_var = CResult_RevocationBasepointDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_RevocationBasepointDecodeErrorZ_get_err(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* owner_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RevocationBasepointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRevocationKey CResult_RevocationKeyDecodeErrorZ_get_ok(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR owner){
+       LDKRevocationKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RevocationKeyDecodeErrorZ* owner_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKRevocationKey ret_var = CResult_RevocationKeyDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_RevocationKeyDecodeErrorZ_get_err(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RevocationKeyDecodeErrorZ* owner_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RevocationKeyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 typedef struct LDKFilter_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -11821,7 +12846,7 @@ void register_tx_LDKFilter_jcall(const void* this_arg, const uint8_t (* txid)[32
        LDKu8slice script_pubkey_var = script_pubkey;
        int8_tArray script_pubkey_arr = init_int8_tArray(script_pubkey_var.datalen, __LINE__);
        memcpy(script_pubkey_arr->elems, script_pubkey_var.data, script_pubkey_var.datalen);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 51, (int64_t)txid_arr, (int64_t)script_pubkey_arr);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 56, (int64_t)txid_arr, (int64_t)script_pubkey_arr);
 }
 void register_output_LDKFilter_jcall(const void* this_arg, LDKWatchedOutput output) {
        LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
@@ -11829,7 +12854,7 @@ void register_output_LDKFilter_jcall(const void* this_arg, LDKWatchedOutput outp
        int64_t output_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(output_var);
        output_ref = tag_ptr(output_var.inner, output_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 52, output_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 57, output_ref);
 }
 static void LDKFilter_JCalls_cloned(LDKFilter* new_obj) {
        LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) new_obj->this_arg;
@@ -12000,7 +13025,7 @@ LDKCResult_CVec_u8ZIOErrorZ read_LDKKVStore_jcall(const void* this_arg, LDKStr p
        LDKStr key_str = key;
        jstring key_conv = str_ref_to_cs(key_str.chars, key_str.len);
        Str_free(key_str);
-       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 53, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 58, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_u8ZIOErrorZ ret_conv = *(LDKCResult_CVec_u8ZIOErrorZ*)(ret_ptr);
@@ -12021,7 +13046,7 @@ LDKCResult_NoneIOErrorZ write_LDKKVStore_jcall(const void* this_arg, LDKStr prim
        LDKu8slice buf_var = buf;
        int8_tArray buf_arr = init_int8_tArray(buf_var.datalen, __LINE__);
        memcpy(buf_arr->elems, buf_var.data, buf_var.datalen);
-       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 54, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, (int64_t)buf_arr);
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 59, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, (int64_t)buf_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12040,7 +13065,7 @@ LDKCResult_NoneIOErrorZ remove_LDKKVStore_jcall(const void* this_arg, LDKStr pri
        jstring key_conv = str_ref_to_cs(key_str.chars, key_str.len);
        Str_free(key_str);
        jboolean lazy_conv = lazy;
-       uint64_t ret = js_invoke_function_l_lllb(j_calls->instance_ptr, 55, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, lazy_conv);
+       uint64_t ret = js_invoke_function_l_lllb(j_calls->instance_ptr, 60, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, lazy_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12055,7 +13080,7 @@ LDKCResult_CVec_StrZIOErrorZ list_LDKKVStore_jcall(const void* this_arg, LDKStr
        LDKStr secondary_namespace_str = secondary_namespace;
        jstring secondary_namespace_conv = str_ref_to_cs(secondary_namespace_str.chars, secondary_namespace_str.len);
        Str_free(secondary_namespace_str);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 56, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 61, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_StrZIOErrorZ ret_conv = *(LDKCResult_CVec_StrZIOErrorZ*)(ret_ptr);
@@ -12154,7 +13179,7 @@ LDKCResult_NoneIOErrorZ persist_manager_LDKPersister_jcall(const void* this_arg,
        // WARNING: we may need a move here but no clone is available for LDKChannelManager
        CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_manager_var);
        channel_manager_ref = tag_ptr(channel_manager_var.inner, channel_manager_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 57, channel_manager_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 62, channel_manager_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12168,7 +13193,7 @@ LDKCResult_NoneIOErrorZ persist_graph_LDKPersister_jcall(const void* this_arg, c
        // WARNING: we may need a move here but no clone is available for LDKNetworkGraph
        CHECK_INNER_FIELD_ACCESS_OR_NULL(network_graph_var);
        network_graph_ref = tag_ptr(network_graph_var.inner, network_graph_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 58, network_graph_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 63, network_graph_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12179,7 +13204,7 @@ LDKCResult_NoneIOErrorZ persist_scorer_LDKPersister_jcall(const void* this_arg,
        LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
        // WARNING: This object doesn't live past this scope, needs clone!
        int64_t ret_scorer = tag_ptr(scorer, false);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 59, ret_scorer);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 64, ret_scorer);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12274,7 +13299,7 @@ LDKChannelMonitorUpdateStatus persist_new_channel_LDKPersist_jcall(const void* t
        int64_t update_id_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_var);
        update_id_ref = tag_ptr(update_id_var.inner, update_id_var.is_owned);
-       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_lll(j_calls->instance_ptr, 60, channel_id_ref, data_ref, update_id_ref);
+       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_lll(j_calls->instance_ptr, 65, channel_id_ref, data_ref, update_id_ref);
        LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
        return ret_conv;
 }
@@ -12297,7 +13322,7 @@ LDKChannelMonitorUpdateStatus update_persisted_channel_LDKPersist_jcall(const vo
        int64_t update_id_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_var);
        update_id_ref = tag_ptr(update_id_var.inner, update_id_var.is_owned);
-       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_llll(j_calls->instance_ptr, 61, channel_id_ref, update_ref, data_ref, update_id_ref);
+       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_llll(j_calls->instance_ptr, 66, channel_id_ref, update_ref, data_ref, update_id_ref);
        LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
        return ret_conv;
 }
@@ -12386,7 +13411,7 @@ static void LDKFutureCallback_JCalls_free(void* this_arg) {
 }
 void call_LDKFutureCallback_jcall(const void* this_arg) {
        LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) this_arg;
-       js_invoke_function_void_(j_calls->instance_ptr, 62);
+       js_invoke_function_void_(j_calls->instance_ptr, 67);
 }
 static void LDKFutureCallback_JCalls_cloned(LDKFutureCallback* new_obj) {
        LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) new_obj->this_arg;
@@ -12442,7 +13467,7 @@ void filtered_block_connected_LDKListen_jcall(const void* this_arg, const uint8_
        
        FREE(txdata_var.data);
        int32_t height_conv = height;
-       js_invoke_function_void_lli(j_calls->instance_ptr, 63, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
+       js_invoke_function_void_lli(j_calls->instance_ptr, 68, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
 }
 void block_connected_LDKListen_jcall(const void* this_arg, LDKu8slice block, uint32_t height) {
        LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
@@ -12450,14 +13475,14 @@ void block_connected_LDKListen_jcall(const void* this_arg, LDKu8slice block, uin
        int8_tArray block_arr = init_int8_tArray(block_var.datalen, __LINE__);
        memcpy(block_arr->elems, block_var.data, block_var.datalen);
        int32_t height_conv = height;
-       js_invoke_function_void_li(j_calls->instance_ptr, 64, (int64_t)block_arr, height_conv);
+       js_invoke_function_void_li(j_calls->instance_ptr, 69, (int64_t)block_arr, height_conv);
 }
 void block_disconnected_LDKListen_jcall(const void* this_arg, const uint8_t (* header)[80], uint32_t height) {
        LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
        int8_tArray header_arr = init_int8_tArray(80, __LINE__);
        memcpy(header_arr->elems, *header, 80);
        int32_t height_conv = height;
-       js_invoke_function_void_li(j_calls->instance_ptr, 65, (int64_t)header_arr, height_conv);
+       js_invoke_function_void_li(j_calls->instance_ptr, 70, (int64_t)header_arr, height_conv);
 }
 static void LDKListen_JCalls_cloned(LDKListen* new_obj) {
        LDKListen_JCalls *j_calls = (LDKListen_JCalls*) new_obj->this_arg;
@@ -12557,38 +13582,38 @@ void transactions_confirmed_LDKConfirm_jcall(const void* this_arg, const uint8_t
        
        FREE(txdata_var.data);
        int32_t height_conv = height;
-       js_invoke_function_void_lli(j_calls->instance_ptr, 66, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
+       js_invoke_function_void_lli(j_calls->instance_ptr, 71, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
 }
 void transaction_unconfirmed_LDKConfirm_jcall(const void* this_arg, const uint8_t (* txid)[32]) {
        LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
        int8_tArray txid_arr = init_int8_tArray(32, __LINE__);
        memcpy(txid_arr->elems, *txid, 32);
-       js_invoke_function_void_l(j_calls->instance_ptr, 67, (int64_t)txid_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 72, (int64_t)txid_arr);
 }
 void best_block_updated_LDKConfirm_jcall(const void* this_arg, const uint8_t (* header)[80], uint32_t height) {
        LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
        int8_tArray header_arr = init_int8_tArray(80, __LINE__);
        memcpy(header_arr->elems, *header, 80);
        int32_t height_conv = height;
-       js_invoke_function_void_li(j_calls->instance_ptr, 68, (int64_t)header_arr, height_conv);
+       js_invoke_function_void_li(j_calls->instance_ptr, 73, (int64_t)header_arr, height_conv);
 }
-LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ get_relevant_txids_LDKConfirm_jcall(const void* this_arg) {
+LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ get_relevant_txids_LDKConfirm_jcall(const void* this_arg) {
        LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 69);
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret_constr;
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 74);
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
-               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ Elements");
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ Elements");
        else
                ret_constr.data = NULL;
        int64_t* ret_vals = ret->elems;
-       for (size_t x = 0; x < ret_constr.datalen; x++) {
-               int64_t ret_conv_49 = ret_vals[x];
-               void* ret_conv_49_ptr = untag_ptr(ret_conv_49);
-               CHECK_ACCESS(ret_conv_49_ptr);
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ ret_conv_49_conv = *(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)(ret_conv_49_ptr);
-               FREE(untag_ptr(ret_conv_49));
-               ret_constr.data[x] = ret_conv_49_conv;
+       for (size_t c = 0; c < ret_constr.datalen; c++) {
+               int64_t ret_conv_54 = ret_vals[c];
+               void* ret_conv_54_ptr = untag_ptr(ret_conv_54);
+               CHECK_ACCESS(ret_conv_54_ptr);
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ ret_conv_54_conv = *(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)(ret_conv_54_ptr);
+               FREE(untag_ptr(ret_conv_54));
+               ret_constr.data[c] = ret_conv_54_conv;
        }
        FREE(ret);
        return ret_constr;
@@ -12670,14 +13695,14 @@ int64_tArray  CS_LDK_Confirm_get_relevant_txids(int64_t this_arg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKConfirm* this_arg_conv = (LDKConfirm*)this_arg_ptr;
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret_var = (this_arg_conv->get_relevant_txids)(this_arg_conv->this_arg);
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret_var = (this_arg_conv->get_relevant_txids)(this_arg_conv->this_arg);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
        int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
-       for (size_t x = 0; x < ret_var.datalen; x++) {
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-               *ret_conv_49_conv = ret_var.data[x];
-               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       for (size_t c = 0; c < ret_var.datalen; c++) {
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv_54_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+               *ret_conv_54_conv = ret_var.data[c];
+               ret_arr_ptr[c] = tag_ptr(ret_conv_54_conv, true);
        }
        
        FREE(ret_var.data);
@@ -12699,7 +13724,7 @@ void handle_event_LDKEventHandler_jcall(const void* this_arg, LDKEvent event) {
        LDKEvent *event_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
        *event_copy = event;
        int64_t event_ref = tag_ptr(event_copy, true);
-       js_invoke_function_void_l(j_calls->instance_ptr, 70, event_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 75, event_ref);
 }
 static void LDKEventHandler_JCalls_cloned(LDKEventHandler* new_obj) {
        LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) new_obj->this_arg;
@@ -12747,7 +13772,7 @@ void process_pending_events_LDKEventsProvider_jcall(const void* this_arg, LDKEve
        LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) this_arg;
        LDKEventHandler* handler_ret = MALLOC(sizeof(LDKEventHandler), "LDKEventHandler");
        *handler_ret = handler;
-       js_invoke_function_void_l(j_calls->instance_ptr, 71, tag_ptr(handler_ret, true));
+       js_invoke_function_void_l(j_calls->instance_ptr, 76, tag_ptr(handler_ret, true));
 }
 static void LDKEventsProvider_JCalls_cloned(LDKEventsProvider* new_obj) {
        LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) new_obj->this_arg;
@@ -12812,7 +13837,7 @@ static void LDKMessageSendEventsProvider_JCalls_free(void* this_arg) {
 }
 LDKCVec_MessageSendEventZ get_and_clear_pending_msg_events_LDKMessageSendEventsProvider_jcall(const void* this_arg) {
        LDKMessageSendEventsProvider_JCalls *j_calls = (LDKMessageSendEventsProvider_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 72);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 77);
        LDKCVec_MessageSendEventZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -12891,7 +13916,7 @@ void handle_open_channel_LDKChannelMessageHandler_jcall(const void* this_arg, LD
        msg_var = OpenChannel_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 73, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 78, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_open_channel_v2_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKOpenChannelV2 * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12902,7 +13927,7 @@ void handle_open_channel_v2_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = OpenChannelV2_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 74, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 79, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_accept_channel_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKAcceptChannel * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12913,7 +13938,7 @@ void handle_accept_channel_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = AcceptChannel_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 75, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 80, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_accept_channel_v2_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKAcceptChannelV2 * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12924,7 +13949,7 @@ void handle_accept_channel_v2_LDKChannelMessageHandler_jcall(const void* this_ar
        msg_var = AcceptChannelV2_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 76, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 81, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_funding_created_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKFundingCreated * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12935,7 +13960,7 @@ void handle_funding_created_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = FundingCreated_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 77, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 82, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_funding_signed_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKFundingSigned * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12946,7 +13971,7 @@ void handle_funding_signed_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = FundingSigned_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 78, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 83, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_channel_ready_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKChannelReady * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12957,7 +13982,7 @@ void handle_channel_ready_LDKChannelMessageHandler_jcall(const void* this_arg, L
        msg_var = ChannelReady_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 79, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 84, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_shutdown_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKShutdown * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12968,7 +13993,7 @@ void handle_shutdown_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPub
        msg_var = Shutdown_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 80, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 85, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_closing_signed_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKClosingSigned * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12979,7 +14004,51 @@ void handle_closing_signed_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = ClosingSigned_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 81, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 86, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_stfu_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKStfu * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKStfu msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = Stfu_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 87, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_splice_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKSplice * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKSplice msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = Splice_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 88, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_splice_ack_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKSpliceAck * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKSpliceAck msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = SpliceAck_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 89, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_splice_locked_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKSpliceLocked * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKSpliceLocked msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = SpliceLocked_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 90, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_add_input_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAddInput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12990,7 +14059,7 @@ void handle_tx_add_input_LDKChannelMessageHandler_jcall(const void* this_arg, LD
        msg_var = TxAddInput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 82, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 91, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_add_output_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAddOutput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13001,7 +14070,7 @@ void handle_tx_add_output_LDKChannelMessageHandler_jcall(const void* this_arg, L
        msg_var = TxAddOutput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 83, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 92, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_remove_input_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxRemoveInput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13012,7 +14081,7 @@ void handle_tx_remove_input_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = TxRemoveInput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 84, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 93, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_remove_output_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxRemoveOutput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13023,7 +14092,7 @@ void handle_tx_remove_output_LDKChannelMessageHandler_jcall(const void* this_arg
        msg_var = TxRemoveOutput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 85, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 94, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_complete_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxComplete * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13034,7 +14103,7 @@ void handle_tx_complete_LDKChannelMessageHandler_jcall(const void* this_arg, LDK
        msg_var = TxComplete_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 86, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 95, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_signatures_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxSignatures * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13045,7 +14114,7 @@ void handle_tx_signatures_LDKChannelMessageHandler_jcall(const void* this_arg, L
        msg_var = TxSignatures_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 87, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 96, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_init_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxInitRbf * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13056,7 +14125,7 @@ void handle_tx_init_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDK
        msg_var = TxInitRbf_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 88, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 97, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_ack_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAckRbf * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13067,7 +14136,7 @@ void handle_tx_ack_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDKP
        msg_var = TxAckRbf_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 89, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 98, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_abort_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAbort * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13078,7 +14147,7 @@ void handle_tx_abort_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPub
        msg_var = TxAbort_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 90, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 99, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_add_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateAddHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13089,7 +14158,7 @@ void handle_update_add_htlc_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = UpdateAddHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 91, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 100, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fulfill_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFulfillHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13100,7 +14169,7 @@ void handle_update_fulfill_htlc_LDKChannelMessageHandler_jcall(const void* this_
        msg_var = UpdateFulfillHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 92, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 101, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fail_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFailHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13111,7 +14180,7 @@ void handle_update_fail_htlc_LDKChannelMessageHandler_jcall(const void* this_arg
        msg_var = UpdateFailHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 93, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 102, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fail_malformed_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFailMalformedHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13122,7 +14191,7 @@ void handle_update_fail_malformed_htlc_LDKChannelMessageHandler_jcall(const void
        msg_var = UpdateFailMalformedHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 94, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 103, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_commitment_signed_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKCommitmentSigned * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13133,7 +14202,7 @@ void handle_commitment_signed_LDKChannelMessageHandler_jcall(const void* this_ar
        msg_var = CommitmentSigned_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 95, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 104, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_revoke_and_ack_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKRevokeAndACK * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13144,7 +14213,7 @@ void handle_revoke_and_ack_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = RevokeAndACK_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 96, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 105, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fee_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFee * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13155,7 +14224,7 @@ void handle_update_fee_LDKChannelMessageHandler_jcall(const void* this_arg, LDKP
        msg_var = UpdateFee_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 97, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 106, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_announcement_signatures_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKAnnouncementSignatures * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13166,13 +14235,13 @@ void handle_announcement_signatures_LDKChannelMessageHandler_jcall(const void* t
        msg_var = AnnouncementSignatures_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 98, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 107, (int64_t)their_node_id_arr, msg_ref);
 }
 void peer_disconnected_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       js_invoke_function_void_l(j_calls->instance_ptr, 99, (int64_t)their_node_id_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 108, (int64_t)their_node_id_arr);
 }
 LDKCResult_NoneNoneZ peer_connected_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKInit * msg, bool inbound) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13184,7 +14253,7 @@ LDKCResult_NoneNoneZ peer_connected_LDKChannelMessageHandler_jcall(const void* t
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
        jboolean inbound_conv = inbound;
-       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 100, (int64_t)their_node_id_arr, msg_ref, inbound_conv);
+       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 109, (int64_t)their_node_id_arr, msg_ref, inbound_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -13200,7 +14269,7 @@ void handle_channel_reestablish_LDKChannelMessageHandler_jcall(const void* this_
        msg_var = ChannelReestablish_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 101, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 110, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_channel_update_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKChannelUpdate * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13211,7 +14280,7 @@ void handle_channel_update_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = ChannelUpdate_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 102, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 111, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_error_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKErrorMessage * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13222,11 +14291,11 @@ void handle_error_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublic
        msg_var = ErrorMessage_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 103, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 112, (int64_t)their_node_id_arr, msg_ref);
 }
 LDKNodeFeatures provided_node_features_LDKChannelMessageHandler_jcall(const void* this_arg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 104);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 113);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -13237,7 +14306,7 @@ LDKInitFeatures provided_init_features_LDKChannelMessageHandler_jcall(const void
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 105, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 114, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -13246,7 +14315,7 @@ LDKInitFeatures provided_init_features_LDKChannelMessageHandler_jcall(const void
 }
 LDKCOption_CVec_ThirtyTwoBytesZZ get_chain_hashes_LDKChannelMessageHandler_jcall(const void* this_arg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 106);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 115);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_CVec_ThirtyTwoBytesZZ ret_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(ret_ptr);
@@ -13274,6 +14343,10 @@ static inline LDKChannelMessageHandler LDKChannelMessageHandler_init (int64_t o,
                .handle_channel_ready = handle_channel_ready_LDKChannelMessageHandler_jcall,
                .handle_shutdown = handle_shutdown_LDKChannelMessageHandler_jcall,
                .handle_closing_signed = handle_closing_signed_LDKChannelMessageHandler_jcall,
+               .handle_stfu = handle_stfu_LDKChannelMessageHandler_jcall,
+               .handle_splice = handle_splice_LDKChannelMessageHandler_jcall,
+               .handle_splice_ack = handle_splice_ack_LDKChannelMessageHandler_jcall,
+               .handle_splice_locked = handle_splice_locked_LDKChannelMessageHandler_jcall,
                .handle_tx_add_input = handle_tx_add_input_LDKChannelMessageHandler_jcall,
                .handle_tx_add_output = handle_tx_add_output_LDKChannelMessageHandler_jcall,
                .handle_tx_remove_input = handle_tx_remove_input_LDKChannelMessageHandler_jcall,
@@ -13445,6 +14518,66 @@ void  CS_LDK_ChannelMessageHandler_handle_closing_signed(int64_t this_arg, int8_
        (this_arg_conv->handle_closing_signed)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
 }
 
+void  CS_LDK_ChannelMessageHandler_handle_stfu(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKStfu msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_stfu)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_splice(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKSplice msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_splice)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_splice_ack(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKSpliceAck msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_splice_ack)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_splice_locked(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKSpliceLocked msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_splice_locked)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
 void  CS_LDK_ChannelMessageHandler_handle_tx_add_input(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
@@ -13822,7 +14955,7 @@ LDKCOption_OffersMessageZ handle_message_LDKOffersMessageHandler_jcall(const voi
        LDKOffersMessage *message_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
        *message_copy = message;
        int64_t message_ref = tag_ptr(message_copy, true);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 107, message_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 116, message_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_OffersMessageZ ret_conv = *(LDKCOption_OffersMessageZ*)(ret_ptr);
@@ -13831,7 +14964,7 @@ LDKCOption_OffersMessageZ handle_message_LDKOffersMessageHandler_jcall(const voi
 }
 LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ release_pending_messages_LDKOffersMessageHandler_jcall(const void* this_arg) {
        LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 108);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 117);
        LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -13922,7 +15055,7 @@ LDKCResult_boolLightningErrorZ handle_node_announcement_LDKRoutingMessageHandler
        msg_var = NodeAnnouncement_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 109, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 118, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
@@ -13936,7 +15069,7 @@ LDKCResult_boolLightningErrorZ handle_channel_announcement_LDKRoutingMessageHand
        msg_var = ChannelAnnouncement_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 110, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 119, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
@@ -13950,7 +15083,7 @@ LDKCResult_boolLightningErrorZ handle_channel_update_LDKRoutingMessageHandler_jc
        msg_var = ChannelUpdate_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 111, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 120, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
@@ -13960,7 +15093,7 @@ LDKCResult_boolLightningErrorZ handle_channel_update_LDKRoutingMessageHandler_jc
 LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ get_next_channel_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, uint64_t starting_point) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
        int64_t starting_point_conv = starting_point;
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 112, starting_point_conv);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 121, starting_point_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ ret_conv = *(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)(ret_ptr);
@@ -13973,7 +15106,7 @@ LDKNodeAnnouncement get_next_node_announcement_LDKRoutingMessageHandler_jcall(co
        int64_t starting_point_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(starting_point_var);
        starting_point_ref = tag_ptr(starting_point_var.inner, starting_point_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 113, starting_point_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 122, starting_point_ref);
        LDKNodeAnnouncement ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -13990,7 +15123,7 @@ LDKCResult_NoneNoneZ peer_connected_LDKRoutingMessageHandler_jcall(const void* t
        CHECK_INNER_FIELD_ACCESS_OR_NULL(init_var);
        init_ref = tag_ptr(init_var.inner, init_var.is_owned);
        jboolean inbound_conv = inbound;
-       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 114, (int64_t)their_node_id_arr, init_ref, inbound_conv);
+       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 123, (int64_t)their_node_id_arr, init_ref, inbound_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -14005,7 +15138,7 @@ LDKCResult_NoneLightningErrorZ handle_reply_channel_range_LDKRoutingMessageHandl
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 115, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 124, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14020,7 +15153,7 @@ LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_LDKRoutingMess
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 116, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 125, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14035,7 +15168,7 @@ LDKCResult_NoneLightningErrorZ handle_query_channel_range_LDKRoutingMessageHandl
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 117, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 126, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14050,7 +15183,7 @@ LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_LDKRoutingMessageH
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 118, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 127, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14059,11 +15192,11 @@ LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_LDKRoutingMessageH
 }
 bool processing_queue_high_LDKRoutingMessageHandler_jcall(const void* this_arg) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
-       return js_invoke_function_b_(j_calls->instance_ptr, 119);
+       return js_invoke_function_b_(j_calls->instance_ptr, 128);
 }
 LDKNodeFeatures provided_node_features_LDKRoutingMessageHandler_jcall(const void* this_arg) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 120);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 129);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14074,7 +15207,7 @@ LDKInitFeatures provided_init_features_LDKRoutingMessageHandler_jcall(const void
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 121, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 130, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14313,6 +15446,27 @@ static void LDKOnionMessageHandler_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
+LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ get_and_clear_connections_needed_LDKOnionMessageHandler_jcall(const void* this_arg) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 131);
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t o = 0; o < ret_constr.datalen; o++) {
+               int64_t ret_conv_40 = ret_vals[o];
+               void* ret_conv_40_ptr = untag_ptr(ret_conv_40);
+               CHECK_ACCESS(ret_conv_40_ptr);
+               LDKC2Tuple_PublicKeyCVec_SocketAddressZZ ret_conv_40_conv = *(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)(ret_conv_40_ptr);
+               FREE(untag_ptr(ret_conv_40));
+               ret_constr.data[o] = ret_conv_40_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
 void handle_onion_message_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey peer_node_id, const LDKOnionMessage * msg) {
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray peer_node_id_arr = init_int8_tArray(33, __LINE__);
@@ -14322,13 +15476,13 @@ void handle_onion_message_LDKOnionMessageHandler_jcall(const void* this_arg, LDK
        msg_var = OnionMessage_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 122, (int64_t)peer_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 132, (int64_t)peer_node_id_arr, msg_ref);
 }
 LDKOnionMessage next_onion_message_for_peer_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey peer_node_id) {
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray peer_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(peer_node_id_arr->elems, peer_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 123, (int64_t)peer_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 133, (int64_t)peer_node_id_arr);
        LDKOnionMessage ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14345,7 +15499,7 @@ LDKCResult_NoneNoneZ peer_connected_LDKOnionMessageHandler_jcall(const void* thi
        CHECK_INNER_FIELD_ACCESS_OR_NULL(init_var);
        init_ref = tag_ptr(init_var.inner, init_var.is_owned);
        jboolean inbound_conv = inbound;
-       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 124, (int64_t)their_node_id_arr, init_ref, inbound_conv);
+       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 134, (int64_t)their_node_id_arr, init_ref, inbound_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -14356,11 +15510,15 @@ void peer_disconnected_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPub
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       js_invoke_function_void_l(j_calls->instance_ptr, 125, (int64_t)their_node_id_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 135, (int64_t)their_node_id_arr);
+}
+void timer_tick_occurred_LDKOnionMessageHandler_jcall(const void* this_arg) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
+       js_invoke_function_void_(j_calls->instance_ptr, 136);
 }
 LDKNodeFeatures provided_node_features_LDKOnionMessageHandler_jcall(const void* this_arg) {
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 126);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 137);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14371,7 +15529,7 @@ LDKInitFeatures provided_init_features_LDKOnionMessageHandler_jcall(const void*
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 127, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 138, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14389,10 +15547,12 @@ static inline LDKOnionMessageHandler LDKOnionMessageHandler_init (int64_t o) {
 
        LDKOnionMessageHandler ret = {
                .this_arg = (void*) calls,
+               .get_and_clear_connections_needed = get_and_clear_connections_needed_LDKOnionMessageHandler_jcall,
                .handle_onion_message = handle_onion_message_LDKOnionMessageHandler_jcall,
                .next_onion_message_for_peer = next_onion_message_for_peer_LDKOnionMessageHandler_jcall,
                .peer_connected = peer_connected_LDKOnionMessageHandler_jcall,
                .peer_disconnected = peer_disconnected_LDKOnionMessageHandler_jcall,
+               .timer_tick_occurred = timer_tick_occurred_LDKOnionMessageHandler_jcall,
                .provided_node_features = provided_node_features_LDKOnionMessageHandler_jcall,
                .provided_init_features = provided_init_features_LDKOnionMessageHandler_jcall,
                .free = LDKOnionMessageHandler_JCalls_free,
@@ -14404,6 +15564,24 @@ uint64_t  CS_LDK_LDKOnionMessageHandler_new(int32_t o) {
        *res_ptr = LDKOnionMessageHandler_init(o);
        return tag_ptr(res_ptr, true);
 }
+int64_tArray  CS_LDK_OnionMessageHandler_get_and_clear_connections_needed(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ ret_var = (this_arg_conv->get_and_clear_connections_needed)(this_arg_conv->this_arg);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t o = 0; o < ret_var.datalen; o++) {
+               LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv_40_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+               *ret_conv_40_conv = ret_var.data[o];
+               ret_arr_ptr[o] = tag_ptr(ret_conv_40_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
 void  CS_LDK_OnionMessageHandler_handle_onion_message(int64_t this_arg, int8_tArray peer_node_id, int64_t msg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
@@ -14460,6 +15638,13 @@ void  CS_LDK_OnionMessageHandler_peer_disconnected(int64_t this_arg, int8_tArray
        (this_arg_conv->peer_disconnected)(this_arg_conv->this_arg, their_node_id_ref);
 }
 
+void  CS_LDK_OnionMessageHandler_timer_tick_occurred(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       (this_arg_conv->timer_tick_occurred)(this_arg_conv->this_arg);
+}
+
 int64_t  CS_LDK_OnionMessageHandler_provided_node_features(int64_t this_arg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
@@ -14501,7 +15686,7 @@ LDKCResult_COption_TypeZDecodeErrorZ read_LDKCustomMessageReader_jcall(const voi
        LDKu8slice buffer_var = buffer;
        int8_tArray buffer_arr = init_int8_tArray(buffer_var.datalen, __LINE__);
        memcpy(buffer_arr->elems, buffer_var.data, buffer_var.datalen);
-       uint64_t ret = js_invoke_function_l_sl(j_calls->instance_ptr, 128, message_type_conv, (int64_t)buffer_arr);
+       uint64_t ret = js_invoke_function_l_sl(j_calls->instance_ptr, 139, message_type_conv, (int64_t)buffer_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_COption_TypeZDecodeErrorZ ret_conv = *(LDKCResult_COption_TypeZDecodeErrorZ*)(ret_ptr);
@@ -14559,7 +15744,7 @@ LDKCResult_NoneLightningErrorZ handle_custom_message_LDKCustomMessageHandler_jca
        *msg_ret = msg;
        int8_tArray sender_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(sender_node_id_arr->elems, sender_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 129, tag_ptr(msg_ret, true), (int64_t)sender_node_id_arr);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 140, tag_ptr(msg_ret, true), (int64_t)sender_node_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14568,7 +15753,7 @@ LDKCResult_NoneLightningErrorZ handle_custom_message_LDKCustomMessageHandler_jca
 }
 LDKCVec_C2Tuple_PublicKeyTypeZZ get_and_clear_pending_msg_LDKCustomMessageHandler_jcall(const void* this_arg) {
        LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 130);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 141);
        LDKCVec_C2Tuple_PublicKeyTypeZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -14589,7 +15774,7 @@ LDKCVec_C2Tuple_PublicKeyTypeZZ get_and_clear_pending_msg_LDKCustomMessageHandle
 }
 LDKNodeFeatures provided_node_features_LDKCustomMessageHandler_jcall(const void* this_arg) {
        LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 131);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 142);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14600,7 +15785,7 @@ LDKInitFeatures provided_init_features_LDKCustomMessageHandler_jcall(const void*
        LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 132, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 143, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14710,7 +15895,7 @@ LDKCOption_OnionMessageContentsZ handle_custom_message_LDKCustomOnionMessageHand
        LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
        LDKOnionMessageContents* msg_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
        *msg_ret = msg;
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 133, tag_ptr(msg_ret, true));
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 144, tag_ptr(msg_ret, true));
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_OnionMessageContentsZ ret_conv = *(LDKCOption_OnionMessageContentsZ*)(ret_ptr);
@@ -14723,7 +15908,7 @@ LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_message_LDKCust
        LDKu8slice buffer_var = buffer;
        int8_tArray buffer_arr = init_int8_tArray(buffer_var.datalen, __LINE__);
        memcpy(buffer_arr->elems, buffer_var.data, buffer_var.datalen);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 134, message_type_conv, (int64_t)buffer_arr);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 145, message_type_conv, (int64_t)buffer_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_COption_OnionMessageContentsZDecodeErrorZ ret_conv = *(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)(ret_ptr);
@@ -14732,7 +15917,7 @@ LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_message_LDKCust
 }
 LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ release_pending_custom_messages_LDKCustomOnionMessageHandler_jcall(const void* this_arg) {
        LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 135);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 146);
        LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -14838,21 +16023,21 @@ uintptr_t send_data_LDKSocketDescriptor_jcall(void* this_arg, LDKu8slice data, b
        int8_tArray data_arr = init_int8_tArray(data_var.datalen, __LINE__);
        memcpy(data_arr->elems, data_var.data, data_var.datalen);
        jboolean resume_read_conv = resume_read;
-       return js_invoke_function_l_lb(j_calls->instance_ptr, 136, (int64_t)data_arr, resume_read_conv);
+       return js_invoke_function_l_lb(j_calls->instance_ptr, 147, (int64_t)data_arr, resume_read_conv);
 }
 void disconnect_socket_LDKSocketDescriptor_jcall(void* this_arg) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
-       js_invoke_function_void_(j_calls->instance_ptr, 137);
+       js_invoke_function_void_(j_calls->instance_ptr, 148);
 }
 bool eq_LDKSocketDescriptor_jcall(const void* this_arg, const LDKSocketDescriptor * other_arg) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
        LDKSocketDescriptor *other_arg_clone = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
        *other_arg_clone = SocketDescriptor_clone(other_arg);
-       return js_invoke_function_b_l(j_calls->instance_ptr, 138, tag_ptr(other_arg_clone, true));
+       return js_invoke_function_b_l(j_calls->instance_ptr, 149, tag_ptr(other_arg_clone, true));
 }
 uint64_t hash_LDKSocketDescriptor_jcall(const void* this_arg) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
-       return js_invoke_function_l_(j_calls->instance_ptr, 139);
+       return js_invoke_function_l_(j_calls->instance_ptr, 150);
 }
 static void LDKSocketDescriptor_JCalls_cloned(LDKSocketDescriptor* new_obj) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) new_obj->this_arg;
@@ -15034,7 +16219,7 @@ static void LDKScore_JCalls_free(void* this_arg) {
 }
 LDKCVec_u8Z write_LDKScore_jcall(const void* this_arg) {
        LDKScore_JCalls *j_calls = (LDKScore_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 140);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 151);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
@@ -15079,93 +16264,6 @@ int8_tArray  CS_LDK_Score_write(int64_t this_arg) {
        return ret_arr;
 }
 
-typedef struct LDKMessageRouter_JCalls {
-       atomic_size_t refcnt;
-       uint32_t instance_ptr;
-} LDKMessageRouter_JCalls;
-static void LDKMessageRouter_JCalls_free(void* this_arg) {
-       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
-       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
-               FREE(j_calls);
-       }
-}
-LDKCResult_OnionMessagePathNoneZ find_path_LDKMessageRouter_jcall(const void* this_arg, LDKPublicKey sender, LDKCVec_PublicKeyZ peers, LDKDestination destination) {
-       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
-       int8_tArray sender_arr = init_int8_tArray(33, __LINE__);
-       memcpy(sender_arr->elems, sender.compressed_form, 33);
-       LDKCVec_PublicKeyZ peers_var = peers;
-       ptrArray peers_arr = NULL;
-       peers_arr = init_ptrArray(peers_var.datalen, __LINE__);
-       int8_tArray *peers_arr_ptr = (int8_tArray*)(((uint8_t*)peers_arr) + 8);
-       for (size_t i = 0; i < peers_var.datalen; i++) {
-               int8_tArray peers_conv_8_arr = init_int8_tArray(33, __LINE__);
-               memcpy(peers_conv_8_arr->elems, peers_var.data[i].compressed_form, 33);
-               peers_arr_ptr[i] = peers_conv_8_arr;
-       }
-       
-       FREE(peers_var.data);
-       LDKDestination *destination_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
-       *destination_copy = destination;
-       int64_t destination_ref = tag_ptr(destination_copy, true);
-       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 141, (int64_t)sender_arr, (int64_t)peers_arr, destination_ref);
-       void* ret_ptr = untag_ptr(ret);
-       CHECK_ACCESS(ret_ptr);
-       LDKCResult_OnionMessagePathNoneZ ret_conv = *(LDKCResult_OnionMessagePathNoneZ*)(ret_ptr);
-       FREE(untag_ptr(ret));
-       return ret_conv;
-}
-static void LDKMessageRouter_JCalls_cloned(LDKMessageRouter* new_obj) {
-       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) new_obj->this_arg;
-       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
-}
-static inline LDKMessageRouter LDKMessageRouter_init (int64_t o) {
-       LDKMessageRouter_JCalls *calls = MALLOC(sizeof(LDKMessageRouter_JCalls), "LDKMessageRouter_JCalls");
-       atomic_init(&calls->refcnt, 1);
-       calls->instance_ptr = o;
-
-       LDKMessageRouter ret = {
-               .this_arg = (void*) calls,
-               .find_path = find_path_LDKMessageRouter_jcall,
-               .free = LDKMessageRouter_JCalls_free,
-       };
-       return ret;
-}
-uint64_t  CS_LDK_LDKMessageRouter_new(int32_t o) {
-       LDKMessageRouter *res_ptr = MALLOC(sizeof(LDKMessageRouter), "LDKMessageRouter");
-       *res_ptr = LDKMessageRouter_init(o);
-       return tag_ptr(res_ptr, true);
-}
-int64_t  CS_LDK_MessageRouter_find_path(int64_t this_arg, int8_tArray sender, ptrArray peers, int64_t destination) {
-       void* this_arg_ptr = untag_ptr(this_arg);
-       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
-       LDKMessageRouter* this_arg_conv = (LDKMessageRouter*)this_arg_ptr;
-       LDKPublicKey sender_ref;
-       CHECK(sender->arr_len == 33);
-       memcpy(sender_ref.compressed_form, sender->elems, 33); FREE(sender);
-       LDKCVec_PublicKeyZ peers_constr;
-       peers_constr.datalen = peers->arr_len;
-       if (peers_constr.datalen > 0)
-               peers_constr.data = MALLOC(peers_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
-       else
-               peers_constr.data = NULL;
-       int8_tArray* peers_vals = (void*) peers->elems;
-       for (size_t i = 0; i < peers_constr.datalen; i++) {
-               int8_tArray peers_conv_8 = peers_vals[i];
-               LDKPublicKey peers_conv_8_ref;
-               CHECK(peers_conv_8->arr_len == 33);
-               memcpy(peers_conv_8_ref.compressed_form, peers_conv_8->elems, 33); FREE(peers_conv_8);
-               peers_constr.data[i] = peers_conv_8_ref;
-       }
-       FREE(peers);
-       void* destination_ptr = untag_ptr(destination);
-       CHECK_ACCESS(destination_ptr);
-       LDKDestination destination_conv = *(LDKDestination*)(destination_ptr);
-       destination_conv = Destination_clone((LDKDestination*)untag_ptr(destination));
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = (this_arg_conv->find_path)(this_arg_conv->this_arg, sender_ref, peers_constr, destination_conv);
-       return tag_ptr(ret_conv, true);
-}
-
 typedef struct LDKCoinSelectionSource_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -15205,20 +16303,20 @@ LDKCResult_CoinSelectionNoneZ select_confirmed_utxos_LDKCoinSelectionSource_jcal
        
        FREE(must_pay_to_var.data);
        int32_t target_feerate_sat_per_1000_weight_conv = target_feerate_sat_per_1000_weight;
-       uint64_t ret = js_invoke_function_l_llli(j_calls->instance_ptr, 142, (int64_t)claim_id_arr, (int64_t)must_spend_arr, (int64_t)must_pay_to_arr, target_feerate_sat_per_1000_weight_conv);
+       uint64_t ret = js_invoke_function_l_llli(j_calls->instance_ptr, 152, (int64_t)claim_id_arr, (int64_t)must_spend_arr, (int64_t)must_pay_to_arr, target_feerate_sat_per_1000_weight_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CoinSelectionNoneZ ret_conv = *(LDKCResult_CoinSelectionNoneZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_TransactionNoneZ sign_tx_LDKCoinSelectionSource_jcall(const void* this_arg, LDKTransaction tx) {
+LDKCResult_TransactionNoneZ sign_psbt_LDKCoinSelectionSource_jcall(const void* this_arg, LDKCVec_u8Z psbt) {
        LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) this_arg;
-       LDKTransaction tx_var = tx;
-       int8_tArray tx_arr = init_int8_tArray(tx_var.datalen, __LINE__);
-       memcpy(tx_arr->elems, tx_var.data, tx_var.datalen);
-       Transaction_free(tx_var);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 143, (int64_t)tx_arr);
+       LDKCVec_u8Z psbt_var = psbt;
+       int8_tArray psbt_arr = init_int8_tArray(psbt_var.datalen, __LINE__);
+       memcpy(psbt_arr->elems, psbt_var.data, psbt_var.datalen);
+       CVec_u8Z_free(psbt_var);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 153, (int64_t)psbt_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
@@ -15237,7 +16335,7 @@ static inline LDKCoinSelectionSource LDKCoinSelectionSource_init (int64_t o) {
        LDKCoinSelectionSource ret = {
                .this_arg = (void*) calls,
                .select_confirmed_utxos = select_confirmed_utxos_LDKCoinSelectionSource_jcall,
-               .sign_tx = sign_tx_LDKCoinSelectionSource_jcall,
+               .sign_psbt = sign_psbt_LDKCoinSelectionSource_jcall,
                .free = LDKCoinSelectionSource_JCalls_free,
        };
        return ret;
@@ -15292,17 +16390,16 @@ int64_t  CS_LDK_CoinSelectionSource_select_confirmed_utxos(int64_t this_arg, int
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CoinSelectionSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+int64_t  CS_LDK_CoinSelectionSource_sign_psbt(int64_t this_arg, int8_tArray psbt) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKCoinSelectionSource* this_arg_conv = (LDKCoinSelectionSource*)this_arg_ptr;
-       LDKTransaction tx_ref;
-       tx_ref.datalen = tx->arr_len;
-       tx_ref.data = MALLOC(tx_ref.datalen, "LDKTransaction Bytes");
-       memcpy(tx_ref.data, tx->elems, tx_ref.datalen); FREE(tx);
-       tx_ref.data_is_owned = true;
+       LDKCVec_u8Z psbt_ref;
+       psbt_ref.datalen = psbt->arr_len;
+       psbt_ref.data = MALLOC(psbt_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(psbt_ref.data, psbt->elems, psbt_ref.datalen); FREE(psbt);
        LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
-       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       *ret_conv = (this_arg_conv->sign_psbt)(this_arg_conv->this_arg, psbt_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -15318,7 +16415,7 @@ static void LDKWalletSource_JCalls_free(void* this_arg) {
 }
 LDKCResult_CVec_UtxoZNoneZ list_confirmed_utxos_LDKWalletSource_jcall(const void* this_arg) {
        LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 144);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 154);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_UtxoZNoneZ ret_conv = *(LDKCResult_CVec_UtxoZNoneZ*)(ret_ptr);
@@ -15327,20 +16424,20 @@ LDKCResult_CVec_UtxoZNoneZ list_confirmed_utxos_LDKWalletSource_jcall(const void
 }
 LDKCResult_CVec_u8ZNoneZ get_change_script_LDKWalletSource_jcall(const void* this_arg) {
        LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 145);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 155);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_u8ZNoneZ ret_conv = *(LDKCResult_CVec_u8ZNoneZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_TransactionNoneZ sign_tx_LDKWalletSource_jcall(const void* this_arg, LDKTransaction tx) {
+LDKCResult_TransactionNoneZ sign_psbt_LDKWalletSource_jcall(const void* this_arg, LDKCVec_u8Z psbt) {
        LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
-       LDKTransaction tx_var = tx;
-       int8_tArray tx_arr = init_int8_tArray(tx_var.datalen, __LINE__);
-       memcpy(tx_arr->elems, tx_var.data, tx_var.datalen);
-       Transaction_free(tx_var);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 146, (int64_t)tx_arr);
+       LDKCVec_u8Z psbt_var = psbt;
+       int8_tArray psbt_arr = init_int8_tArray(psbt_var.datalen, __LINE__);
+       memcpy(psbt_arr->elems, psbt_var.data, psbt_var.datalen);
+       CVec_u8Z_free(psbt_var);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 156, (int64_t)psbt_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
@@ -15360,7 +16457,7 @@ static inline LDKWalletSource LDKWalletSource_init (int64_t o) {
                .this_arg = (void*) calls,
                .list_confirmed_utxos = list_confirmed_utxos_LDKWalletSource_jcall,
                .get_change_script = get_change_script_LDKWalletSource_jcall,
-               .sign_tx = sign_tx_LDKWalletSource_jcall,
+               .sign_psbt = sign_psbt_LDKWalletSource_jcall,
                .free = LDKWalletSource_JCalls_free,
        };
        return ret;
@@ -15388,17 +16485,16 @@ int64_t  CS_LDK_WalletSource_get_change_script(int64_t this_arg) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_WalletSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+int64_t  CS_LDK_WalletSource_sign_psbt(int64_t this_arg, int8_tArray psbt) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKWalletSource* this_arg_conv = (LDKWalletSource*)this_arg_ptr;
-       LDKTransaction tx_ref;
-       tx_ref.datalen = tx->arr_len;
-       tx_ref.data = MALLOC(tx_ref.datalen, "LDKTransaction Bytes");
-       memcpy(tx_ref.data, tx->elems, tx_ref.datalen); FREE(tx);
-       tx_ref.data_is_owned = true;
+       LDKCVec_u8Z psbt_ref;
+       psbt_ref.datalen = psbt->arr_len;
+       psbt_ref.data = MALLOC(psbt_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(psbt_ref.data, psbt->elems, psbt_ref.datalen); FREE(psbt);
        LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
-       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       *ret_conv = (this_arg_conv->sign_psbt)(this_arg_conv->this_arg, psbt_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -15498,6 +16594,58 @@ int8_tArray  CS_LDK_U128_new(int8_tArray le_bytes) {
        return ret_arr;
 }
 
+int64_t  CS_LDK_WitnessProgram_new(int8_t version, int8_tArray program) {
+       
+       LDKCVec_u8Z program_ref;
+       program_ref.datalen = program->arr_len;
+       program_ref.data = MALLOC(program_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(program_ref.data, program->elems, program_ref.datalen); FREE(program);
+       LDKWitnessProgram* ret_ref = MALLOC(sizeof(LDKWitnessProgram), "LDKWitnessProgram");
+       *ret_ref = WitnessProgram_new((LDKWitnessVersion){ ._0 = version }, program_ref);
+       return tag_ptr(ret_ref, true);
+}
+
+int8_t  CS_LDK_WitnessProgram_get_version(int64_t prog) {
+       LDKWitnessProgram* prog_conv = (LDKWitnessProgram*)untag_ptr(prog);
+       uint8_t ret_val = WitnessProgram_get_version(prog_conv)._0;
+       return ret_val;
+}
+
+int8_tArray  CS_LDK_WitnessProgram_get_program(int64_t prog) {
+       LDKWitnessProgram* prog_conv = (LDKWitnessProgram*)untag_ptr(prog);
+       LDKu8slice ret_var = WitnessProgram_get_program(prog_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       return ret_arr;
+}
+
+static inline uint64_t WitnessProgram_clone_ptr(LDKWitnessProgram *NONNULL_PTR arg) {
+       LDKWitnessProgram* ret_ref = MALLOC(sizeof(LDKWitnessProgram), "LDKWitnessProgram");
+       *ret_ref = WitnessProgram_clone(arg);
+       return tag_ptr(ret_ref, true);
+}
+int64_t  CS_LDK_WitnessProgram_clone_ptr(int64_t arg) {
+       LDKWitnessProgram* arg_conv = (LDKWitnessProgram*)untag_ptr(arg);
+       int64_t ret_conv = WitnessProgram_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WitnessProgram_clone(int64_t orig) {
+       LDKWitnessProgram* orig_conv = (LDKWitnessProgram*)untag_ptr(orig);
+       LDKWitnessProgram* ret_ref = MALLOC(sizeof(LDKWitnessProgram), "LDKWitnessProgram");
+       *ret_ref = WitnessProgram_clone(orig_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_WitnessProgram_free(int64_t o) {
+       if (!ptr_is_owned(o)) return;
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKWitnessProgram o_conv = *(LDKWitnessProgram*)(o_ptr);
+       FREE(untag_ptr(o));
+       WitnessProgram_free(o_conv);
+}
+
 int64_t  CS_LDK_BigEndianScalar_new(int8_tArray big_endian_bytes) {
        LDKThirtyTwoBytes big_endian_bytes_ref;
        CHECK(big_endian_bytes->arr_len == 32);
@@ -15554,15 +16702,6 @@ void  CS_LDK_Witness_free(int8_tArray _res) {
        Witness_free(_res_ref);
 }
 
-void  CS_LDK_TxIn_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKTxIn _res_conv = *(LDKTxIn*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       TxIn_free(_res_conv);
-}
-
 int64_t  CS_LDK_TxIn_new(int8_tArray witness, int8_tArray script_sig, int32_t sequence, int8_tArray previous_txid, int32_t previous_vout) {
        LDKWitness witness_ref;
        witness_ref.datalen = witness->arr_len;
@@ -15581,6 +16720,51 @@ int64_t  CS_LDK_TxIn_new(int8_tArray witness, int8_tArray script_sig, int32_t se
        return tag_ptr(ret_ref, true);
 }
 
+int8_tArray  CS_LDK_TxIn_get_witness(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       LDKWitness ret_var = TxIn_get_witness(txin_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       Witness_free(ret_var);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TxIn_get_script_sig(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       LDKu8slice ret_var = TxIn_get_script_sig(txin_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_TxIn_get_sequence(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       int32_t ret_conv = TxIn_get_sequence(txin_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_TxIn_get_previous_txid(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, TxIn_get_previous_txid(txin_conv).data, 32);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_TxIn_get_previous_vout(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       int32_t ret_conv = TxIn_get_previous_vout(txin_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxIn_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKTxIn _res_conv = *(LDKTxIn*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       TxIn_free(_res_conv);
+}
+
 int64_t  CS_LDK_TxOut_new(int8_tArray script_pubkey, int64_t value) {
        LDKCVec_u8Z script_pubkey_ref;
        script_pubkey_ref.datalen = script_pubkey->arr_len;
@@ -15591,6 +16775,20 @@ int64_t  CS_LDK_TxOut_new(int8_tArray script_pubkey, int64_t value) {
        return tag_ptr(ret_ref, true);
 }
 
+int8_tArray  CS_LDK_TxOut_get_script_pubkey(int64_t txout) {
+       LDKTxOut* txout_conv = (LDKTxOut*)untag_ptr(txout);
+       LDKu8slice ret_var = TxOut_get_script_pubkey(txout_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_TxOut_get_value(int64_t txout) {
+       LDKTxOut* txout_conv = (LDKTxOut*)untag_ptr(txout);
+       int64_t ret_conv = TxOut_get_value(txout_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_TxOut_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
@@ -16568,89 +17766,89 @@ int64_t  CS_LDK_COption_u32Z_clone(int64_t orig) {
        return ret_ref;
 }
 
-static inline uint64_t C2Tuple_CVec_u8ZusizeZ_clone_ptr(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR arg) {
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = C2Tuple_CVec_u8ZusizeZ_clone(arg);
+static inline uint64_t C2Tuple_CVec_u8Zu64Z_clone_ptr(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR arg) {
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = C2Tuple_CVec_u8Zu64Z_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_CVec_u8ZusizeZ* arg_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_CVec_u8ZusizeZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple_CVec_u8Zu64Z* arg_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_CVec_u8Zu64Z_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_clone(int64_t orig) {
-       LDKC2Tuple_CVec_u8ZusizeZ* orig_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(orig);
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = C2Tuple_CVec_u8ZusizeZ_clone(orig_conv);
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_clone(int64_t orig) {
+       LDKC2Tuple_CVec_u8Zu64Z* orig_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(orig);
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = C2Tuple_CVec_u8Zu64Z_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_new(int8_tArray a, int64_t b) {
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_new(int8_tArray a, int64_t b) {
        LDKCVec_u8Z a_ref;
        a_ref.datalen = a->arr_len;
        a_ref.data = MALLOC(a_ref.datalen, "LDKCVec_u8Z Bytes");
        memcpy(a_ref.data, a->elems, a_ref.datalen); FREE(a);
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = C2Tuple_CVec_u8ZusizeZ_new(a_ref, b);
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = C2Tuple_CVec_u8Zu64Z_new(a_ref, b);
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_C2Tuple_CVec_u8ZusizeZ_free(int64_t _res) {
+void  CS_LDK_C2Tuple_CVec_u8Zu64Z_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_CVec_u8ZusizeZ _res_conv = *(LDKC2Tuple_CVec_u8ZusizeZ*)(_res_ptr);
+       LDKC2Tuple_CVec_u8Zu64Z _res_conv = *(LDKC2Tuple_CVec_u8Zu64Z*)(_res_ptr);
        FREE(untag_ptr(_res));
-       C2Tuple_CVec_u8ZusizeZ_free(_res_conv);
+       C2Tuple_CVec_u8Zu64Z_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok(int64_t o) {
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
-       LDKC2Tuple_CVec_u8ZusizeZ o_conv = *(LDKC2Tuple_CVec_u8ZusizeZ*)(o_ptr);
-       o_conv = C2Tuple_CVec_u8ZusizeZ_clone((LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(o));
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok(o_conv);
+       LDKC2Tuple_CVec_u8Zu64Z o_conv = *(LDKC2Tuple_CVec_u8Zu64Z*)(o_ptr);
+       o_conv = C2Tuple_CVec_u8Zu64Z_clone((LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(o));
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err() {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err();
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err() {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err();
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(int64_t o) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* o_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* o_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free(int64_t _res) {
+void  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ _res_conv = *(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)(_res_ptr);
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ _res_conv = *(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free(_res_conv);
+       CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free(_res_conv);
 }
 
-static inline uint64_t CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR arg) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(arg);
+static inline uint64_t CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* arg_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* arg_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(int64_t orig) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* orig_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(orig);
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(orig_conv);
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* orig_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -16807,173 +18005,6 @@ int64_t  CS_LDK_CResult_NoneNoneZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_CVec_ECDSASignatureZ_free(ptrArray _res) {
-       LDKCVec_ECDSASignatureZ _res_constr;
-       _res_constr.datalen = _res->arr_len;
-       if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
-       else
-               _res_constr.data = NULL;
-       int8_tArray* _res_vals = (void*) _res->elems;
-       for (size_t i = 0; i < _res_constr.datalen; i++) {
-               int8_tArray _res_conv_8 = _res_vals[i];
-               LDKECDSASignature _res_conv_8_ref;
-               CHECK(_res_conv_8->arr_len == 64);
-               memcpy(_res_conv_8_ref.compact_form, _res_conv_8->elems, 64); FREE(_res_conv_8);
-               _res_constr.data[i] = _res_conv_8_ref;
-       }
-       FREE(_res);
-       CVec_ECDSASignatureZ_free(_res_constr);
-}
-
-static inline uint64_t C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR arg) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* arg_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(int64_t orig) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* orig_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(orig);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(int8_tArray a, ptrArray b) {
-       LDKECDSASignature a_ref;
-       CHECK(a->arr_len == 64);
-       memcpy(a_ref.compact_form, a->elems, 64); FREE(a);
-       LDKCVec_ECDSASignatureZ b_constr;
-       b_constr.datalen = b->arr_len;
-       if (b_constr.datalen > 0)
-               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
-       else
-               b_constr.data = NULL;
-       int8_tArray* b_vals = (void*) b->elems;
-       for (size_t i = 0; i < b_constr.datalen; i++) {
-               int8_tArray b_conv_8 = b_vals[i];
-               LDKECDSASignature b_conv_8_ref;
-               CHECK(b_conv_8->arr_len == 64);
-               memcpy(b_conv_8_ref.compact_form, b_conv_8->elems, 64); FREE(b_conv_8);
-               b_constr.data[i] = b_conv_8_ref;
-       }
-       FREE(b);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(a_ref, b_constr);
-       return tag_ptr(ret_conv, true);
-}
-
-void  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ _res_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(_res_conv);
-}
-
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(int64_t o) {
-       void* o_ptr = untag_ptr(o);
-       CHECK_ACCESS(o_ptr);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ o_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(o_ptr);
-       o_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone((LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(o));
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(o_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err() {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err();
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(int64_t o) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* o_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR arg) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* arg_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(int64_t orig) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(orig);
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_ok(int8_tArray o) {
-       LDKECDSASignature o_ref;
-       CHECK(o->arr_len == 64);
-       memcpy(o_ref.compact_form, o->elems, 64); FREE(o);
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_ok(o_ref);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_err() {
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_err();
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_ECDSASignatureNoneZ_is_ok(int64_t o) {
-       LDKCResult_ECDSASignatureNoneZ* o_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_ECDSASignatureNoneZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_ECDSASignatureNoneZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_ECDSASignatureNoneZ _res_conv = *(LDKCResult_ECDSASignatureNoneZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_ECDSASignatureNoneZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_ECDSASignatureNoneZ_clone_ptr(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR arg) {
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_ECDSASignatureNoneZ* arg_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_ECDSASignatureNoneZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone(int64_t orig) {
-       LDKCResult_ECDSASignatureNoneZ* orig_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(orig);
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
 int64_t  CS_LDK_CResult_PublicKeyNoneZ_ok(int8_tArray o) {
        LDKPublicKey o_ref;
        CHECK(o->arr_len == 33);
@@ -17182,6 +18213,54 @@ int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_ok(int8_tArray o) {
+       LDKECDSASignature o_ref;
+       CHECK(o->arr_len == 64);
+       memcpy(o_ref.compact_form, o->elems, 64); FREE(o);
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_err() {
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ECDSASignatureNoneZ_is_ok(int64_t o) {
+       LDKCResult_ECDSASignatureNoneZ* o_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ECDSASignatureNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ECDSASignatureNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ECDSASignatureNoneZ _res_conv = *(LDKCResult_ECDSASignatureNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ECDSASignatureNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ECDSASignatureNoneZ_clone_ptr(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ECDSASignatureNoneZ* arg_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ECDSASignatureNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone(int64_t orig) {
+       LDKCResult_ECDSASignatureNoneZ* orig_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(orig);
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_ok(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
@@ -17423,84 +18502,172 @@ int64_t  CS_LDK_COption_boolZ_clone(int64_t orig) {
        return ret_ref;
 }
 
-void  CS_LDK_CVec_CVec_u8ZZ_free(ptrArray _res) {
-       LDKCVec_CVec_u8ZZ _res_constr;
+int64_t  CS_LDK_CResult_WitnessNoneZ_ok(int8_tArray o) {
+       LDKWitness o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKWitness Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       o_ref.data_is_owned = true;
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WitnessNoneZ_err() {
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_WitnessNoneZ_is_ok(int64_t o) {
+       LDKCResult_WitnessNoneZ* o_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_WitnessNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_WitnessNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_WitnessNoneZ _res_conv = *(LDKCResult_WitnessNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_WitnessNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_WitnessNoneZ_clone_ptr(LDKCResult_WitnessNoneZ *NONNULL_PTR arg) {
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_WitnessNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_WitnessNoneZ* arg_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_WitnessNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_WitnessNoneZ_clone(int64_t orig) {
+       LDKCResult_WitnessNoneZ* orig_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(orig);
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ECDSASignatureZ_free(ptrArray _res) {
+       LDKCVec_ECDSASignatureZ _res_constr;
        _res_constr.datalen = _res->arr_len;
        if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKCVec_u8Z), "LDKCVec_CVec_u8ZZ Elements");
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
        else
                _res_constr.data = NULL;
        int8_tArray* _res_vals = (void*) _res->elems;
        for (size_t i = 0; i < _res_constr.datalen; i++) {
                int8_tArray _res_conv_8 = _res_vals[i];
-               LDKCVec_u8Z _res_conv_8_ref;
-               _res_conv_8_ref.datalen = _res_conv_8->arr_len;
-               _res_conv_8_ref.data = MALLOC(_res_conv_8_ref.datalen, "LDKCVec_u8Z Bytes");
-               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, _res_conv_8_ref.datalen); FREE(_res_conv_8);
+               LDKECDSASignature _res_conv_8_ref;
+               CHECK(_res_conv_8->arr_len == 64);
+               memcpy(_res_conv_8_ref.compact_form, _res_conv_8->elems, 64); FREE(_res_conv_8);
                _res_constr.data[i] = _res_conv_8_ref;
        }
        FREE(_res);
-       CVec_CVec_u8ZZ_free(_res_constr);
+       CVec_ECDSASignatureZ_free(_res_constr);
 }
 
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_ok(ptrArray o) {
-       LDKCVec_CVec_u8ZZ o_constr;
-       o_constr.datalen = o->arr_len;
-       if (o_constr.datalen > 0)
-               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKCVec_u8Z), "LDKCVec_CVec_u8ZZ Elements");
+static inline uint64_t C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* arg_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(int64_t orig) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* orig_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(orig);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(int8_tArray a, ptrArray b) {
+       LDKECDSASignature a_ref;
+       CHECK(a->arr_len == 64);
+       memcpy(a_ref.compact_form, a->elems, 64); FREE(a);
+       LDKCVec_ECDSASignatureZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
        else
-               o_constr.data = NULL;
-       int8_tArray* o_vals = (void*) o->elems;
-       for (size_t i = 0; i < o_constr.datalen; i++) {
-               int8_tArray o_conv_8 = o_vals[i];
-               LDKCVec_u8Z o_conv_8_ref;
-               o_conv_8_ref.datalen = o_conv_8->arr_len;
-               o_conv_8_ref.data = MALLOC(o_conv_8_ref.datalen, "LDKCVec_u8Z Bytes");
-               memcpy(o_conv_8_ref.data, o_conv_8->elems, o_conv_8_ref.datalen); FREE(o_conv_8);
-               o_constr.data[i] = o_conv_8_ref;
+               b_constr.data = NULL;
+       int8_tArray* b_vals = (void*) b->elems;
+       for (size_t i = 0; i < b_constr.datalen; i++) {
+               int8_tArray b_conv_8 = b_vals[i];
+               LDKECDSASignature b_conv_8_ref;
+               CHECK(b_conv_8->arr_len == 64);
+               memcpy(b_conv_8_ref.compact_form, b_conv_8->elems, 64); FREE(b_conv_8);
+               b_constr.data[i] = b_conv_8_ref;
        }
-       FREE(o);
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_ok(o_constr);
+       FREE(b);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(a_ref, b_constr);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_err() {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_err();
+void  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ _res_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ o_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(o_ptr);
+       o_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone((LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_is_ok(int64_t o) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* o_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_CVec_CVec_u8ZZNoneZ_is_ok(o_conv);
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err() {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* o_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_free(int64_t _res) {
+void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_CVec_CVec_u8ZZNoneZ _res_conv = *(LDKCResult_CVec_CVec_u8ZZNoneZ*)(_res_ptr);
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_CVec_CVec_u8ZZNoneZ_free(_res_conv);
+       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(_res_conv);
 }
 
-static inline uint64_t CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR arg) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_clone(arg);
+static inline uint64_t CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* arg_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* arg_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_clone(int64_t orig) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* orig_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(orig);
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_clone(orig_conv);
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -17759,6 +18926,261 @@ int64_t  CS_LDK_CResult_RouteLightningErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+static inline uint64_t C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR arg) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* arg_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone(int64_t orig) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* orig_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(orig);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_new(int64_t a, int64_t b) {
+       LDKBlindedPayInfo a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = BlindedPayInfo_clone(&a_conv);
+       LDKBlindedPath b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv = BlindedPath_clone(&b_conv);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_new(a_conv, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_BlindedPayInfoBlindedPathZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t l = 0; l < _res_constr.datalen; l++) {
+               int64_t _res_conv_37 = _res_vals[l];
+               void* _res_conv_37_ptr = untag_ptr(_res_conv_37);
+               CHECK_ACCESS(_res_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_conv_37_ptr);
+               FREE(untag_ptr(_res_conv_37));
+               _res_constr.data[l] = _res_conv_37_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok(int64_tArray o) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t l = 0; l < o_constr.datalen; l++) {
+               int64_t o_conv_37 = o_vals[l];
+               void* o_conv_37_ptr = untag_ptr(o_conv_37);
+               CHECK_ACCESS(o_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ o_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(o_conv_37_ptr);
+               o_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(o_conv_37));
+               o_constr.data[l] = o_conv_37_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err() {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* o_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ _res_conv = *(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* arg_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* orig_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_PublicKeyZ_free(ptrArray _res) {
+       LDKCVec_PublicKeyZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               _res_constr.data = NULL;
+       int8_tArray* _res_vals = (void*) _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               int8_tArray _res_conv_8 = _res_vals[i];
+               LDKPublicKey _res_conv_8_ref;
+               CHECK(_res_conv_8->arr_len == 33);
+               memcpy(_res_conv_8_ref.compressed_form, _res_conv_8->elems, 33); FREE(_res_conv_8);
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_PublicKeyZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_ok(int64_t o) {
+       LDKOnionMessagePath o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = OnionMessagePath_clone(&o_conv);
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_err() {
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OnionMessagePathNoneZ_is_ok(int64_t o) {
+       LDKCResult_OnionMessagePathNoneZ* o_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OnionMessagePathNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OnionMessagePathNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OnionMessagePathNoneZ _res_conv = *(LDKCResult_OnionMessagePathNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OnionMessagePathNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OnionMessagePathNoneZ_clone_ptr(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR arg) {
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_OnionMessagePathNoneZ* arg_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OnionMessagePathNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone(int64_t orig) {
+       LDKCResult_OnionMessagePathNoneZ* orig_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(orig);
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_ok(int64_tArray o) {
+       LDKCVec_BlindedPathZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKBlindedPath), "LDKCVec_BlindedPathZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t n = 0; n < o_constr.datalen; n++) {
+               int64_t o_conv_13 = o_vals[n];
+               LDKBlindedPath o_conv_13_conv;
+               o_conv_13_conv.inner = untag_ptr(o_conv_13);
+               o_conv_13_conv.is_owned = ptr_is_owned(o_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv_13_conv);
+               o_conv_13_conv = BlindedPath_clone(&o_conv_13_conv);
+               o_constr.data[n] = o_conv_13_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_err() {
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_BlindedPathZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_BlindedPathZNoneZ* o_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_BlindedPathZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_BlindedPathZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_BlindedPathZNoneZ _res_conv = *(LDKCResult_CVec_BlindedPathZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_BlindedPathZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_BlindedPathZNoneZ_clone_ptr(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_BlindedPathZNoneZ* arg_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_BlindedPathZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_BlindedPathZNoneZ* orig_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_ok(int64_t o) {
        LDKInFlightHtlcs o_conv;
        o_conv.inner = untag_ptr(o);
@@ -18159,69 +19581,6 @@ int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-static inline uint64_t C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR arg) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
-       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* arg_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone(int64_t orig) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* orig_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(orig);
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
-       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_new(int64_t a, int64_t b) {
-       LDKBlindedPayInfo a_conv;
-       a_conv.inner = untag_ptr(a);
-       a_conv.is_owned = ptr_is_owned(a);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
-       a_conv = BlindedPayInfo_clone(&a_conv);
-       LDKBlindedPath b_conv;
-       b_conv.inner = untag_ptr(b);
-       b_conv.is_owned = ptr_is_owned(b);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
-       b_conv = BlindedPath_clone(&b_conv);
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
-       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_new(a_conv, b_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-void  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       C2Tuple_BlindedPayInfoBlindedPathZ_free(_res_conv);
-}
-
-void  CS_LDK_CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(int64_tArray _res) {
-       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ _res_constr;
-       _res_constr.datalen = _res->arr_len;
-       if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
-       else
-               _res_constr.data = NULL;
-       int64_t* _res_vals = _res->elems;
-       for (size_t l = 0; l < _res_constr.datalen; l++) {
-               int64_t _res_conv_37 = _res_vals[l];
-               void* _res_conv_37_ptr = untag_ptr(_res_conv_37);
-               CHECK_ACCESS(_res_conv_37_ptr);
-               LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_conv_37_ptr);
-               FREE(untag_ptr(_res_conv_37));
-               _res_constr.data[l] = _res_conv_37_conv;
-       }
-       FREE(_res);
-       CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(_res_constr);
-}
-
 void  CS_LDK_CVec_RouteHintZ_free(int64_tArray _res) {
        LDKCVec_RouteHintZ _res_constr;
        _res_constr.datalen = _res->arr_len;
@@ -18370,25 +19729,6 @@ int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_CVec_PublicKeyZ_free(ptrArray _res) {
-       LDKCVec_PublicKeyZ _res_constr;
-       _res_constr.datalen = _res->arr_len;
-       if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
-       else
-               _res_constr.data = NULL;
-       int8_tArray* _res_vals = (void*) _res->elems;
-       for (size_t i = 0; i < _res_constr.datalen; i++) {
-               int8_tArray _res_conv_8 = _res_vals[i];
-               LDKPublicKey _res_conv_8_ref;
-               CHECK(_res_conv_8->arr_len == 33);
-               memcpy(_res_conv_8_ref.compressed_form, _res_conv_8->elems, 33); FREE(_res_conv_8);
-               _res_constr.data[i] = _res_conv_8_ref;
-       }
-       FREE(_res);
-       CVec_PublicKeyZ_free(_res_constr);
-}
-
 int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_ok(int64_t o) {
        LDKFixedPenaltyScorer o_conv;
        o_conv.inner = untag_ptr(o);
@@ -18750,64 +20090,64 @@ void  CS_LDK_CVec_C2Tuple_usizeTransactionZZ_free(int64_tArray _res) {
        CVec_C2Tuple_usizeTransactionZZ_free(_res_constr);
 }
 
-static inline uint64_t C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR arg) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-       *ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(arg);
+static inline uint64_t C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR arg) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* arg_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(int64_t orig) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(orig);
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-       *ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(orig_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(int64_t orig) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* orig_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(orig);
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(int8_tArray a, int64_t b) {
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new(int8_tArray a, int32_t b, int64_t c) {
        LDKThirtyTwoBytes a_ref;
        CHECK(a->arr_len == 32);
        memcpy(a_ref.data, a->elems, 32); FREE(a);
-       void* b_ptr = untag_ptr(b);
-       CHECK_ACCESS(b_ptr);
-       LDKCOption_ThirtyTwoBytesZ b_conv = *(LDKCOption_ThirtyTwoBytesZ*)(b_ptr);
-       b_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(b));
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-       *ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(a_ref, b_conv);
+       void* c_ptr = untag_ptr(c);
+       CHECK_ACCESS(c_ptr);
+       LDKCOption_ThirtyTwoBytesZ c_conv = *(LDKCOption_ThirtyTwoBytesZ*)(c_ptr);
+       c_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(c));
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new(a_ref, b, c_conv);
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(int64_t _res) {
+void  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)(_res_ptr);
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ _res_conv = *(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(_res_conv);
+       C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free(_res_conv);
 }
 
-void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(int64_tArray _res) {
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ _res_constr;
+void  CS_LDK_CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ _res_constr;
        _res_constr.datalen = _res->arr_len;
        if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ Elements");
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ Elements");
        else
                _res_constr.data = NULL;
        int64_t* _res_vals = _res->elems;
-       for (size_t x = 0; x < _res_constr.datalen; x++) {
-               int64_t _res_conv_49 = _res_vals[x];
-               void* _res_conv_49_ptr = untag_ptr(_res_conv_49);
-               CHECK_ACCESS(_res_conv_49_ptr);
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ _res_conv_49_conv = *(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)(_res_conv_49_ptr);
-               FREE(untag_ptr(_res_conv_49));
-               _res_constr.data[x] = _res_conv_49_conv;
+       for (size_t c = 0; c < _res_constr.datalen; c++) {
+               int64_t _res_conv_54 = _res_vals[c];
+               void* _res_conv_54_ptr = untag_ptr(_res_conv_54);
+               CHECK_ACCESS(_res_conv_54_ptr);
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ _res_conv_54_conv = *(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)(_res_conv_54_ptr);
+               FREE(untag_ptr(_res_conv_54));
+               _res_constr.data[c] = _res_conv_54_conv;
        }
        FREE(_res);
-       CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(_res_constr);
+       CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_free(_res_constr);
 }
 
 int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_ok(int32_t o) {
@@ -20274,6 +21614,44 @@ int64_t  CS_LDK_COption_CVec_SocketAddressZZ_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_ok(int64_t o) {
+       LDKPendingHTLCInfo o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = PendingHTLCInfo_clone(&o_conv);
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoInboundHTLCErrZ), "LDKCResult_PendingHTLCInfoInboundHTLCErrZ");
+       *ret_conv = CResult_PendingHTLCInfoInboundHTLCErrZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_err(int64_t e) {
+       LDKInboundHTLCErr e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       // WARNING: we need a move here but no clone is available for LDKInboundHTLCErr
+       
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoInboundHTLCErrZ), "LDKCResult_PendingHTLCInfoInboundHTLCErrZ");
+       *ret_conv = CResult_PendingHTLCInfoInboundHTLCErrZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(int64_t o) {
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* o_conv = (LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ _res_conv = *(LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PendingHTLCInfoInboundHTLCErrZ_free(_res_conv);
+}
+
 void  CS_LDK_CVec_HTLCOutputInCommitmentZ_free(int64_tArray _res) {
        LDKCVec_HTLCOutputInCommitmentZ _res_constr;
        _res_constr.datalen = _res->arr_len;
@@ -21609,6 +22987,217 @@ int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedForward o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = BlindedForward_clone(&o_conv);
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedForwardDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedForwardDecodeErrorZ* o_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedForwardDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedForwardDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedForwardDecodeErrorZ _res_conv = *(LDKCResult_BlindedForwardDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedForwardDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedForwardDecodeErrorZ_clone_ptr(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedForwardDecodeErrorZ* arg_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedForwardDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedForwardDecodeErrorZ* orig_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPendingHTLCRouting o_conv = *(LDKPendingHTLCRouting*)(o_ptr);
+       o_conv = PendingHTLCRouting_clone((LDKPendingHTLCRouting*)untag_ptr(o));
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* o_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ _res_conv = *(LDKCResult_PendingHTLCRoutingDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PendingHTLCRoutingDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* arg_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* orig_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_ok(int64_t o) {
+       LDKPendingHTLCInfo o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = PendingHTLCInfo_clone(&o_conv);
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* o_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PendingHTLCInfoDecodeErrorZ _res_conv = *(LDKCResult_PendingHTLCInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PendingHTLCInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* arg_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* orig_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_ok(int32_t o) {
+       LDKBlindedFailure o_conv = LDKBlindedFailure_from_cs(o);
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedFailureDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedFailureDecodeErrorZ* o_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedFailureDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedFailureDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedFailureDecodeErrorZ _res_conv = *(LDKCResult_BlindedFailureDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedFailureDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedFailureDecodeErrorZ_clone_ptr(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedFailureDecodeErrorZ* arg_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedFailureDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedFailureDecodeErrorZ* orig_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_ok(int32_t o) {
        LDKChannelShutdownState o_conv = LDKChannelShutdownState_from_cs(o);
        LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
@@ -22718,6 +24307,78 @@ void  CS_LDK_CVec_C2Tuple_PublicKeyTypeZZ_free(int64_tArray _res) {
        CVec_C2Tuple_PublicKeyTypeZZ_free(_res_constr);
 }
 
+static inline uint64_t C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* arg_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(int64_t orig) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* orig_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(orig);
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_new(int8_tArray a, int64_tArray b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKCVec_SocketAddressZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t p = 0; p < b_constr.datalen; p++) {
+               int64_t b_conv_15 = b_vals[p];
+               void* b_conv_15_ptr = untag_ptr(b_conv_15);
+               CHECK_ACCESS(b_conv_15_ptr);
+               LDKSocketAddress b_conv_15_conv = *(LDKSocketAddress*)(b_conv_15_ptr);
+               b_conv_15_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(b_conv_15));
+               b_constr.data[p] = b_conv_15_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_new(a_ref, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ _res_conv = *(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyCVec_SocketAddressZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t o = 0; o < _res_constr.datalen; o++) {
+               int64_t _res_conv_40 = _res_vals[o];
+               void* _res_conv_40_ptr = untag_ptr(_res_conv_40);
+               CHECK_ACCESS(_res_conv_40_ptr);
+               LDKC2Tuple_PublicKeyCVec_SocketAddressZZ _res_conv_40_conv = *(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)(_res_conv_40_ptr);
+               FREE(untag_ptr(_res_conv_40));
+               _res_constr.data[o] = _res_conv_40_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_free(_res_constr);
+}
+
 int64_t  CS_LDK_COption_OnionMessageContentsZ_some(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
@@ -24009,6 +25670,222 @@ int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_ok(int64_t o) {
+       LDKStfu o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = Stfu_clone(&o_conv);
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_StfuDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_StfuDecodeErrorZ* o_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_StfuDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_StfuDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_StfuDecodeErrorZ _res_conv = *(LDKCResult_StfuDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_StfuDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_StfuDecodeErrorZ_clone_ptr(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_StfuDecodeErrorZ* arg_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_StfuDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_StfuDecodeErrorZ* orig_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_ok(int64_t o) {
+       LDKSplice o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = Splice_clone(&o_conv);
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpliceDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpliceDecodeErrorZ* o_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpliceDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpliceDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpliceDecodeErrorZ _res_conv = *(LDKCResult_SpliceDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpliceDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpliceDecodeErrorZ_clone_ptr(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpliceDecodeErrorZ* arg_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpliceDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpliceDecodeErrorZ* orig_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_ok(int64_t o) {
+       LDKSpliceAck o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = SpliceAck_clone(&o_conv);
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpliceAckDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpliceAckDecodeErrorZ* o_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpliceAckDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpliceAckDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpliceAckDecodeErrorZ _res_conv = *(LDKCResult_SpliceAckDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpliceAckDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpliceAckDecodeErrorZ_clone_ptr(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpliceAckDecodeErrorZ* arg_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpliceAckDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpliceAckDecodeErrorZ* orig_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_ok(int64_t o) {
+       LDKSpliceLocked o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = SpliceLocked_clone(&o_conv);
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpliceLockedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpliceLockedDecodeErrorZ* o_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpliceLockedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpliceLockedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpliceLockedDecodeErrorZ _res_conv = *(LDKCResult_SpliceLockedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpliceLockedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpliceLockedDecodeErrorZ_clone_ptr(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpliceLockedDecodeErrorZ* arg_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpliceLockedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpliceLockedDecodeErrorZ* orig_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_ok(int64_t o) {
        LDKTxAddInput o_conv;
        o_conv.inner = untag_ptr(o);
@@ -25413,6 +27290,60 @@ int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_ok(int64_t o) {
+       LDKOnionPacket o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = OnionPacket_clone(&o_conv);
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OnionPacketDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OnionPacketDecodeErrorZ* o_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OnionPacketDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OnionPacketDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OnionPacketDecodeErrorZ _res_conv = *(LDKCResult_OnionPacketDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OnionPacketDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OnionPacketDecodeErrorZ_clone_ptr(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OnionPacketDecodeErrorZ* arg_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OnionPacketDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OnionPacketDecodeErrorZ* orig_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_ok(int64_t o) {
        LDKUpdateAddHTLC o_conv;
        o_conv.inner = untag_ptr(o);
@@ -25521,6 +27452,60 @@ int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_ok(int64_t o) {
+       LDKFinalOnionHopData o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = FinalOnionHopData_clone(&o_conv);
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* o_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FinalOnionHopDataDecodeErrorZ _res_conv = *(LDKCResult_FinalOnionHopDataDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FinalOnionHopDataDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* arg_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* orig_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_PingDecodeErrorZ_ok(int64_t o) {
        LDKPing o_conv;
        o_conv.inner = untag_ptr(o);
@@ -28778,58 +30763,40 @@ int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_ok(int64_t o) {
-       LDKReceiveTlvs o_conv;
-       o_conv.inner = untag_ptr(o);
-       o_conv.is_owned = ptr_is_owned(o);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
-       o_conv = ReceiveTlvs_clone(&o_conv);
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_ok(o_conv);
+static inline uint64_t C2Tuple__u832u16Z_clone_ptr(LDKC2Tuple__u832u16Z *NONNULL_PTR arg) {
+       LDKC2Tuple__u832u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u832u16Z), "LDKC2Tuple__u832u16Z");
+       *ret_conv = C2Tuple__u832u16Z_clone(arg);
        return tag_ptr(ret_conv, true);
 }
+int64_t  CS_LDK_C2Tuple__u832u16Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple__u832u16Z* arg_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple__u832u16Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
 
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
-       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_err(e_conv);
+int64_t  CS_LDK_C2Tuple__u832u16Z_clone(int64_t orig) {
+       LDKC2Tuple__u832u16Z* orig_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(orig);
+       LDKC2Tuple__u832u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u832u16Z), "LDKC2Tuple__u832u16Z");
+       *ret_conv = C2Tuple__u832u16Z_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_is_ok(int64_t o) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* o_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_ReceiveTlvsDecodeErrorZ_is_ok(o_conv);
-       return ret_conv;
+int64_t  CS_LDK_C2Tuple__u832u16Z_new(int8_tArray a, int16_t b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKC2Tuple__u832u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u832u16Z), "LDKC2Tuple__u832u16Z");
+       *ret_conv = C2Tuple__u832u16Z_new(a_ref, b);
+       return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_free(int64_t _res) {
+void  CS_LDK_C2Tuple__u832u16Z_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_ReceiveTlvsDecodeErrorZ _res_conv = *(LDKCResult_ReceiveTlvsDecodeErrorZ*)(_res_ptr);
+       LDKC2Tuple__u832u16Z _res_conv = *(LDKC2Tuple__u832u16Z*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_ReceiveTlvsDecodeErrorZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR arg) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* arg_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_clone(int64_t orig) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* orig_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(orig);
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
+       C2Tuple__u832u16Z_free(_res_conv);
 }
 
 int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_ok(int64_t o) {
@@ -28940,169 +30907,98 @@ int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_ok(int8_tArray o) {
-       LDKThirtyTwoBytes o_ref;
-       CHECK(o->arr_len == 32);
-       memcpy(o_ref.data, o->elems, 32); FREE(o);
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_ok(o_ref);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKPaymentError e_conv = *(LDKPaymentError*)(e_ptr);
-       e_conv = PaymentError_clone((LDKPaymentError*)untag_ptr(e));
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_err(e_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(int64_t o) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* o_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ _res_conv = *(LDKCResult_ThirtyTwoBytesPaymentErrorZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_ThirtyTwoBytesPaymentErrorZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR arg) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_clone(arg);
+static inline uint64_t C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR arg) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* arg_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* arg_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_clone(int64_t orig) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* orig_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(orig);
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_clone(orig_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(int64_t orig) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* orig_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(orig);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_ok() {
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_ok();
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKPaymentError e_conv = *(LDKPaymentError*)(e_ptr);
-       e_conv = PaymentError_clone((LDKPaymentError*)untag_ptr(e));
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_err(e_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new(int8_tArray a, int64_t b, int64_t c) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKRecipientOnionFields b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv = RecipientOnionFields_clone(&b_conv);
+       LDKRouteParameters c_conv;
+       c_conv.inner = untag_ptr(c);
+       c_conv.is_owned = ptr_is_owned(c);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(c_conv);
+       c_conv = RouteParameters_clone(&c_conv);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new(a_ref, b_conv, c_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_NonePaymentErrorZ_is_ok(int64_t o) {
-       LDKCResult_NonePaymentErrorZ* o_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_NonePaymentErrorZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_NonePaymentErrorZ_free(int64_t _res) {
+void  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_NonePaymentErrorZ _res_conv = *(LDKCResult_NonePaymentErrorZ*)(_res_ptr);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ _res_conv = *(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_NonePaymentErrorZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_NonePaymentErrorZ_clone_ptr(LDKCResult_NonePaymentErrorZ *NONNULL_PTR arg) {
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_NonePaymentErrorZ* arg_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_NonePaymentErrorZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_clone(int64_t orig) {
-       LDKCResult_NonePaymentErrorZ* orig_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(orig);
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
+       C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok(int64_tArray o) {
-       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ o_constr;
-       o_constr.datalen = o->arr_len;
-       if (o_constr.datalen > 0)
-               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ Elements");
-       else
-               o_constr.data = NULL;
-       int64_t* o_vals = o->elems;
-       for (size_t o = 0; o < o_constr.datalen; o++) {
-               int64_t o_conv_40 = o_vals[o];
-               void* o_conv_40_ptr = untag_ptr(o_conv_40);
-               CHECK_ACCESS(o_conv_40_ptr);
-               LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(o_conv_40_ptr);
-               o_conv_40_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone((LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(o_conv_40));
-               o_constr.data[o] = o_conv_40_conv;
-       }
-       FREE(o);
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok(o_constr);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ o_conv = *(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)(o_ptr);
+       o_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone((LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(o));
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKProbingError e_conv = *(LDKProbingError*)(e_ptr);
-       e_conv = ProbingError_clone((LDKProbingError*)untag_ptr(e));
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err(e_conv);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err() {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err();
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(int64_t o) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* o_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* o_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free(int64_t _res) {
+void  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ _res_conv = *(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)(_res_ptr);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ _res_conv = *(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free(_res_conv);
+       CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free(_res_conv);
 }
 
-static inline uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR arg) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(arg);
+static inline uint64_t CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* arg_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* arg_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(int64_t orig) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* orig_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(orig);
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(orig_conv);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(int64_t orig) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* orig_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(orig);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -29203,75 +31099,25 @@ int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_ok(int64_t o) {
-       LDKOnionMessagePath o_conv;
-       o_conv.inner = untag_ptr(o);
-       o_conv.is_owned = ptr_is_owned(o);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
-       o_conv = OnionMessagePath_clone(&o_conv);
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_ok(o_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_err() {
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_err();
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_OnionMessagePathNoneZ_is_ok(int64_t o) {
-       LDKCResult_OnionMessagePathNoneZ* o_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_OnionMessagePathNoneZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_OnionMessagePathNoneZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_OnionMessagePathNoneZ _res_conv = *(LDKCResult_OnionMessagePathNoneZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_OnionMessagePathNoneZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_OnionMessagePathNoneZ_clone_ptr(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR arg) {
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_OnionMessagePathNoneZ* arg_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_OnionMessagePathNoneZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone(int64_t orig) {
-       LDKCResult_OnionMessagePathNoneZ* orig_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(orig);
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-static inline uint64_t C2Tuple_PublicKeyOnionMessageZ_clone_ptr(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR arg) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_clone(arg);
+static inline uint64_t C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR arg) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* arg_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_PublicKeyOnionMessageZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* arg_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_clone(int64_t orig) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* orig_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(orig);
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_clone(orig_conv);
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(int64_t orig) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* orig_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(orig);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_new(int8_tArray a, int64_t b) {
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new(int8_tArray a, int64_t b, int64_t c) {
        LDKPublicKey a_ref;
        CHECK(a->arr_len == 33);
        memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
@@ -29280,53 +31126,57 @@ int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_new(int8_tArray a, int64_t b) {
        b_conv.is_owned = ptr_is_owned(b);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
        b_conv = OnionMessage_clone(&b_conv);
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_new(a_ref, b_conv);
+       void* c_ptr = untag_ptr(c);
+       CHECK_ACCESS(c_ptr);
+       LDKCOption_CVec_SocketAddressZZ c_conv = *(LDKCOption_CVec_SocketAddressZZ*)(c_ptr);
+       c_conv = COption_CVec_SocketAddressZZ_clone((LDKCOption_CVec_SocketAddressZZ*)untag_ptr(c));
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new(a_ref, b_conv, c_conv);
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_free(int64_t _res) {
+void  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_PublicKeyOnionMessageZ _res_conv = *(LDKC2Tuple_PublicKeyOnionMessageZ*)(_res_ptr);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ _res_conv = *(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       C2Tuple_PublicKeyOnionMessageZ_free(_res_conv);
+       C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok(int64_t o) {
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
-       LDKC2Tuple_PublicKeyOnionMessageZ o_conv = *(LDKC2Tuple_PublicKeyOnionMessageZ*)(o_ptr);
-       o_conv = C2Tuple_PublicKeyOnionMessageZ_clone((LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(o));
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
-       *ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok(o_conv);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ o_conv = *(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)(o_ptr);
+       o_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone((LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(o));
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ), "LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ");
+       *ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err(int64_t e) {
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err(int64_t e) {
        void* e_ptr = untag_ptr(e);
        CHECK_ACCESS(e_ptr);
        LDKSendError e_conv = *(LDKSendError*)(e_ptr);
        e_conv = SendError_clone((LDKSendError*)untag_ptr(e));
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
-       *ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err(e_conv);
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ), "LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ");
+       *ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err(e_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(int64_t o) {
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* o_conv = (LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(int64_t o) {
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* o_conv = (LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(int64_t _res) {
+void  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ _res_conv = *(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)(_res_ptr);
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ _res_conv = *(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(_res_conv);
+       CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free(_res_conv);
 }
 
 int64_t  CS_LDK_CResult_PeeledOnionNoneZ_ok(int64_t o) {
@@ -29360,35 +31210,39 @@ void  CS_LDK_CResult_PeeledOnionNoneZ_free(int64_t _res) {
        CResult_PeeledOnionNoneZ_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_NoneSendErrorZ_ok() {
-       LDKCResult_NoneSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneSendErrorZ), "LDKCResult_NoneSendErrorZ");
-       *ret_conv = CResult_NoneSendErrorZ_ok();
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSendSuccess o_conv = *(LDKSendSuccess*)(o_ptr);
+       o_conv = SendSuccess_clone((LDKSendSuccess*)untag_ptr(o));
+       LDKCResult_SendSuccessSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SendSuccessSendErrorZ), "LDKCResult_SendSuccessSendErrorZ");
+       *ret_conv = CResult_SendSuccessSendErrorZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_NoneSendErrorZ_err(int64_t e) {
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_err(int64_t e) {
        void* e_ptr = untag_ptr(e);
        CHECK_ACCESS(e_ptr);
        LDKSendError e_conv = *(LDKSendError*)(e_ptr);
        e_conv = SendError_clone((LDKSendError*)untag_ptr(e));
-       LDKCResult_NoneSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneSendErrorZ), "LDKCResult_NoneSendErrorZ");
-       *ret_conv = CResult_NoneSendErrorZ_err(e_conv);
+       LDKCResult_SendSuccessSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SendSuccessSendErrorZ), "LDKCResult_SendSuccessSendErrorZ");
+       *ret_conv = CResult_SendSuccessSendErrorZ_err(e_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_NoneSendErrorZ_is_ok(int64_t o) {
-       LDKCResult_NoneSendErrorZ* o_conv = (LDKCResult_NoneSendErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_NoneSendErrorZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_SendSuccessSendErrorZ_is_ok(int64_t o) {
+       LDKCResult_SendSuccessSendErrorZ* o_conv = (LDKCResult_SendSuccessSendErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SendSuccessSendErrorZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_NoneSendErrorZ_free(int64_t _res) {
+void  CS_LDK_CResult_SendSuccessSendErrorZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_NoneSendErrorZ _res_conv = *(LDKCResult_NoneSendErrorZ*)(_res_ptr);
+       LDKCResult_SendSuccessSendErrorZ _res_conv = *(LDKCResult_SendSuccessSendErrorZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_NoneSendErrorZ_free(_res_conv);
+       CResult_SendSuccessSendErrorZ_free(_res_conv);
 }
 
 int64_t  CS_LDK_CResult_BlindedPathNoneZ_ok(int64_t o) {
@@ -29490,6 +31344,26 @@ int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(int64_t or
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_CVec_ForwardNodeZ_free(int64_tArray _res) {
+       LDKCVec_ForwardNodeZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKForwardNode), "LDKCVec_ForwardNodeZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t n = 0; n < _res_constr.datalen; n++) {
+               int64_t _res_conv_13 = _res_vals[n];
+               LDKForwardNode _res_conv_13_conv;
+               _res_conv_13_conv.inner = untag_ptr(_res_conv_13);
+               _res_conv_13_conv.is_owned = ptr_is_owned(_res_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_13_conv);
+               _res_constr.data[n] = _res_conv_13_conv;
+       }
+       FREE(_res);
+       CVec_ForwardNodeZ_free(_res_constr);
+}
+
 int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_ok(int64_t o) {
        LDKBlindedPath o_conv;
        o_conv.inner = untag_ptr(o);
@@ -29652,6 +31526,330 @@ int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_ok(int64_t o) {
+       LDKDelayedPaymentBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = DelayedPaymentBasepoint_clone(&o_conv);
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* o_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ _res_conv = *(LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DelayedPaymentBasepointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* arg_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* orig_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_ok(int64_t o) {
+       LDKDelayedPaymentKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = DelayedPaymentKey_clone(&o_conv);
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* o_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ _res_conv = *(LDKCResult_DelayedPaymentKeyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DelayedPaymentKeyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* arg_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* orig_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_ok(int64_t o) {
+       LDKHtlcBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = HtlcBasepoint_clone(&o_conv);
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* o_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HtlcBasepointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HtlcBasepointDecodeErrorZ _res_conv = *(LDKCResult_HtlcBasepointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HtlcBasepointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HtlcBasepointDecodeErrorZ_clone_ptr(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* arg_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HtlcBasepointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* orig_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_ok(int64_t o) {
+       LDKHtlcKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = HtlcKey_clone(&o_conv);
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HtlcKeyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HtlcKeyDecodeErrorZ* o_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HtlcKeyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HtlcKeyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HtlcKeyDecodeErrorZ _res_conv = *(LDKCResult_HtlcKeyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HtlcKeyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HtlcKeyDecodeErrorZ_clone_ptr(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HtlcKeyDecodeErrorZ* arg_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HtlcKeyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HtlcKeyDecodeErrorZ* orig_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_ok(int64_t o) {
+       LDKRevocationBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = RevocationBasepoint_clone(&o_conv);
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* o_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RevocationBasepointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RevocationBasepointDecodeErrorZ _res_conv = *(LDKCResult_RevocationBasepointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RevocationBasepointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RevocationBasepointDecodeErrorZ_clone_ptr(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* arg_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RevocationBasepointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* orig_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_ok(int64_t o) {
+       LDKRevocationKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = RevocationKey_clone(&o_conv);
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RevocationKeyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RevocationKeyDecodeErrorZ* o_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RevocationKeyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RevocationKeyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RevocationKeyDecodeErrorZ _res_conv = *(LDKCResult_RevocationKeyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RevocationKeyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RevocationKeyDecodeErrorZ_clone_ptr(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RevocationKeyDecodeErrorZ* arg_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RevocationKeyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RevocationKeyDecodeErrorZ* orig_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_COption_FilterZ_some(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
@@ -30087,6 +32285,16 @@ int64_t  CS_LDK_Hostname_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Hostname_hash(int64_t o) {
+       LDKHostname o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Hostname_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Hostname_eq(int64_t a, int64_t b) {
        LDKHostname a_conv;
        a_conv.inner = untag_ptr(a);
@@ -30173,6 +32381,16 @@ int64_t  CS_LDK_TransactionU16LenLimited_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TransactionU16LenLimited_hash(int64_t o) {
+       LDKTransactionU16LenLimited o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TransactionU16LenLimited_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TransactionU16LenLimited_eq(int64_t a, int64_t b) {
        LDKTransactionU16LenLimited a_conv;
        a_conv.inner = untag_ptr(a);
@@ -30528,6 +32746,16 @@ jboolean  CS_LDK_UntrustedString_eq(int64_t a, int64_t b) {
        return ret_conv;
 }
 
+int64_t  CS_LDK_UntrustedString_hash(int64_t o) {
+       LDKUntrustedString o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UntrustedString_hash(&o_conv);
+       return ret_conv;
+}
+
 int8_tArray  CS_LDK_UntrustedString_write(int64_t obj) {
        LDKUntrustedString obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -30837,6 +33065,54 @@ void  CS_LDK_Record_set_level(int64_t this_ptr, int32_t val) {
        Record_set_level(&this_ptr_conv, val_conv);
 }
 
+int8_tArray  CS_LDK_Record_get_peer_id(int64_t this_ptr) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Record_get_peer_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_Record_set_peer_id(int64_t this_ptr, int8_tArray val) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       Record_set_peer_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Record_get_channel_id(int64_t this_ptr) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = Record_get_channel_id(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Record_set_channel_id(int64_t this_ptr, int64_t val) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_ThirtyTwoBytesZ val_conv = *(LDKCOption_ThirtyTwoBytesZ*)(val_ptr);
+       val_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(val));
+       Record_set_channel_id(&this_ptr_conv, val_conv);
+}
+
 jstring  CS_LDK_Record_get_args(int64_t this_ptr) {
        LDKRecord this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
@@ -30922,6 +33198,25 @@ void  CS_LDK_Record_set_line(int64_t this_ptr, int32_t val) {
        Record_set_line(&this_ptr_conv, val);
 }
 
+int64_t  CS_LDK_Record_new(int32_t level_arg, int8_tArray peer_id_arg, int64_t channel_id_arg, jstring args_arg, jstring module_path_arg, jstring file_arg, int32_t line_arg) {
+       LDKLevel level_arg_conv = LDKLevel_from_cs(level_arg);
+       LDKPublicKey peer_id_arg_ref;
+       CHECK(peer_id_arg->arr_len == 33);
+       memcpy(peer_id_arg_ref.compressed_form, peer_id_arg->elems, 33); FREE(peer_id_arg);
+       void* channel_id_arg_ptr = untag_ptr(channel_id_arg);
+       CHECK_ACCESS(channel_id_arg_ptr);
+       LDKCOption_ThirtyTwoBytesZ channel_id_arg_conv = *(LDKCOption_ThirtyTwoBytesZ*)(channel_id_arg_ptr);
+       channel_id_arg_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(channel_id_arg));
+       LDKStr args_arg_conv = str_ref_to_owned_c(args_arg);
+       LDKStr module_path_arg_conv = str_ref_to_owned_c(module_path_arg);
+       LDKStr file_arg_conv = str_ref_to_owned_c(file_arg);
+       LDKRecord ret_var = Record_new(level_arg_conv, peer_id_arg_ref, channel_id_arg_conv, args_arg_conv, module_path_arg_conv, file_arg_conv, line_arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 static inline uint64_t Record_clone_ptr(LDKRecord *NONNULL_PTR arg) {
        LDKRecord ret_var = Record_clone(arg);
        int64_t ret_ref = 0;
@@ -32386,9 +34681,10 @@ int8_tArray  CS_LDK_WatchedOutput_get_script_pubkey(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = WatchedOutput_get_script_pubkey(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = WatchedOutput_get_script_pubkey(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -32501,11 +34797,6 @@ int32_t  CS_LDK_ConfirmationTarget_on_chain_sweep() {
        return ret_conv;
 }
 
-int32_t  CS_LDK_ConfirmationTarget_max_allowed_non_anchor_channel_remote_fee() {
-       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_max_allowed_non_anchor_channel_remote_fee());
-       return ret_conv;
-}
-
 int32_t  CS_LDK_ConfirmationTarget_min_allowed_anchor_channel_remote_fee() {
        int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_min_allowed_anchor_channel_remote_fee());
        return ret_conv;
@@ -33346,7 +35637,7 @@ int64_tArray  CS_LDK_ChannelMonitor_get_outputs_to_watch(int64_t this_arg) {
        return ret_arr;
 }
 
-void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filter) {
+void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filter, int64_t logger) {
        LDKChannelMonitor this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
@@ -33355,7 +35646,10 @@ void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filt
        void* filter_ptr = untag_ptr(filter);
        if (ptr_is_owned(filter)) { CHECK_ACCESS(filter_ptr); }
        LDKFilter* filter_conv = (LDKFilter*)filter_ptr;
-       ChannelMonitor_load_outputs_to_watch(&this_arg_conv, filter_conv);
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       ChannelMonitor_load_outputs_to_watch(&this_arg_conv, filter_conv, logger_conv);
 }
 
 int64_tArray  CS_LDK_ChannelMonitor_get_and_clear_pending_monitor_events(int64_t this_arg) {
@@ -33524,12 +35818,8 @@ int64_tArray  CS_LDK_ChannelMonitor_block_connected(int64_t this_arg, int8_tArra
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret_var = ChannelMonitor_block_connected(&this_arg_conv, header_ref, txdata_constr, height, broadcaster_conv, fee_estimator_conv, logger_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
@@ -33569,12 +35859,8 @@ void  CS_LDK_ChannelMonitor_block_disconnected(int64_t this_arg, int8_tArray hea
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        ChannelMonitor_block_disconnected(&this_arg_conv, header_ref, height, broadcaster_conv, fee_estimator_conv, logger_conv);
 }
 
@@ -33619,12 +35905,8 @@ int64_tArray  CS_LDK_ChannelMonitor_transactions_confirmed(int64_t this_arg, int
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret_var = ChannelMonitor_transactions_confirmed(&this_arg_conv, header_ref, txdata_constr, height, broadcaster_conv, fee_estimator_conv, logger_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
@@ -33664,12 +35946,8 @@ void  CS_LDK_ChannelMonitor_transaction_unconfirmed(int64_t this_arg, int8_tArra
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        ChannelMonitor_transaction_unconfirmed(&this_arg_conv, txid_ref, broadcaster_conv, fee_estimator_conv, logger_conv);
 }
 
@@ -33698,12 +35976,8 @@ int64_tArray  CS_LDK_ChannelMonitor_best_block_updated(int64_t this_arg, int8_tA
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret_var = ChannelMonitor_best_block_updated(&this_arg_conv, header_ref, height, broadcaster_conv, fee_estimator_conv, logger_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
@@ -33724,14 +35998,14 @@ int64_tArray  CS_LDK_ChannelMonitor_get_relevant_txids(int64_t this_arg) {
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
        this_arg_conv.is_owned = false;
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret_var = ChannelMonitor_get_relevant_txids(&this_arg_conv);
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret_var = ChannelMonitor_get_relevant_txids(&this_arg_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
        int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
-       for (size_t x = 0; x < ret_var.datalen; x++) {
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-               *ret_conv_49_conv = ret_var.data[x];
-               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       for (size_t c = 0; c < ret_var.datalen; c++) {
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv_54_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+               *ret_conv_54_conv = ret_var.data[c];
+               ret_arr_ptr[c] = tag_ptr(ret_conv_54_conv, true);
        }
        
        FREE(ret_var.data);
@@ -33772,12 +36046,8 @@ void  CS_LDK_ChannelMonitor_rebroadcast_pending_claims(int64_t this_arg, int64_t
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        ChannelMonitor_rebroadcast_pending_claims(&this_arg_conv, broadcaster_conv, fee_estimator_conv, logger_conv);
 }
 
@@ -33994,6 +36264,597 @@ int64_t  CS_LDK_OutPoint_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_InboundHTLCErr_free(int64_t this_obj) {
+       LDKInboundHTLCErr this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       InboundHTLCErr_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_InboundHTLCErr_get_err_code(int64_t this_ptr) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int16_t ret_conv = InboundHTLCErr_get_err_code(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InboundHTLCErr_set_err_code(int64_t this_ptr, int16_t val) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       InboundHTLCErr_set_err_code(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_InboundHTLCErr_get_err_data(int64_t this_ptr) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = InboundHTLCErr_get_err_data(&this_ptr_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+void  CS_LDK_InboundHTLCErr_set_err_data(int64_t this_ptr, int8_tArray val) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u8Z val_ref;
+       val_ref.datalen = val->arr_len;
+       val_ref.data = MALLOC(val_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(val_ref.data, val->elems, val_ref.datalen); FREE(val);
+       InboundHTLCErr_set_err_data(&this_ptr_conv, val_ref);
+}
+
+jstring  CS_LDK_InboundHTLCErr_get_msg(int64_t this_ptr) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKStr ret_str = InboundHTLCErr_get_msg(&this_ptr_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+void  CS_LDK_InboundHTLCErr_set_msg(int64_t this_ptr, jstring val) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       InboundHTLCErr_set_msg(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_InboundHTLCErr_new(int16_t err_code_arg, int8_tArray err_data_arg, jstring msg_arg) {
+       LDKCVec_u8Z err_data_arg_ref;
+       err_data_arg_ref.datalen = err_data_arg->arr_len;
+       err_data_arg_ref.data = MALLOC(err_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(err_data_arg_ref.data, err_data_arg->elems, err_data_arg_ref.datalen); FREE(err_data_arg);
+       LDKStr msg_arg_conv = str_ref_to_owned_c(msg_arg);
+       LDKInboundHTLCErr ret_var = InboundHTLCErr_new(err_code_arg, err_data_arg_ref, msg_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_peel_payment_onion(int64_t msg, int64_t node_signer, int64_t logger, int32_t cur_height, jboolean accept_mpp_keysend, jboolean allow_skimmed_fees) {
+       LDKUpdateAddHTLC msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       void* node_signer_ptr = untag_ptr(node_signer);
+       if (ptr_is_owned(node_signer)) { CHECK_ACCESS(node_signer_ptr); }
+       LDKNodeSigner* node_signer_conv = (LDKNodeSigner*)node_signer_ptr;
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoInboundHTLCErrZ), "LDKCResult_PendingHTLCInfoInboundHTLCErrZ");
+       *ret_conv = peel_payment_onion(&msg_conv, node_signer_conv, logger_conv, cur_height, accept_mpp_keysend, allow_skimmed_fees);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PendingHTLCRouting_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKPendingHTLCRouting this_ptr_conv = *(LDKPendingHTLCRouting*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PendingHTLCRouting_free(this_ptr_conv);
+}
+
+static inline uint64_t PendingHTLCRouting_clone_ptr(LDKPendingHTLCRouting *NONNULL_PTR arg) {
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PendingHTLCRouting_clone_ptr(int64_t arg) {
+       LDKPendingHTLCRouting* arg_conv = (LDKPendingHTLCRouting*)untag_ptr(arg);
+       int64_t ret_conv = PendingHTLCRouting_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_clone(int64_t orig) {
+       LDKPendingHTLCRouting* orig_conv = (LDKPendingHTLCRouting*)untag_ptr(orig);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_forward(int64_t onion_packet, int64_t short_channel_id, int64_t blinded) {
+       LDKOnionPacket onion_packet_conv;
+       onion_packet_conv.inner = untag_ptr(onion_packet);
+       onion_packet_conv.is_owned = ptr_is_owned(onion_packet);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_packet_conv);
+       onion_packet_conv = OnionPacket_clone(&onion_packet_conv);
+       LDKBlindedForward blinded_conv;
+       blinded_conv.inner = untag_ptr(blinded);
+       blinded_conv.is_owned = ptr_is_owned(blinded);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_conv);
+       blinded_conv = BlindedForward_clone(&blinded_conv);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_forward(onion_packet_conv, short_channel_id, blinded_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_receive(int64_t payment_data, int64_t payment_metadata, int32_t incoming_cltv_expiry, int8_tArray phantom_shared_secret, int64_tArray custom_tlvs, jboolean requires_blinded_error) {
+       LDKFinalOnionHopData payment_data_conv;
+       payment_data_conv.inner = untag_ptr(payment_data);
+       payment_data_conv.is_owned = ptr_is_owned(payment_data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_conv);
+       payment_data_conv = FinalOnionHopData_clone(&payment_data_conv);
+       void* payment_metadata_ptr = untag_ptr(payment_metadata);
+       CHECK_ACCESS(payment_metadata_ptr);
+       LDKCOption_CVec_u8ZZ payment_metadata_conv = *(LDKCOption_CVec_u8ZZ*)(payment_metadata_ptr);
+       payment_metadata_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(payment_metadata));
+       LDKThirtyTwoBytes phantom_shared_secret_ref;
+       CHECK(phantom_shared_secret->arr_len == 32);
+       memcpy(phantom_shared_secret_ref.data, phantom_shared_secret->elems, 32); FREE(phantom_shared_secret);
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_constr;
+       custom_tlvs_constr.datalen = custom_tlvs->arr_len;
+       if (custom_tlvs_constr.datalen > 0)
+               custom_tlvs_constr.data = MALLOC(custom_tlvs_constr.datalen * sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKCVec_C2Tuple_u64CVec_u8ZZZ Elements");
+       else
+               custom_tlvs_constr.data = NULL;
+       int64_t* custom_tlvs_vals = custom_tlvs->elems;
+       for (size_t x = 0; x < custom_tlvs_constr.datalen; x++) {
+               int64_t custom_tlvs_conv_23 = custom_tlvs_vals[x];
+               void* custom_tlvs_conv_23_ptr = untag_ptr(custom_tlvs_conv_23);
+               CHECK_ACCESS(custom_tlvs_conv_23_ptr);
+               LDKC2Tuple_u64CVec_u8ZZ custom_tlvs_conv_23_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(custom_tlvs_conv_23_ptr);
+               custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone((LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(custom_tlvs_conv_23));
+               custom_tlvs_constr.data[x] = custom_tlvs_conv_23_conv;
+       }
+       FREE(custom_tlvs);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_receive(payment_data_conv, payment_metadata_conv, incoming_cltv_expiry, phantom_shared_secret_ref, custom_tlvs_constr, requires_blinded_error);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_receive_keysend(int64_t payment_data, int8_tArray payment_preimage, int64_t payment_metadata, int32_t incoming_cltv_expiry, int64_tArray custom_tlvs) {
+       LDKFinalOnionHopData payment_data_conv;
+       payment_data_conv.inner = untag_ptr(payment_data);
+       payment_data_conv.is_owned = ptr_is_owned(payment_data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_conv);
+       payment_data_conv = FinalOnionHopData_clone(&payment_data_conv);
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       void* payment_metadata_ptr = untag_ptr(payment_metadata);
+       CHECK_ACCESS(payment_metadata_ptr);
+       LDKCOption_CVec_u8ZZ payment_metadata_conv = *(LDKCOption_CVec_u8ZZ*)(payment_metadata_ptr);
+       payment_metadata_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(payment_metadata));
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_constr;
+       custom_tlvs_constr.datalen = custom_tlvs->arr_len;
+       if (custom_tlvs_constr.datalen > 0)
+               custom_tlvs_constr.data = MALLOC(custom_tlvs_constr.datalen * sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKCVec_C2Tuple_u64CVec_u8ZZZ Elements");
+       else
+               custom_tlvs_constr.data = NULL;
+       int64_t* custom_tlvs_vals = custom_tlvs->elems;
+       for (size_t x = 0; x < custom_tlvs_constr.datalen; x++) {
+               int64_t custom_tlvs_conv_23 = custom_tlvs_vals[x];
+               void* custom_tlvs_conv_23_ptr = untag_ptr(custom_tlvs_conv_23);
+               CHECK_ACCESS(custom_tlvs_conv_23_ptr);
+               LDKC2Tuple_u64CVec_u8ZZ custom_tlvs_conv_23_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(custom_tlvs_conv_23_ptr);
+               custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone((LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(custom_tlvs_conv_23));
+               custom_tlvs_constr.data[x] = custom_tlvs_conv_23_conv;
+       }
+       FREE(custom_tlvs);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_receive_keysend(payment_data_conv, payment_preimage_ref, payment_metadata_conv, incoming_cltv_expiry, custom_tlvs_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_BlindedForward_free(int64_t this_obj) {
+       LDKBlindedForward this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       BlindedForward_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BlindedForward_get_inbound_blinding_point(int64_t this_ptr) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, BlindedForward_get_inbound_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedForward_set_inbound_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       BlindedForward_set_inbound_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_BlindedForward_get_failure(int64_t this_ptr) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedForward_get_failure(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedForward_set_failure(int64_t this_ptr, int32_t val) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKBlindedFailure val_conv = LDKBlindedFailure_from_cs(val);
+       BlindedForward_set_failure(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_BlindedForward_new(int8_tArray inbound_blinding_point_arg, int32_t failure_arg) {
+       LDKPublicKey inbound_blinding_point_arg_ref;
+       CHECK(inbound_blinding_point_arg->arr_len == 33);
+       memcpy(inbound_blinding_point_arg_ref.compressed_form, inbound_blinding_point_arg->elems, 33); FREE(inbound_blinding_point_arg);
+       LDKBlindedFailure failure_arg_conv = LDKBlindedFailure_from_cs(failure_arg);
+       LDKBlindedForward ret_var = BlindedForward_new(inbound_blinding_point_arg_ref, failure_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t BlindedForward_clone_ptr(LDKBlindedForward *NONNULL_PTR arg) {
+       LDKBlindedForward ret_var = BlindedForward_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_BlindedForward_clone_ptr(int64_t arg) {
+       LDKBlindedForward arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = BlindedForward_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedForward_clone(int64_t orig) {
+       LDKBlindedForward orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKBlindedForward ret_var = BlindedForward_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BlindedForward_hash(int64_t o) {
+       LDKBlindedForward o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = BlindedForward_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedForward_eq(int64_t a, int64_t b) {
+       LDKBlindedForward a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKBlindedForward b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = BlindedForward_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PendingHTLCInfo_free(int64_t this_obj) {
+       LDKPendingHTLCInfo this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       PendingHTLCInfo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_routing(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCInfo_get_routing(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_routing(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKPendingHTLCRouting val_conv = *(LDKPendingHTLCRouting*)(val_ptr);
+       val_conv = PendingHTLCRouting_clone((LDKPendingHTLCRouting*)untag_ptr(val));
+       PendingHTLCInfo_set_routing(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_PendingHTLCInfo_get_incoming_shared_secret(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *PendingHTLCInfo_get_incoming_shared_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_incoming_shared_secret(int64_t this_ptr, int8_tArray val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       PendingHTLCInfo_set_incoming_shared_secret(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_PendingHTLCInfo_get_payment_hash(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *PendingHTLCInfo_get_payment_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_payment_hash(int64_t this_ptr, int8_tArray val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       PendingHTLCInfo_set_payment_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_incoming_amt_msat(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = PendingHTLCInfo_get_incoming_amt_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_incoming_amt_msat(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_u64Z val_conv = *(LDKCOption_u64Z*)(val_ptr);
+       val_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(val));
+       PendingHTLCInfo_set_incoming_amt_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_outgoing_amt_msat(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = PendingHTLCInfo_get_outgoing_amt_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_outgoing_amt_msat(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       PendingHTLCInfo_set_outgoing_amt_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_PendingHTLCInfo_get_outgoing_cltv_value(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = PendingHTLCInfo_get_outgoing_cltv_value(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_outgoing_cltv_value(int64_t this_ptr, int32_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       PendingHTLCInfo_set_outgoing_cltv_value(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_skimmed_fee_msat(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = PendingHTLCInfo_get_skimmed_fee_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_skimmed_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_u64Z val_conv = *(LDKCOption_u64Z*)(val_ptr);
+       val_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(val));
+       PendingHTLCInfo_set_skimmed_fee_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_new(int64_t routing_arg, int8_tArray incoming_shared_secret_arg, int8_tArray payment_hash_arg, int64_t incoming_amt_msat_arg, int64_t outgoing_amt_msat_arg, int32_t outgoing_cltv_value_arg, int64_t skimmed_fee_msat_arg) {
+       void* routing_arg_ptr = untag_ptr(routing_arg);
+       CHECK_ACCESS(routing_arg_ptr);
+       LDKPendingHTLCRouting routing_arg_conv = *(LDKPendingHTLCRouting*)(routing_arg_ptr);
+       routing_arg_conv = PendingHTLCRouting_clone((LDKPendingHTLCRouting*)untag_ptr(routing_arg));
+       LDKThirtyTwoBytes incoming_shared_secret_arg_ref;
+       CHECK(incoming_shared_secret_arg->arr_len == 32);
+       memcpy(incoming_shared_secret_arg_ref.data, incoming_shared_secret_arg->elems, 32); FREE(incoming_shared_secret_arg);
+       LDKThirtyTwoBytes payment_hash_arg_ref;
+       CHECK(payment_hash_arg->arr_len == 32);
+       memcpy(payment_hash_arg_ref.data, payment_hash_arg->elems, 32); FREE(payment_hash_arg);
+       void* incoming_amt_msat_arg_ptr = untag_ptr(incoming_amt_msat_arg);
+       CHECK_ACCESS(incoming_amt_msat_arg_ptr);
+       LDKCOption_u64Z incoming_amt_msat_arg_conv = *(LDKCOption_u64Z*)(incoming_amt_msat_arg_ptr);
+       incoming_amt_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(incoming_amt_msat_arg));
+       void* skimmed_fee_msat_arg_ptr = untag_ptr(skimmed_fee_msat_arg);
+       CHECK_ACCESS(skimmed_fee_msat_arg_ptr);
+       LDKCOption_u64Z skimmed_fee_msat_arg_conv = *(LDKCOption_u64Z*)(skimmed_fee_msat_arg_ptr);
+       skimmed_fee_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(skimmed_fee_msat_arg));
+       LDKPendingHTLCInfo ret_var = PendingHTLCInfo_new(routing_arg_conv, incoming_shared_secret_arg_ref, payment_hash_arg_ref, incoming_amt_msat_arg_conv, outgoing_amt_msat_arg, outgoing_cltv_value_arg, skimmed_fee_msat_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t PendingHTLCInfo_clone_ptr(LDKPendingHTLCInfo *NONNULL_PTR arg) {
+       LDKPendingHTLCInfo ret_var = PendingHTLCInfo_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_PendingHTLCInfo_clone_ptr(int64_t arg) {
+       LDKPendingHTLCInfo arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = PendingHTLCInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_clone(int64_t orig) {
+       LDKPendingHTLCInfo orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKPendingHTLCInfo ret_var = PendingHTLCInfo_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_BlindedFailure_clone(int64_t orig) {
+       LDKBlindedFailure* orig_conv = (LDKBlindedFailure*)untag_ptr(orig);
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedFailure_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_BlindedFailure_from_introduction_node() {
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedFailure_from_introduction_node());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_BlindedFailure_from_blinded_node() {
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedFailure_from_blinded_node());
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedFailure_hash(int64_t o) {
+       LDKBlindedFailure* o_conv = (LDKBlindedFailure*)untag_ptr(o);
+       int64_t ret_conv = BlindedFailure_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedFailure_eq(int64_t a, int64_t b) {
+       LDKBlindedFailure* a_conv = (LDKBlindedFailure*)untag_ptr(a);
+       LDKBlindedFailure* b_conv = (LDKBlindedFailure*)untag_ptr(b);
+       jboolean ret_conv = BlindedFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_FailureCode_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -35596,7 +38457,7 @@ int64_t  CS_LDK_ChannelManager_get_current_default_configuration(int64_t this_ar
        return ret_ref;
 }
 
-int64_t  CS_LDK_ChannelManager_create_channel(int64_t this_arg, int8_tArray their_network_key, int64_t channel_value_satoshis, int64_t push_msat, int8_tArray user_channel_id, int64_t override_config) {
+int64_t  CS_LDK_ChannelManager_create_channel(int64_t this_arg, int8_tArray their_network_key, int64_t channel_value_satoshis, int64_t push_msat, int8_tArray user_channel_id, int64_t temporary_channel_id, int64_t override_config) {
        LDKChannelManager this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
@@ -35608,13 +38469,17 @@ int64_t  CS_LDK_ChannelManager_create_channel(int64_t this_arg, int8_tArray thei
        LDKU128 user_channel_id_ref;
        CHECK(user_channel_id->arr_len == 16);
        memcpy(user_channel_id_ref.le_bytes, user_channel_id->elems, 16); FREE(user_channel_id);
+       void* temporary_channel_id_ptr = untag_ptr(temporary_channel_id);
+       CHECK_ACCESS(temporary_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ temporary_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(temporary_channel_id_ptr);
+       temporary_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(temporary_channel_id));
        LDKUserConfig override_config_conv;
        override_config_conv.inner = untag_ptr(override_config);
        override_config_conv.is_owned = ptr_is_owned(override_config);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(override_config_conv);
        override_config_conv = UserConfig_clone(&override_config_conv);
        LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
-       *ret_conv = ChannelManager_create_channel(&this_arg_conv, their_network_key_ref, channel_value_satoshis, push_msat, user_channel_id_ref, override_config_conv);
+       *ret_conv = ChannelManager_create_channel(&this_arg_conv, their_network_key_ref, channel_value_satoshis, push_msat, user_channel_id_ref, temporary_channel_id_conv, override_config_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -36692,6 +39557,90 @@ int64_t  CS_LDK_PhantomRouteHints_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+int8_tArray  CS_LDK_BlindedForward_write(int64_t obj) {
+       LDKBlindedForward obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = BlindedForward_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_BlindedForward_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = BlindedForward_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PendingHTLCRouting_write(int64_t obj) {
+       LDKPendingHTLCRouting* obj_conv = (LDKPendingHTLCRouting*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PendingHTLCRouting_write(obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = PendingHTLCRouting_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PendingHTLCInfo_write(int64_t obj) {
+       LDKPendingHTLCInfo obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = PendingHTLCInfo_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = PendingHTLCInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BlindedFailure_write(int64_t obj) {
+       LDKBlindedFailure* obj_conv = (LDKBlindedFailure*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = BlindedFailure_write(obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_BlindedFailure_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = BlindedFailure_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_ChannelManager_write(int64_t obj) {
        LDKChannelManager obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -37077,6 +40026,844 @@ int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_read(int8_tArray ser, int6
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_DelayedPaymentBasepoint_free(int64_t this_obj) {
+       LDKDelayedPaymentBasepoint this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       DelayedPaymentBasepoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentBasepoint_get_a(int64_t this_ptr) {
+       LDKDelayedPaymentBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentBasepoint_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentBasepoint_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKDelayedPaymentBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       DelayedPaymentBasepoint_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKDelayedPaymentBasepoint ret_var = DelayedPaymentBasepoint_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_DelayedPaymentBasepoint_eq(int64_t a, int64_t b) {
+       LDKDelayedPaymentBasepoint a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKDelayedPaymentBasepoint b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = DelayedPaymentBasepoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t DelayedPaymentBasepoint_clone_ptr(LDKDelayedPaymentBasepoint *NONNULL_PTR arg) {
+       LDKDelayedPaymentBasepoint ret_var = DelayedPaymentBasepoint_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_DelayedPaymentBasepoint_clone_ptr(int64_t arg) {
+       LDKDelayedPaymentBasepoint arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = DelayedPaymentBasepoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_clone(int64_t orig) {
+       LDKDelayedPaymentBasepoint orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKDelayedPaymentBasepoint ret_var = DelayedPaymentBasepoint_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_hash(int64_t o) {
+       LDKDelayedPaymentBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = DelayedPaymentBasepoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentBasepoint_to_public_key(int64_t this_arg) {
+       LDKDelayedPaymentBasepoint this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentBasepoint_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentBasepoint_write(int64_t obj) {
+       LDKDelayedPaymentBasepoint obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = DelayedPaymentBasepoint_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = DelayedPaymentBasepoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DelayedPaymentKey_free(int64_t this_obj) {
+       LDKDelayedPaymentKey this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       DelayedPaymentKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentKey_get_a(int64_t this_ptr) {
+       LDKDelayedPaymentKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKDelayedPaymentKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       DelayedPaymentKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_DelayedPaymentKey_eq(int64_t a, int64_t b) {
+       LDKDelayedPaymentKey a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKDelayedPaymentKey b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = DelayedPaymentKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t DelayedPaymentKey_clone_ptr(LDKDelayedPaymentKey *NONNULL_PTR arg) {
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_DelayedPaymentKey_clone_ptr(int64_t arg) {
+       LDKDelayedPaymentKey arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = DelayedPaymentKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_clone(int64_t orig) {
+       LDKDelayedPaymentKey orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_from_basepoint(int64_t countersignatory_basepoint, int8_tArray per_commitment_point) {
+       LDKDelayedPaymentBasepoint countersignatory_basepoint_conv;
+       countersignatory_basepoint_conv.inner = untag_ptr(countersignatory_basepoint);
+       countersignatory_basepoint_conv.is_owned = ptr_is_owned(countersignatory_basepoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_basepoint_conv);
+       countersignatory_basepoint_conv.is_owned = false;
+       LDKPublicKey per_commitment_point_ref;
+       CHECK(per_commitment_point->arr_len == 33);
+       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_from_basepoint(&countersignatory_basepoint_conv, per_commitment_point_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_from_secret_key(int8_tArray sk) {
+       uint8_t sk_arr[32];
+       CHECK(sk->arr_len == 32);
+       memcpy(sk_arr, sk->elems, 32); FREE(sk);
+       uint8_t (*sk_ref)[32] = &sk_arr;
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_from_secret_key(sk_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentKey_to_public_key(int64_t this_arg) {
+       LDKDelayedPaymentKey this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentKey_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentKey_write(int64_t obj) {
+       LDKDelayedPaymentKey obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = DelayedPaymentKey_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = DelayedPaymentKey_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HtlcBasepoint_free(int64_t this_obj) {
+       LDKHtlcBasepoint this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       HtlcBasepoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_HtlcBasepoint_get_a(int64_t this_ptr) {
+       LDKHtlcBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcBasepoint_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_HtlcBasepoint_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKHtlcBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       HtlcBasepoint_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_HtlcBasepoint_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKHtlcBasepoint ret_var = HtlcBasepoint_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_HtlcBasepoint_eq(int64_t a, int64_t b) {
+       LDKHtlcBasepoint a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKHtlcBasepoint b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = HtlcBasepoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t HtlcBasepoint_clone_ptr(LDKHtlcBasepoint *NONNULL_PTR arg) {
+       LDKHtlcBasepoint ret_var = HtlcBasepoint_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_HtlcBasepoint_clone_ptr(int64_t arg) {
+       LDKHtlcBasepoint arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = HtlcBasepoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HtlcBasepoint_clone(int64_t orig) {
+       LDKHtlcBasepoint orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKHtlcBasepoint ret_var = HtlcBasepoint_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HtlcBasepoint_hash(int64_t o) {
+       LDKHtlcBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = HtlcBasepoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HtlcBasepoint_to_public_key(int64_t this_arg) {
+       LDKHtlcBasepoint this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcBasepoint_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_HtlcBasepoint_write(int64_t obj) {
+       LDKHtlcBasepoint obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = HtlcBasepoint_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_HtlcBasepoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = HtlcBasepoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HtlcKey_free(int64_t this_obj) {
+       LDKHtlcKey this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       HtlcKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_HtlcKey_get_a(int64_t this_ptr) {
+       LDKHtlcKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_HtlcKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKHtlcKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       HtlcKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_HtlcKey_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKHtlcKey ret_var = HtlcKey_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_HtlcKey_eq(int64_t a, int64_t b) {
+       LDKHtlcKey a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKHtlcKey b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = HtlcKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t HtlcKey_clone_ptr(LDKHtlcKey *NONNULL_PTR arg) {
+       LDKHtlcKey ret_var = HtlcKey_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_HtlcKey_clone_ptr(int64_t arg) {
+       LDKHtlcKey arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = HtlcKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HtlcKey_clone(int64_t orig) {
+       LDKHtlcKey orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKHtlcKey ret_var = HtlcKey_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HtlcKey_from_basepoint(int64_t countersignatory_basepoint, int8_tArray per_commitment_point) {
+       LDKHtlcBasepoint countersignatory_basepoint_conv;
+       countersignatory_basepoint_conv.inner = untag_ptr(countersignatory_basepoint);
+       countersignatory_basepoint_conv.is_owned = ptr_is_owned(countersignatory_basepoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_basepoint_conv);
+       countersignatory_basepoint_conv.is_owned = false;
+       LDKPublicKey per_commitment_point_ref;
+       CHECK(per_commitment_point->arr_len == 33);
+       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
+       LDKHtlcKey ret_var = HtlcKey_from_basepoint(&countersignatory_basepoint_conv, per_commitment_point_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HtlcKey_from_secret_key(int8_tArray sk) {
+       uint8_t sk_arr[32];
+       CHECK(sk->arr_len == 32);
+       memcpy(sk_arr, sk->elems, 32); FREE(sk);
+       uint8_t (*sk_ref)[32] = &sk_arr;
+       LDKHtlcKey ret_var = HtlcKey_from_secret_key(sk_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_HtlcKey_to_public_key(int64_t this_arg) {
+       LDKHtlcKey this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcKey_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_HtlcKey_write(int64_t obj) {
+       LDKHtlcKey obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = HtlcKey_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_HtlcKey_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = HtlcKey_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RevocationBasepoint_free(int64_t this_obj) {
+       LDKRevocationBasepoint this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       RevocationBasepoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RevocationBasepoint_get_a(int64_t this_ptr) {
+       LDKRevocationBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationBasepoint_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RevocationBasepoint_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKRevocationBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       RevocationBasepoint_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RevocationBasepoint_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKRevocationBasepoint ret_var = RevocationBasepoint_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_RevocationBasepoint_eq(int64_t a, int64_t b) {
+       LDKRevocationBasepoint a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKRevocationBasepoint b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = RevocationBasepoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RevocationBasepoint_clone_ptr(LDKRevocationBasepoint *NONNULL_PTR arg) {
+       LDKRevocationBasepoint ret_var = RevocationBasepoint_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_RevocationBasepoint_clone_ptr(int64_t arg) {
+       LDKRevocationBasepoint arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = RevocationBasepoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevocationBasepoint_clone(int64_t orig) {
+       LDKRevocationBasepoint orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKRevocationBasepoint ret_var = RevocationBasepoint_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RevocationBasepoint_hash(int64_t o) {
+       LDKRevocationBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = RevocationBasepoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RevocationBasepoint_to_public_key(int64_t this_arg) {
+       LDKRevocationBasepoint this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationBasepoint_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_RevocationBasepoint_write(int64_t obj) {
+       LDKRevocationBasepoint obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = RevocationBasepoint_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RevocationBasepoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = RevocationBasepoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RevocationKey_free(int64_t this_obj) {
+       LDKRevocationKey this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       RevocationKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RevocationKey_get_a(int64_t this_ptr) {
+       LDKRevocationKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RevocationKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKRevocationKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       RevocationKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RevocationKey_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKRevocationKey ret_var = RevocationKey_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_RevocationKey_eq(int64_t a, int64_t b) {
+       LDKRevocationKey a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKRevocationKey b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = RevocationKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RevocationKey_clone_ptr(LDKRevocationKey *NONNULL_PTR arg) {
+       LDKRevocationKey ret_var = RevocationKey_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_RevocationKey_clone_ptr(int64_t arg) {
+       LDKRevocationKey arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = RevocationKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevocationKey_clone(int64_t orig) {
+       LDKRevocationKey orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKRevocationKey ret_var = RevocationKey_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RevocationKey_hash(int64_t o) {
+       LDKRevocationKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = RevocationKey_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevocationKey_from_basepoint(int64_t countersignatory_basepoint, int8_tArray per_commitment_point) {
+       LDKRevocationBasepoint countersignatory_basepoint_conv;
+       countersignatory_basepoint_conv.inner = untag_ptr(countersignatory_basepoint);
+       countersignatory_basepoint_conv.is_owned = ptr_is_owned(countersignatory_basepoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_basepoint_conv);
+       countersignatory_basepoint_conv.is_owned = false;
+       LDKPublicKey per_commitment_point_ref;
+       CHECK(per_commitment_point->arr_len == 33);
+       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
+       LDKRevocationKey ret_var = RevocationKey_from_basepoint(&countersignatory_basepoint_conv, per_commitment_point_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_RevocationKey_to_public_key(int64_t this_arg) {
+       LDKRevocationKey this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationKey_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_RevocationKey_write(int64_t obj) {
+       LDKRevocationKey obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = RevocationKey_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RevocationKey_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = RevocationKey_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 void  CS_LDK_ExpandedKey_free(int64_t this_obj) {
        LDKExpandedKey this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -37220,6 +41007,12 @@ int64_t  CS_LDK_DecodeError_unsupported_compression() {
        return ret_ref;
 }
 
+int64_t  CS_LDK_DecodeError_hash(int64_t o) {
+       LDKDecodeError* o_conv = (LDKDecodeError*)untag_ptr(o);
+       int64_t ret_conv = DecodeError_hash(o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_DecodeError_eq(int64_t a, int64_t b) {
        LDKDecodeError* a_conv = (LDKDecodeError*)untag_ptr(a);
        LDKDecodeError* b_conv = (LDKDecodeError*)untag_ptr(b);
@@ -37362,6 +41155,16 @@ int64_t  CS_LDK_Init_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Init_hash(int64_t o) {
+       LDKInit o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Init_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Init_eq(int64_t a, int64_t b) {
        LDKInit a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37472,6 +41275,16 @@ int64_t  CS_LDK_ErrorMessage_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ErrorMessage_hash(int64_t o) {
+       LDKErrorMessage o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ErrorMessage_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ErrorMessage_eq(int64_t a, int64_t b) {
        LDKErrorMessage a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37582,6 +41395,16 @@ int64_t  CS_LDK_WarningMessage_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_WarningMessage_hash(int64_t o) {
+       LDKWarningMessage o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = WarningMessage_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_WarningMessage_eq(int64_t a, int64_t b) {
        LDKWarningMessage a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37681,6 +41504,16 @@ int64_t  CS_LDK_Ping_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Ping_hash(int64_t o) {
+       LDKPing o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Ping_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Ping_eq(int64_t a, int64_t b) {
        LDKPing a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37761,6 +41594,16 @@ int64_t  CS_LDK_Pong_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Pong_hash(int64_t o) {
+       LDKPong o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Pong_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Pong_eq(int64_t a, int64_t b) {
        LDKPong a_conv;
        a_conv.inner = untag_ptr(a);
@@ -38281,6 +42124,16 @@ int64_t  CS_LDK_OpenChannel_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_OpenChannel_hash(int64_t o) {
+       LDKOpenChannel o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OpenChannel_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_OpenChannel_eq(int64_t a, int64_t b) {
        LDKOpenChannel a_conv;
        a_conv.inner = untag_ptr(a);
@@ -38848,6 +42701,16 @@ int64_t  CS_LDK_OpenChannelV2_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_OpenChannelV2_hash(int64_t o) {
+       LDKOpenChannelV2 o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OpenChannelV2_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_OpenChannelV2_eq(int64_t a, int64_t b) {
        LDKOpenChannelV2 a_conv;
        a_conv.inner = untag_ptr(a);
@@ -39285,6 +43148,16 @@ int64_t  CS_LDK_AcceptChannel_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_AcceptChannel_hash(int64_t o) {
+       LDKAcceptChannel o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = AcceptChannel_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_AcceptChannel_eq(int64_t a, int64_t b) {
        LDKAcceptChannel a_conv;
        a_conv.inner = untag_ptr(a);
@@ -39769,6 +43642,16 @@ int64_t  CS_LDK_AcceptChannelV2_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_AcceptChannelV2_hash(int64_t o) {
+       LDKAcceptChannelV2 o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = AcceptChannelV2_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_AcceptChannelV2_eq(int64_t a, int64_t b) {
        LDKAcceptChannelV2 a_conv;
        a_conv.inner = untag_ptr(a);
@@ -39927,6 +43810,16 @@ int64_t  CS_LDK_FundingCreated_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_FundingCreated_hash(int64_t o) {
+       LDKFundingCreated o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = FundingCreated_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_FundingCreated_eq(int64_t a, int64_t b) {
        LDKFundingCreated a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40040,6 +43933,16 @@ int64_t  CS_LDK_FundingSigned_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_FundingSigned_hash(int64_t o) {
+       LDKFundingSigned o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = FundingSigned_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_FundingSigned_eq(int64_t a, int64_t b) {
        LDKFundingSigned a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40182,6 +44085,16 @@ int64_t  CS_LDK_ChannelReady_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelReady_hash(int64_t o) {
+       LDKChannelReady o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelReady_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelReady_eq(int64_t a, int64_t b) {
        LDKChannelReady a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40197,6 +44110,553 @@ jboolean  CS_LDK_ChannelReady_eq(int64_t a, int64_t b) {
        return ret_conv;
 }
 
+void  CS_LDK_Stfu_free(int64_t this_obj) {
+       LDKStfu this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       Stfu_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_Stfu_get_channel_id(int64_t this_ptr) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *Stfu_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Stfu_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       Stfu_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_t  CS_LDK_Stfu_get_initiator(int64_t this_ptr) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_t ret_conv = Stfu_get_initiator(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Stfu_set_initiator(int64_t this_ptr, int8_t val) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Stfu_set_initiator(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Stfu_new(int8_tArray channel_id_arg, int8_t initiator_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKStfu ret_var = Stfu_new(channel_id_arg_ref, initiator_arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t Stfu_clone_ptr(LDKStfu *NONNULL_PTR arg) {
+       LDKStfu ret_var = Stfu_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_Stfu_clone_ptr(int64_t arg) {
+       LDKStfu arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = Stfu_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Stfu_clone(int64_t orig) {
+       LDKStfu orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKStfu ret_var = Stfu_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Stfu_eq(int64_t a, int64_t b) {
+       LDKStfu a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKStfu b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = Stfu_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_free(int64_t this_obj) {
+       LDKSplice this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       Splice_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_Splice_get_channel_id(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *Splice_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Splice_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       Splice_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Splice_get_chain_hash(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *Splice_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Splice_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       Splice_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Splice_get_relative_satoshis(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = Splice_get_relative_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_set_relative_satoshis(int64_t this_ptr, int64_t val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Splice_set_relative_satoshis(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_Splice_get_funding_feerate_perkw(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = Splice_get_funding_feerate_perkw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_set_funding_feerate_perkw(int64_t this_ptr, int32_t val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Splice_set_funding_feerate_perkw(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_Splice_get_locktime(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = Splice_get_locktime(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_set_locktime(int64_t this_ptr, int32_t val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Splice_set_locktime(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_Splice_get_funding_pubkey(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Splice_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_Splice_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       Splice_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Splice_new(int8_tArray channel_id_arg, int8_tArray chain_hash_arg, int64_t relative_satoshis_arg, int32_t funding_feerate_perkw_arg, int32_t locktime_arg, int8_tArray funding_pubkey_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKThirtyTwoBytes chain_hash_arg_ref;
+       CHECK(chain_hash_arg->arr_len == 32);
+       memcpy(chain_hash_arg_ref.data, chain_hash_arg->elems, 32); FREE(chain_hash_arg);
+       LDKPublicKey funding_pubkey_arg_ref;
+       CHECK(funding_pubkey_arg->arr_len == 33);
+       memcpy(funding_pubkey_arg_ref.compressed_form, funding_pubkey_arg->elems, 33); FREE(funding_pubkey_arg);
+       LDKSplice ret_var = Splice_new(channel_id_arg_ref, chain_hash_arg_ref, relative_satoshis_arg, funding_feerate_perkw_arg, locktime_arg, funding_pubkey_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t Splice_clone_ptr(LDKSplice *NONNULL_PTR arg) {
+       LDKSplice ret_var = Splice_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_Splice_clone_ptr(int64_t arg) {
+       LDKSplice arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = Splice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Splice_clone(int64_t orig) {
+       LDKSplice orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKSplice ret_var = Splice_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Splice_eq(int64_t a, int64_t b) {
+       LDKSplice a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKSplice b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = Splice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SpliceAck_free(int64_t this_obj) {
+       LDKSpliceAck this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       SpliceAck_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_SpliceAck_get_channel_id(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *SpliceAck_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceAck_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       SpliceAck_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_SpliceAck_get_chain_hash(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *SpliceAck_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceAck_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       SpliceAck_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_SpliceAck_get_relative_satoshis(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = SpliceAck_get_relative_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SpliceAck_set_relative_satoshis(int64_t this_ptr, int64_t val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       SpliceAck_set_relative_satoshis(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_SpliceAck_get_funding_pubkey(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, SpliceAck_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceAck_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       SpliceAck_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_SpliceAck_new(int8_tArray channel_id_arg, int8_tArray chain_hash_arg, int64_t relative_satoshis_arg, int8_tArray funding_pubkey_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKThirtyTwoBytes chain_hash_arg_ref;
+       CHECK(chain_hash_arg->arr_len == 32);
+       memcpy(chain_hash_arg_ref.data, chain_hash_arg->elems, 32); FREE(chain_hash_arg);
+       LDKPublicKey funding_pubkey_arg_ref;
+       CHECK(funding_pubkey_arg->arr_len == 33);
+       memcpy(funding_pubkey_arg_ref.compressed_form, funding_pubkey_arg->elems, 33); FREE(funding_pubkey_arg);
+       LDKSpliceAck ret_var = SpliceAck_new(channel_id_arg_ref, chain_hash_arg_ref, relative_satoshis_arg, funding_pubkey_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t SpliceAck_clone_ptr(LDKSpliceAck *NONNULL_PTR arg) {
+       LDKSpliceAck ret_var = SpliceAck_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_SpliceAck_clone_ptr(int64_t arg) {
+       LDKSpliceAck arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = SpliceAck_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SpliceAck_clone(int64_t orig) {
+       LDKSpliceAck orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKSpliceAck ret_var = SpliceAck_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SpliceAck_eq(int64_t a, int64_t b) {
+       LDKSpliceAck a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKSpliceAck b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = SpliceAck_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SpliceLocked_free(int64_t this_obj) {
+       LDKSpliceLocked this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       SpliceLocked_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_SpliceLocked_get_channel_id(int64_t this_ptr) {
+       LDKSpliceLocked this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *SpliceLocked_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceLocked_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceLocked this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       SpliceLocked_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_SpliceLocked_new(int8_tArray channel_id_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKSpliceLocked ret_var = SpliceLocked_new(channel_id_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t SpliceLocked_clone_ptr(LDKSpliceLocked *NONNULL_PTR arg) {
+       LDKSpliceLocked ret_var = SpliceLocked_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_SpliceLocked_clone_ptr(int64_t arg) {
+       LDKSpliceLocked arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = SpliceLocked_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SpliceLocked_clone(int64_t orig) {
+       LDKSpliceLocked orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKSpliceLocked ret_var = SpliceLocked_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SpliceLocked_eq(int64_t a, int64_t b) {
+       LDKSpliceLocked a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKSpliceLocked b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = SpliceLocked_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_TxAddInput_free(int64_t this_obj) {
        LDKTxAddInput this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -40358,6 +44818,16 @@ int64_t  CS_LDK_TxAddInput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAddInput_hash(int64_t o) {
+       LDKTxAddInput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAddInput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAddInput_eq(int64_t a, int64_t b) {
        LDKTxAddInput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40448,9 +44918,10 @@ int8_tArray  CS_LDK_TxAddOutput_get_script(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = TxAddOutput_get_script(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = TxAddOutput_get_script(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -40512,6 +44983,16 @@ int64_t  CS_LDK_TxAddOutput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAddOutput_hash(int64_t o) {
+       LDKTxAddOutput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAddOutput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAddOutput_eq(int64_t a, int64_t b) {
        LDKTxAddOutput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40618,6 +45099,16 @@ int64_t  CS_LDK_TxRemoveInput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxRemoveInput_hash(int64_t o) {
+       LDKTxRemoveInput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxRemoveInput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxRemoveInput_eq(int64_t a, int64_t b) {
        LDKTxRemoveInput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40724,6 +45215,16 @@ int64_t  CS_LDK_TxRemoveOutput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxRemoveOutput_hash(int64_t o) {
+       LDKTxRemoveOutput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxRemoveOutput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxRemoveOutput_eq(int64_t a, int64_t b) {
        LDKTxRemoveOutput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40811,6 +45312,16 @@ int64_t  CS_LDK_TxComplete_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxComplete_hash(int64_t o) {
+       LDKTxComplete o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxComplete_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxComplete_eq(int64_t a, int64_t b) {
        LDKTxComplete a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40989,6 +45500,16 @@ int64_t  CS_LDK_TxSignatures_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxSignatures_hash(int64_t o) {
+       LDKTxSignatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxSignatures_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxSignatures_eq(int64_t a, int64_t b) {
        LDKTxSignatures a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41143,6 +45664,16 @@ int64_t  CS_LDK_TxInitRbf_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxInitRbf_hash(int64_t o) {
+       LDKTxInitRbf o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxInitRbf_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxInitRbf_eq(int64_t a, int64_t b) {
        LDKTxInitRbf a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41259,6 +45790,16 @@ int64_t  CS_LDK_TxAckRbf_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAckRbf_hash(int64_t o) {
+       LDKTxAckRbf o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAckRbf_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAckRbf_eq(int64_t a, int64_t b) {
        LDKTxAckRbf a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41376,6 +45917,16 @@ int64_t  CS_LDK_TxAbort_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAbort_hash(int64_t o) {
+       LDKTxAbort o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAbort_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAbort_eq(int64_t a, int64_t b) {
        LDKTxAbort a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41428,9 +45979,10 @@ int8_tArray  CS_LDK_Shutdown_get_scriptpubkey(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = Shutdown_get_scriptpubkey(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = Shutdown_get_scriptpubkey(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -41492,6 +46044,16 @@ int64_t  CS_LDK_Shutdown_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Shutdown_hash(int64_t o) {
+       LDKShutdown o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Shutdown_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Shutdown_eq(int64_t a, int64_t b) {
        LDKShutdown a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41591,6 +46153,16 @@ int64_t  CS_LDK_ClosingSignedFeeRange_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ClosingSignedFeeRange_hash(int64_t o) {
+       LDKClosingSignedFeeRange o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ClosingSignedFeeRange_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ClosingSignedFeeRange_eq(int64_t a, int64_t b) {
        LDKClosingSignedFeeRange a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41755,6 +46327,16 @@ int64_t  CS_LDK_ClosingSigned_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ClosingSigned_hash(int64_t o) {
+       LDKClosingSigned o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ClosingSigned_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ClosingSigned_eq(int64_t a, int64_t b) {
        LDKClosingSigned a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41906,6 +46488,82 @@ void  CS_LDK_UpdateAddHTLC_set_skimmed_fee_msat(int64_t this_ptr, int64_t val) {
        UpdateAddHTLC_set_skimmed_fee_msat(&this_ptr_conv, val_conv);
 }
 
+int64_t  CS_LDK_UpdateAddHTLC_get_onion_routing_packet(int64_t this_ptr) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKOnionPacket ret_var = UpdateAddHTLC_get_onion_routing_packet(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_onion_routing_packet(int64_t this_ptr, int64_t val) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKOnionPacket val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = OnionPacket_clone(&val_conv);
+       UpdateAddHTLC_set_onion_routing_packet(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UpdateAddHTLC_get_blinding_point(int64_t this_ptr) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, UpdateAddHTLC_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       UpdateAddHTLC_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_new(int8_tArray channel_id_arg, int64_t htlc_id_arg, int64_t amount_msat_arg, int8_tArray payment_hash_arg, int32_t cltv_expiry_arg, int64_t skimmed_fee_msat_arg, int64_t onion_routing_packet_arg, int8_tArray blinding_point_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKThirtyTwoBytes payment_hash_arg_ref;
+       CHECK(payment_hash_arg->arr_len == 32);
+       memcpy(payment_hash_arg_ref.data, payment_hash_arg->elems, 32); FREE(payment_hash_arg);
+       void* skimmed_fee_msat_arg_ptr = untag_ptr(skimmed_fee_msat_arg);
+       CHECK_ACCESS(skimmed_fee_msat_arg_ptr);
+       LDKCOption_u64Z skimmed_fee_msat_arg_conv = *(LDKCOption_u64Z*)(skimmed_fee_msat_arg_ptr);
+       skimmed_fee_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(skimmed_fee_msat_arg));
+       LDKOnionPacket onion_routing_packet_arg_conv;
+       onion_routing_packet_arg_conv.inner = untag_ptr(onion_routing_packet_arg);
+       onion_routing_packet_arg_conv.is_owned = ptr_is_owned(onion_routing_packet_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_routing_packet_arg_conv);
+       onion_routing_packet_arg_conv = OnionPacket_clone(&onion_routing_packet_arg_conv);
+       LDKPublicKey blinding_point_arg_ref;
+       CHECK(blinding_point_arg->arr_len == 33);
+       memcpy(blinding_point_arg_ref.compressed_form, blinding_point_arg->elems, 33); FREE(blinding_point_arg);
+       LDKUpdateAddHTLC ret_var = UpdateAddHTLC_new(channel_id_arg_ref, htlc_id_arg, amount_msat_arg, payment_hash_arg_ref, cltv_expiry_arg, skimmed_fee_msat_arg_conv, onion_routing_packet_arg_conv, blinding_point_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 static inline uint64_t UpdateAddHTLC_clone_ptr(LDKUpdateAddHTLC *NONNULL_PTR arg) {
        LDKUpdateAddHTLC ret_var = UpdateAddHTLC_clone(arg);
        int64_t ret_ref = 0;
@@ -41936,6 +46594,16 @@ int64_t  CS_LDK_UpdateAddHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateAddHTLC_hash(int64_t o) {
+       LDKUpdateAddHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateAddHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateAddHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateAddHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42055,6 +46723,16 @@ int64_t  CS_LDK_OnionMessage_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_OnionMessage_hash(int64_t o) {
+       LDKOnionMessage o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OnionMessage_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_OnionMessage_eq(int64_t a, int64_t b) {
        LDKOnionMessage a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42187,6 +46865,16 @@ int64_t  CS_LDK_UpdateFulfillHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFulfillHTLC_hash(int64_t o) {
+       LDKUpdateFulfillHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFulfillHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFulfillHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateFulfillHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42282,6 +46970,16 @@ int64_t  CS_LDK_UpdateFailHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFailHTLC_hash(int64_t o) {
+       LDKUpdateFailHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFailHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFailHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateFailHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42396,6 +47094,16 @@ int64_t  CS_LDK_UpdateFailMalformedHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFailMalformedHTLC_hash(int64_t o) {
+       LDKUpdateFailMalformedHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFailMalformedHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFailMalformedHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateFailMalformedHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42568,6 +47276,16 @@ int64_t  CS_LDK_CommitmentSigned_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_CommitmentSigned_hash(int64_t o) {
+       LDKCommitmentSigned o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = CommitmentSigned_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_CommitmentSigned_eq(int64_t a, int64_t b) {
        LDKCommitmentSigned a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42707,6 +47425,16 @@ int64_t  CS_LDK_RevokeAndACK_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_RevokeAndACK_hash(int64_t o) {
+       LDKRevokeAndACK o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = RevokeAndACK_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_RevokeAndACK_eq(int64_t a, int64_t b) {
        LDKRevokeAndACK a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42813,6 +47541,16 @@ int64_t  CS_LDK_UpdateFee_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFee_hash(int64_t o) {
+       LDKUpdateFee o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFee_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFee_eq(int64_t a, int64_t b) {
        LDKUpdateFee a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43019,6 +47757,16 @@ int64_t  CS_LDK_ChannelReestablish_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelReestablish_hash(int64_t o) {
+       LDKChannelReestablish o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelReestablish_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelReestablish_eq(int64_t a, int64_t b) {
        LDKChannelReestablish a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43177,6 +47925,16 @@ int64_t  CS_LDK_AnnouncementSignatures_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_AnnouncementSignatures_hash(int64_t o) {
+       LDKAnnouncementSignatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = AnnouncementSignatures_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_AnnouncementSignatures_eq(int64_t a, int64_t b) {
        LDKAnnouncementSignatures a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43273,6 +48031,12 @@ int64_t  CS_LDK_SocketAddress_hostname(int64_t hostname, int16_t port) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_SocketAddress_hash(int64_t o) {
+       LDKSocketAddress* o_conv = (LDKSocketAddress*)untag_ptr(o);
+       int64_t ret_conv = SocketAddress_hash(o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_SocketAddress_eq(int64_t a, int64_t b) {
        LDKSocketAddress* a_conv = (LDKSocketAddress*)untag_ptr(a);
        LDKSocketAddress* b_conv = (LDKSocketAddress*)untag_ptr(b);
@@ -43325,6 +48089,12 @@ int32_t  CS_LDK_SocketAddressParseError_invalid_onion_v3() {
        return ret_conv;
 }
 
+int64_t  CS_LDK_SocketAddressParseError_hash(int64_t o) {
+       LDKSocketAddressParseError* o_conv = (LDKSocketAddressParseError*)untag_ptr(o);
+       int64_t ret_conv = SocketAddressParseError_hash(o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_SocketAddressParseError_eq(int64_t a, int64_t b) {
        LDKSocketAddressParseError* a_conv = (LDKSocketAddressParseError*)untag_ptr(a);
        LDKSocketAddressParseError* b_conv = (LDKSocketAddressParseError*)untag_ptr(b);
@@ -43635,6 +48405,16 @@ int64_t  CS_LDK_UnsignedNodeAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UnsignedNodeAnnouncement_hash(int64_t o) {
+       LDKUnsignedNodeAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UnsignedNodeAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UnsignedNodeAnnouncement_eq(int64_t a, int64_t b) {
        LDKUnsignedNodeAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43754,6 +48534,16 @@ int64_t  CS_LDK_NodeAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_NodeAnnouncement_hash(int64_t o) {
+       LDKNodeAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = NodeAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_NodeAnnouncement_eq(int64_t a, int64_t b) {
        LDKNodeAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44050,6 +48840,16 @@ int64_t  CS_LDK_UnsignedChannelAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UnsignedChannelAnnouncement_hash(int64_t o) {
+       LDKUnsignedChannelAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UnsignedChannelAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UnsignedChannelAnnouncement_eq(int64_t a, int64_t b) {
        LDKUnsignedChannelAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44247,6 +49047,16 @@ int64_t  CS_LDK_ChannelAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelAnnouncement_hash(int64_t o) {
+       LDKChannelAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelAnnouncement_eq(int64_t a, int64_t b) {
        LDKChannelAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44516,6 +49326,16 @@ int64_t  CS_LDK_UnsignedChannelUpdate_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UnsignedChannelUpdate_hash(int64_t o) {
+       LDKUnsignedChannelUpdate o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UnsignedChannelUpdate_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UnsignedChannelUpdate_eq(int64_t a, int64_t b) {
        LDKUnsignedChannelUpdate a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44635,6 +49455,16 @@ int64_t  CS_LDK_ChannelUpdate_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelUpdate_hash(int64_t o) {
+       LDKChannelUpdate o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelUpdate_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelUpdate_eq(int64_t a, int64_t b) {
        LDKChannelUpdate a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44760,6 +49590,16 @@ int64_t  CS_LDK_QueryChannelRange_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_QueryChannelRange_hash(int64_t o) {
+       LDKQueryChannelRange o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = QueryChannelRange_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_QueryChannelRange_eq(int64_t a, int64_t b) {
        LDKQueryChannelRange a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44956,6 +49796,16 @@ int64_t  CS_LDK_ReplyChannelRange_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ReplyChannelRange_hash(int64_t o) {
+       LDKReplyChannelRange o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ReplyChannelRange_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ReplyChannelRange_eq(int64_t a, int64_t b) {
        LDKReplyChannelRange a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45095,6 +49945,16 @@ int64_t  CS_LDK_QueryShortChannelIds_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_QueryShortChannelIds_hash(int64_t o) {
+       LDKQueryShortChannelIds o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = QueryShortChannelIds_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_QueryShortChannelIds_eq(int64_t a, int64_t b) {
        LDKQueryShortChannelIds a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45201,6 +50061,16 @@ int64_t  CS_LDK_ReplyShortChannelIdsEnd_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ReplyShortChannelIdsEnd_hash(int64_t o) {
+       LDKReplyShortChannelIdsEnd o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ReplyShortChannelIdsEnd_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ReplyShortChannelIdsEnd_eq(int64_t a, int64_t b) {
        LDKReplyShortChannelIdsEnd a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45326,6 +50196,16 @@ int64_t  CS_LDK_GossipTimestampFilter_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_GossipTimestampFilter_hash(int64_t o) {
+       LDKGossipTimestampFilter o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = GossipTimestampFilter_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_GossipTimestampFilter_eq(int64_t a, int64_t b) {
        LDKGossipTimestampFilter a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45441,6 +50321,12 @@ int64_t  CS_LDK_ErrorAction_send_warning_message(int64_t msg, int32_t log_level)
        return ret_ref;
 }
 
+int64_t  CS_LDK_ErrorAction_hash(int64_t o) {
+       LDKErrorAction* o_conv = (LDKErrorAction*)untag_ptr(o);
+       int64_t ret_conv = ErrorAction_hash(o_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_LightningError_free(int64_t this_obj) {
        LDKLightningError this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -45909,6 +50795,16 @@ int64_t  CS_LDK_CommitmentUpdate_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_CommitmentUpdate_hash(int64_t o) {
+       LDKCommitmentUpdate o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = CommitmentUpdate_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_CommitmentUpdate_eq(int64_t a, int64_t b) {
        LDKCommitmentUpdate a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45951,6 +50847,226 @@ void  CS_LDK_OnionMessageHandler_free(int64_t this_ptr) {
        OnionMessageHandler_free(this_ptr_conv);
 }
 
+void  CS_LDK_FinalOnionHopData_free(int64_t this_obj) {
+       LDKFinalOnionHopData this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       FinalOnionHopData_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_FinalOnionHopData_get_payment_secret(int64_t this_ptr) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *FinalOnionHopData_get_payment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FinalOnionHopData_set_payment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       FinalOnionHopData_set_payment_secret(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_FinalOnionHopData_get_total_msat(int64_t this_ptr) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = FinalOnionHopData_get_total_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FinalOnionHopData_set_total_msat(int64_t this_ptr, int64_t val) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       FinalOnionHopData_set_total_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_FinalOnionHopData_new(int8_tArray payment_secret_arg, int64_t total_msat_arg) {
+       LDKThirtyTwoBytes payment_secret_arg_ref;
+       CHECK(payment_secret_arg->arr_len == 32);
+       memcpy(payment_secret_arg_ref.data, payment_secret_arg->elems, 32); FREE(payment_secret_arg);
+       LDKFinalOnionHopData ret_var = FinalOnionHopData_new(payment_secret_arg_ref, total_msat_arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t FinalOnionHopData_clone_ptr(LDKFinalOnionHopData *NONNULL_PTR arg) {
+       LDKFinalOnionHopData ret_var = FinalOnionHopData_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_FinalOnionHopData_clone_ptr(int64_t arg) {
+       LDKFinalOnionHopData arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = FinalOnionHopData_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FinalOnionHopData_clone(int64_t orig) {
+       LDKFinalOnionHopData orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKFinalOnionHopData ret_var = FinalOnionHopData_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_OnionPacket_free(int64_t this_obj) {
+       LDKOnionPacket this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       OnionPacket_free(this_obj_conv);
+}
+
+int8_t  CS_LDK_OnionPacket_get_version(int64_t this_ptr) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_t ret_conv = OnionPacket_get_version(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OnionPacket_set_version(int64_t this_ptr, int8_t val) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       OnionPacket_set_version(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OnionPacket_get_public_key(int64_t this_ptr) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = OnionPacket_get_public_key(&this_ptr_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_OnionPacket_set_public_key(int64_t this_ptr, int64_t val) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCResult_PublicKeySecp256k1ErrorZ val_conv = *(LDKCResult_PublicKeySecp256k1ErrorZ*)(val_ptr);
+       val_conv = CResult_PublicKeySecp256k1ErrorZ_clone((LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(val));
+       OnionPacket_set_public_key(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_OnionPacket_get_hmac(int64_t this_ptr) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *OnionPacket_get_hmac(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionPacket_set_hmac(int64_t this_ptr, int8_tArray val) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       OnionPacket_set_hmac(&this_ptr_conv, val_ref);
+}
+
+static inline uint64_t OnionPacket_clone_ptr(LDKOnionPacket *NONNULL_PTR arg) {
+       LDKOnionPacket ret_var = OnionPacket_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_OnionPacket_clone_ptr(int64_t arg) {
+       LDKOnionPacket arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = OnionPacket_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionPacket_clone(int64_t orig) {
+       LDKOnionPacket orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKOnionPacket ret_var = OnionPacket_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OnionPacket_hash(int64_t o) {
+       LDKOnionPacket o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OnionPacket_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_OnionPacket_eq(int64_t a, int64_t b) {
+       LDKOnionPacket a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKOnionPacket b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = OnionPacket_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
 int8_tArray  CS_LDK_AcceptChannel_write(int64_t obj) {
        LDKAcceptChannel obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -45997,6 +51113,98 @@ int64_t  CS_LDK_AcceptChannelV2_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+int8_tArray  CS_LDK_Stfu_write(int64_t obj) {
+       LDKStfu obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = Stfu_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Stfu_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = Stfu_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Splice_write(int64_t obj) {
+       LDKSplice obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = Splice_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Splice_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = Splice_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_SpliceAck_write(int64_t obj) {
+       LDKSpliceAck obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = SpliceAck_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SpliceAck_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = SpliceAck_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_SpliceLocked_write(int64_t obj) {
+       LDKSpliceLocked obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = SpliceLocked_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SpliceLocked_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = SpliceLocked_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_TxAddInput_write(int64_t obj) {
        LDKTxAddInput obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -46595,6 +51803,29 @@ int64_t  CS_LDK_UpdateFulfillHTLC_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+int8_tArray  CS_LDK_OnionPacket_write(int64_t obj) {
+       LDKOnionPacket obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = OnionPacket_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_OnionPacket_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = OnionPacket_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_UpdateAddHTLC_write(int64_t obj) {
        LDKUpdateAddHTLC obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -46641,6 +51872,29 @@ int8_tArray  CS_LDK_OnionMessage_write(int64_t obj) {
        return ret_arr;
 }
 
+int8_tArray  CS_LDK_FinalOnionHopData_write(int64_t obj) {
+       LDKFinalOnionHopData obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = FinalOnionHopData_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_FinalOnionHopData_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = FinalOnionHopData_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_Ping_write(int64_t obj) {
        LDKPing obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -47021,6 +52275,17 @@ int64_t  CS_LDK_IgnoringMessageHandler_new() {
        return ret_ref;
 }
 
+int64_t  CS_LDK_IgnoringMessageHandler_as_EventsProvider(int64_t this_arg) {
+       LDKIgnoringMessageHandler this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKEventsProvider* ret_ret = MALLOC(sizeof(LDKEventsProvider), "LDKEventsProvider");
+       *ret_ret = IgnoringMessageHandler_as_EventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
 int64_t  CS_LDK_IgnoringMessageHandler_as_MessageSendEventsProvider(int64_t this_arg) {
        LDKIgnoringMessageHandler this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -47801,18 +53066,6 @@ int8_tArray  CS_LDK_derive_private_key(int8_tArray per_commitment_point, int8_tA
        return ret_arr;
 }
 
-int8_tArray  CS_LDK_derive_public_key(int8_tArray per_commitment_point, int8_tArray base_point) {
-       LDKPublicKey per_commitment_point_ref;
-       CHECK(per_commitment_point->arr_len == 33);
-       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
-       LDKPublicKey base_point_ref;
-       CHECK(base_point->arr_len == 33);
-       memcpy(base_point_ref.compressed_form, base_point->elems, 33); FREE(base_point);
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, derive_public_key(per_commitment_point_ref, base_point_ref).compressed_form, 33);
-       return ret_arr;
-}
-
 int8_tArray  CS_LDK_derive_private_revocation_key(int8_tArray per_commitment_secret, int8_tArray countersignatory_revocation_base_secret) {
        uint8_t per_commitment_secret_arr[32];
        CHECK(per_commitment_secret->arr_len == 32);
@@ -47827,18 +53080,6 @@ int8_tArray  CS_LDK_derive_private_revocation_key(int8_tArray per_commitment_sec
        return ret_arr;
 }
 
-int8_tArray  CS_LDK_derive_public_revocation_key(int8_tArray per_commitment_point, int8_tArray countersignatory_revocation_base_point) {
-       LDKPublicKey per_commitment_point_ref;
-       CHECK(per_commitment_point->arr_len == 33);
-       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
-       LDKPublicKey countersignatory_revocation_base_point_ref;
-       CHECK(countersignatory_revocation_base_point->arr_len == 33);
-       memcpy(countersignatory_revocation_base_point_ref.compressed_form, countersignatory_revocation_base_point->elems, 33); FREE(countersignatory_revocation_base_point);
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, derive_public_revocation_key(per_commitment_point_ref, countersignatory_revocation_base_point_ref).compressed_form, 33);
-       return ret_arr;
-}
-
 void  CS_LDK_TxCreationKeys_free(int64_t this_obj) {
        LDKTxCreationKeys this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -47870,115 +53111,139 @@ void  CS_LDK_TxCreationKeys_set_per_commitment_point(int64_t this_ptr, int8_tArr
        TxCreationKeys_set_per_commitment_point(&this_ptr_conv, val_ref);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_revocation_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_revocation_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_revocation_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKRevocationKey ret_var = TxCreationKeys_get_revocation_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_revocation_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_revocation_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_revocation_key(&this_ptr_conv, val_ref);
+       LDKRevocationKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = RevocationKey_clone(&val_conv);
+       TxCreationKeys_set_revocation_key(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_broadcaster_htlc_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_broadcaster_htlc_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_broadcaster_htlc_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKHtlcKey ret_var = TxCreationKeys_get_broadcaster_htlc_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_broadcaster_htlc_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_broadcaster_htlc_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_broadcaster_htlc_key(&this_ptr_conv, val_ref);
+       LDKHtlcKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = HtlcKey_clone(&val_conv);
+       TxCreationKeys_set_broadcaster_htlc_key(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_countersignatory_htlc_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_countersignatory_htlc_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_countersignatory_htlc_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKHtlcKey ret_var = TxCreationKeys_get_countersignatory_htlc_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_countersignatory_htlc_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_countersignatory_htlc_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_countersignatory_htlc_key(&this_ptr_conv, val_ref);
+       LDKHtlcKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = HtlcKey_clone(&val_conv);
+       TxCreationKeys_set_countersignatory_htlc_key(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_broadcaster_delayed_payment_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_broadcaster_delayed_payment_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_broadcaster_delayed_payment_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKDelayedPaymentKey ret_var = TxCreationKeys_get_broadcaster_delayed_payment_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_broadcaster_delayed_payment_key(&this_ptr_conv, val_ref);
+       LDKDelayedPaymentKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = DelayedPaymentKey_clone(&val_conv);
+       TxCreationKeys_set_broadcaster_delayed_payment_key(&this_ptr_conv, val_conv);
 }
 
-int64_t  CS_LDK_TxCreationKeys_new(int8_tArray per_commitment_point_arg, int8_tArray revocation_key_arg, int8_tArray broadcaster_htlc_key_arg, int8_tArray countersignatory_htlc_key_arg, int8_tArray broadcaster_delayed_payment_key_arg) {
+int64_t  CS_LDK_TxCreationKeys_new(int8_tArray per_commitment_point_arg, int64_t revocation_key_arg, int64_t broadcaster_htlc_key_arg, int64_t countersignatory_htlc_key_arg, int64_t broadcaster_delayed_payment_key_arg) {
        LDKPublicKey per_commitment_point_arg_ref;
        CHECK(per_commitment_point_arg->arr_len == 33);
        memcpy(per_commitment_point_arg_ref.compressed_form, per_commitment_point_arg->elems, 33); FREE(per_commitment_point_arg);
-       LDKPublicKey revocation_key_arg_ref;
-       CHECK(revocation_key_arg->arr_len == 33);
-       memcpy(revocation_key_arg_ref.compressed_form, revocation_key_arg->elems, 33); FREE(revocation_key_arg);
-       LDKPublicKey broadcaster_htlc_key_arg_ref;
-       CHECK(broadcaster_htlc_key_arg->arr_len == 33);
-       memcpy(broadcaster_htlc_key_arg_ref.compressed_form, broadcaster_htlc_key_arg->elems, 33); FREE(broadcaster_htlc_key_arg);
-       LDKPublicKey countersignatory_htlc_key_arg_ref;
-       CHECK(countersignatory_htlc_key_arg->arr_len == 33);
-       memcpy(countersignatory_htlc_key_arg_ref.compressed_form, countersignatory_htlc_key_arg->elems, 33); FREE(countersignatory_htlc_key_arg);
-       LDKPublicKey broadcaster_delayed_payment_key_arg_ref;
-       CHECK(broadcaster_delayed_payment_key_arg->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_key_arg_ref.compressed_form, broadcaster_delayed_payment_key_arg->elems, 33); FREE(broadcaster_delayed_payment_key_arg);
-       LDKTxCreationKeys ret_var = TxCreationKeys_new(per_commitment_point_arg_ref, revocation_key_arg_ref, broadcaster_htlc_key_arg_ref, countersignatory_htlc_key_arg_ref, broadcaster_delayed_payment_key_arg_ref);
+       LDKRevocationKey revocation_key_arg_conv;
+       revocation_key_arg_conv.inner = untag_ptr(revocation_key_arg);
+       revocation_key_arg_conv.is_owned = ptr_is_owned(revocation_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_key_arg_conv);
+       revocation_key_arg_conv = RevocationKey_clone(&revocation_key_arg_conv);
+       LDKHtlcKey broadcaster_htlc_key_arg_conv;
+       broadcaster_htlc_key_arg_conv.inner = untag_ptr(broadcaster_htlc_key_arg);
+       broadcaster_htlc_key_arg_conv.is_owned = ptr_is_owned(broadcaster_htlc_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_htlc_key_arg_conv);
+       broadcaster_htlc_key_arg_conv = HtlcKey_clone(&broadcaster_htlc_key_arg_conv);
+       LDKHtlcKey countersignatory_htlc_key_arg_conv;
+       countersignatory_htlc_key_arg_conv.inner = untag_ptr(countersignatory_htlc_key_arg);
+       countersignatory_htlc_key_arg_conv.is_owned = ptr_is_owned(countersignatory_htlc_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_htlc_key_arg_conv);
+       countersignatory_htlc_key_arg_conv = HtlcKey_clone(&countersignatory_htlc_key_arg_conv);
+       LDKDelayedPaymentKey broadcaster_delayed_payment_key_arg_conv;
+       broadcaster_delayed_payment_key_arg_conv.inner = untag_ptr(broadcaster_delayed_payment_key_arg);
+       broadcaster_delayed_payment_key_arg_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_key_arg_conv);
+       broadcaster_delayed_payment_key_arg_conv = DelayedPaymentKey_clone(&broadcaster_delayed_payment_key_arg_conv);
+       LDKTxCreationKeys ret_var = TxCreationKeys_new(per_commitment_point_arg_ref, revocation_key_arg_conv, broadcaster_htlc_key_arg_conv, countersignatory_htlc_key_arg_conv, broadcaster_delayed_payment_key_arg_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -48084,27 +53349,31 @@ void  CS_LDK_ChannelPublicKeys_set_funding_pubkey(int64_t this_ptr, int8_tArray
        ChannelPublicKeys_set_funding_pubkey(&this_ptr_conv, val_ref);
 }
 
-int8_tArray  CS_LDK_ChannelPublicKeys_get_revocation_basepoint(int64_t this_ptr) {
+int64_t  CS_LDK_ChannelPublicKeys_get_revocation_basepoint(int64_t this_ptr) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, ChannelPublicKeys_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKRevocationBasepoint ret_var = ChannelPublicKeys_get_revocation_basepoint(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_ChannelPublicKeys_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_ChannelPublicKeys_set_revocation_basepoint(int64_t this_ptr, int64_t val) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       ChannelPublicKeys_set_revocation_basepoint(&this_ptr_conv, val_ref);
+       LDKRevocationBasepoint val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = RevocationBasepoint_clone(&val_conv);
+       ChannelPublicKeys_set_revocation_basepoint(&this_ptr_conv, val_conv);
 }
 
 int8_tArray  CS_LDK_ChannelPublicKeys_get_payment_point(int64_t this_ptr) {
@@ -48130,69 +53399,83 @@ void  CS_LDK_ChannelPublicKeys_set_payment_point(int64_t this_ptr, int8_tArray v
        ChannelPublicKeys_set_payment_point(&this_ptr_conv, val_ref);
 }
 
-int8_tArray  CS_LDK_ChannelPublicKeys_get_delayed_payment_basepoint(int64_t this_ptr) {
+int64_t  CS_LDK_ChannelPublicKeys_get_delayed_payment_basepoint(int64_t this_ptr) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, ChannelPublicKeys_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKDelayedPaymentBasepoint ret_var = ChannelPublicKeys_get_delayed_payment_basepoint(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint(int64_t this_ptr, int64_t val) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       ChannelPublicKeys_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+       LDKDelayedPaymentBasepoint val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = DelayedPaymentBasepoint_clone(&val_conv);
+       ChannelPublicKeys_set_delayed_payment_basepoint(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_ChannelPublicKeys_get_htlc_basepoint(int64_t this_ptr) {
+int64_t  CS_LDK_ChannelPublicKeys_get_htlc_basepoint(int64_t this_ptr) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, ChannelPublicKeys_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKHtlcBasepoint ret_var = ChannelPublicKeys_get_htlc_basepoint(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_ChannelPublicKeys_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_ChannelPublicKeys_set_htlc_basepoint(int64_t this_ptr, int64_t val) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       ChannelPublicKeys_set_htlc_basepoint(&this_ptr_conv, val_ref);
+       LDKHtlcBasepoint val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = HtlcBasepoint_clone(&val_conv);
+       ChannelPublicKeys_set_htlc_basepoint(&this_ptr_conv, val_conv);
 }
 
-int64_t  CS_LDK_ChannelPublicKeys_new(int8_tArray funding_pubkey_arg, int8_tArray revocation_basepoint_arg, int8_tArray payment_point_arg, int8_tArray delayed_payment_basepoint_arg, int8_tArray htlc_basepoint_arg) {
+int64_t  CS_LDK_ChannelPublicKeys_new(int8_tArray funding_pubkey_arg, int64_t revocation_basepoint_arg, int8_tArray payment_point_arg, int64_t delayed_payment_basepoint_arg, int64_t htlc_basepoint_arg) {
        LDKPublicKey funding_pubkey_arg_ref;
        CHECK(funding_pubkey_arg->arr_len == 33);
        memcpy(funding_pubkey_arg_ref.compressed_form, funding_pubkey_arg->elems, 33); FREE(funding_pubkey_arg);
-       LDKPublicKey revocation_basepoint_arg_ref;
-       CHECK(revocation_basepoint_arg->arr_len == 33);
-       memcpy(revocation_basepoint_arg_ref.compressed_form, revocation_basepoint_arg->elems, 33); FREE(revocation_basepoint_arg);
+       LDKRevocationBasepoint revocation_basepoint_arg_conv;
+       revocation_basepoint_arg_conv.inner = untag_ptr(revocation_basepoint_arg);
+       revocation_basepoint_arg_conv.is_owned = ptr_is_owned(revocation_basepoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_basepoint_arg_conv);
+       revocation_basepoint_arg_conv = RevocationBasepoint_clone(&revocation_basepoint_arg_conv);
        LDKPublicKey payment_point_arg_ref;
        CHECK(payment_point_arg->arr_len == 33);
        memcpy(payment_point_arg_ref.compressed_form, payment_point_arg->elems, 33); FREE(payment_point_arg);
-       LDKPublicKey delayed_payment_basepoint_arg_ref;
-       CHECK(delayed_payment_basepoint_arg->arr_len == 33);
-       memcpy(delayed_payment_basepoint_arg_ref.compressed_form, delayed_payment_basepoint_arg->elems, 33); FREE(delayed_payment_basepoint_arg);
-       LDKPublicKey htlc_basepoint_arg_ref;
-       CHECK(htlc_basepoint_arg->arr_len == 33);
-       memcpy(htlc_basepoint_arg_ref.compressed_form, htlc_basepoint_arg->elems, 33); FREE(htlc_basepoint_arg);
-       LDKChannelPublicKeys ret_var = ChannelPublicKeys_new(funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_point_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref);
+       LDKDelayedPaymentBasepoint delayed_payment_basepoint_arg_conv;
+       delayed_payment_basepoint_arg_conv.inner = untag_ptr(delayed_payment_basepoint_arg);
+       delayed_payment_basepoint_arg_conv.is_owned = ptr_is_owned(delayed_payment_basepoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(delayed_payment_basepoint_arg_conv);
+       delayed_payment_basepoint_arg_conv = DelayedPaymentBasepoint_clone(&delayed_payment_basepoint_arg_conv);
+       LDKHtlcBasepoint htlc_basepoint_arg_conv;
+       htlc_basepoint_arg_conv.inner = untag_ptr(htlc_basepoint_arg);
+       htlc_basepoint_arg_conv.is_owned = ptr_is_owned(htlc_basepoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_basepoint_arg_conv);
+       htlc_basepoint_arg_conv = HtlcBasepoint_clone(&htlc_basepoint_arg_conv);
+       LDKChannelPublicKeys ret_var = ChannelPublicKeys_new(funding_pubkey_arg_ref, revocation_basepoint_arg_conv, payment_point_arg_ref, delayed_payment_basepoint_arg_conv, htlc_basepoint_arg_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -48277,23 +53560,31 @@ int64_t  CS_LDK_ChannelPublicKeys_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_TxCreationKeys_derive_new(int8_tArray per_commitment_point, int8_tArray broadcaster_delayed_payment_base, int8_tArray broadcaster_htlc_base, int8_tArray countersignatory_revocation_base, int8_tArray countersignatory_htlc_base) {
+int64_t  CS_LDK_TxCreationKeys_derive_new(int8_tArray per_commitment_point, int64_t broadcaster_delayed_payment_base, int64_t broadcaster_htlc_base, int64_t countersignatory_revocation_base, int64_t countersignatory_htlc_base) {
        LDKPublicKey per_commitment_point_ref;
        CHECK(per_commitment_point->arr_len == 33);
        memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
-       LDKPublicKey broadcaster_delayed_payment_base_ref;
-       CHECK(broadcaster_delayed_payment_base->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_base_ref.compressed_form, broadcaster_delayed_payment_base->elems, 33); FREE(broadcaster_delayed_payment_base);
-       LDKPublicKey broadcaster_htlc_base_ref;
-       CHECK(broadcaster_htlc_base->arr_len == 33);
-       memcpy(broadcaster_htlc_base_ref.compressed_form, broadcaster_htlc_base->elems, 33); FREE(broadcaster_htlc_base);
-       LDKPublicKey countersignatory_revocation_base_ref;
-       CHECK(countersignatory_revocation_base->arr_len == 33);
-       memcpy(countersignatory_revocation_base_ref.compressed_form, countersignatory_revocation_base->elems, 33); FREE(countersignatory_revocation_base);
-       LDKPublicKey countersignatory_htlc_base_ref;
-       CHECK(countersignatory_htlc_base->arr_len == 33);
-       memcpy(countersignatory_htlc_base_ref.compressed_form, countersignatory_htlc_base->elems, 33); FREE(countersignatory_htlc_base);
-       LDKTxCreationKeys ret_var = TxCreationKeys_derive_new(per_commitment_point_ref, broadcaster_delayed_payment_base_ref, broadcaster_htlc_base_ref, countersignatory_revocation_base_ref, countersignatory_htlc_base_ref);
+       LDKDelayedPaymentBasepoint broadcaster_delayed_payment_base_conv;
+       broadcaster_delayed_payment_base_conv.inner = untag_ptr(broadcaster_delayed_payment_base);
+       broadcaster_delayed_payment_base_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_base_conv);
+       broadcaster_delayed_payment_base_conv.is_owned = false;
+       LDKHtlcBasepoint broadcaster_htlc_base_conv;
+       broadcaster_htlc_base_conv.inner = untag_ptr(broadcaster_htlc_base);
+       broadcaster_htlc_base_conv.is_owned = ptr_is_owned(broadcaster_htlc_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_htlc_base_conv);
+       broadcaster_htlc_base_conv.is_owned = false;
+       LDKRevocationBasepoint countersignatory_revocation_base_conv;
+       countersignatory_revocation_base_conv.inner = untag_ptr(countersignatory_revocation_base);
+       countersignatory_revocation_base_conv.is_owned = ptr_is_owned(countersignatory_revocation_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_revocation_base_conv);
+       countersignatory_revocation_base_conv.is_owned = false;
+       LDKHtlcBasepoint countersignatory_htlc_base_conv;
+       countersignatory_htlc_base_conv.inner = untag_ptr(countersignatory_htlc_base);
+       countersignatory_htlc_base_conv.is_owned = ptr_is_owned(countersignatory_htlc_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_htlc_base_conv);
+       countersignatory_htlc_base_conv.is_owned = false;
+       LDKTxCreationKeys ret_var = TxCreationKeys_derive_new(per_commitment_point_ref, &broadcaster_delayed_payment_base_conv, &broadcaster_htlc_base_conv, &countersignatory_revocation_base_conv, &countersignatory_htlc_base_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -48321,14 +53612,18 @@ int64_t  CS_LDK_TxCreationKeys_from_channel_static_keys(int8_tArray per_commitme
        return ret_ref;
 }
 
-int8_tArray  CS_LDK_get_revokeable_redeemscript(int8_tArray revocation_key, int16_t contest_delay, int8_tArray broadcaster_delayed_payment_key) {
-       LDKPublicKey revocation_key_ref;
-       CHECK(revocation_key->arr_len == 33);
-       memcpy(revocation_key_ref.compressed_form, revocation_key->elems, 33); FREE(revocation_key);
-       LDKPublicKey broadcaster_delayed_payment_key_ref;
-       CHECK(broadcaster_delayed_payment_key->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_key_ref.compressed_form, broadcaster_delayed_payment_key->elems, 33); FREE(broadcaster_delayed_payment_key);
-       LDKCVec_u8Z ret_var = get_revokeable_redeemscript(revocation_key_ref, contest_delay, broadcaster_delayed_payment_key_ref);
+int8_tArray  CS_LDK_get_revokeable_redeemscript(int64_t revocation_key, int16_t contest_delay, int64_t broadcaster_delayed_payment_key) {
+       LDKRevocationKey revocation_key_conv;
+       revocation_key_conv.inner = untag_ptr(revocation_key);
+       revocation_key_conv.is_owned = ptr_is_owned(revocation_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_key_conv);
+       revocation_key_conv.is_owned = false;
+       LDKDelayedPaymentKey broadcaster_delayed_payment_key_conv;
+       broadcaster_delayed_payment_key_conv.inner = untag_ptr(broadcaster_delayed_payment_key);
+       broadcaster_delayed_payment_key_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_key_conv);
+       broadcaster_delayed_payment_key_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = get_revokeable_redeemscript(&revocation_key_conv, contest_delay, &broadcaster_delayed_payment_key_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
        CVec_u8Z_free(ret_var);
@@ -48584,7 +53879,7 @@ int8_tArray  CS_LDK_make_funding_redeemscript(int8_tArray broadcaster, int8_tArr
        return ret_arr;
 }
 
-int8_tArray  CS_LDK_build_htlc_transaction(int8_tArray commitment_txid, int32_t feerate_per_kw, int16_t contest_delay, int64_t htlc, int64_t channel_type_features, int8_tArray broadcaster_delayed_payment_key, int8_tArray revocation_key) {
+int8_tArray  CS_LDK_build_htlc_transaction(int8_tArray commitment_txid, int32_t feerate_per_kw, int16_t contest_delay, int64_t htlc, int64_t channel_type_features, int64_t broadcaster_delayed_payment_key, int64_t revocation_key) {
        uint8_t commitment_txid_arr[32];
        CHECK(commitment_txid->arr_len == 32);
        memcpy(commitment_txid_arr, commitment_txid->elems, 32); FREE(commitment_txid);
@@ -48599,13 +53894,17 @@ int8_tArray  CS_LDK_build_htlc_transaction(int8_tArray commitment_txid, int32_t
        channel_type_features_conv.is_owned = ptr_is_owned(channel_type_features);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_features_conv);
        channel_type_features_conv.is_owned = false;
-       LDKPublicKey broadcaster_delayed_payment_key_ref;
-       CHECK(broadcaster_delayed_payment_key->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_key_ref.compressed_form, broadcaster_delayed_payment_key->elems, 33); FREE(broadcaster_delayed_payment_key);
-       LDKPublicKey revocation_key_ref;
-       CHECK(revocation_key->arr_len == 33);
-       memcpy(revocation_key_ref.compressed_form, revocation_key->elems, 33); FREE(revocation_key);
-       LDKTransaction ret_var = build_htlc_transaction(commitment_txid_ref, feerate_per_kw, contest_delay, &htlc_conv, &channel_type_features_conv, broadcaster_delayed_payment_key_ref, revocation_key_ref);
+       LDKDelayedPaymentKey broadcaster_delayed_payment_key_conv;
+       broadcaster_delayed_payment_key_conv.inner = untag_ptr(broadcaster_delayed_payment_key);
+       broadcaster_delayed_payment_key_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_key_conv);
+       broadcaster_delayed_payment_key_conv.is_owned = false;
+       LDKRevocationKey revocation_key_conv;
+       revocation_key_conv.inner = untag_ptr(revocation_key);
+       revocation_key_conv.is_owned = ptr_is_owned(revocation_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_key_conv);
+       revocation_key_conv.is_owned = false;
+       LDKTransaction ret_var = build_htlc_transaction(commitment_txid_ref, feerate_per_kw, contest_delay, &htlc_conv, &channel_type_features_conv, &broadcaster_delayed_payment_key_conv, &revocation_key_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
        Transaction_free(ret_var);
@@ -50431,6 +55730,96 @@ int64_t  CS_LDK_ChannelTypeFeatures_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_InitFeatures_hash(int64_t o) {
+       LDKInitFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = InitFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeFeatures_hash(int64_t o) {
+       LDKNodeFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = NodeFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelFeatures_hash(int64_t o) {
+       LDKChannelFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_hash(int64_t o) {
+       LDKBolt11InvoiceFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Bolt11InvoiceFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OfferFeatures_hash(int64_t o) {
+       LDKOfferFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OfferFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_hash(int64_t o) {
+       LDKInvoiceRequestFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = InvoiceRequestFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_hash(int64_t o) {
+       LDKBolt12InvoiceFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Bolt12InvoiceFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_hash(int64_t o) {
+       LDKBlindedHopFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = BlindedHopFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_hash(int64_t o) {
+       LDKChannelTypeFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelTypeFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_InitFeatures_free(int64_t this_obj) {
        LDKInitFeatures this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -52411,6 +57800,82 @@ jboolean  CS_LDK_ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(int64_t t
        return ret_conv;
 }
 
+void  CS_LDK_InitFeatures_set_route_blinding_optional(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       InitFeatures_set_route_blinding_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_route_blinding_required(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       InitFeatures_set_route_blinding_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_route_blinding(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = InitFeatures_supports_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_route_blinding_optional(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       NodeFeatures_set_route_blinding_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_route_blinding_required(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       NodeFeatures_set_route_blinding_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_route_blinding(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = NodeFeatures_supports_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_route_blinding(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = InitFeatures_requires_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_route_blinding(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = NodeFeatures_requires_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_InitFeatures_set_shutdown_any_segwit_optional(int64_t this_arg) {
        LDKInitFeatures this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -53124,9 +58589,10 @@ int8_tArray  CS_LDK_InvalidShutdownScript_get_script(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = InvalidShutdownScript_get_script(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = InvalidShutdownScript_get_script(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -53232,14 +58698,13 @@ int64_t  CS_LDK_ShutdownScript_new_p2wsh(int8_tArray script_hash) {
        return ret_ref;
 }
 
-int64_t  CS_LDK_ShutdownScript_new_witness_program(int8_t version, int8_tArray program) {
-       
-       LDKu8slice program_ref;
-       program_ref.datalen = program->arr_len;
-       program_ref.data = program->elems;
+int64_t  CS_LDK_ShutdownScript_new_witness_program(int64_t witness_program) {
+       void* witness_program_ptr = untag_ptr(witness_program);
+       CHECK_ACCESS(witness_program_ptr);
+       LDKWitnessProgram witness_program_conv = *(LDKWitnessProgram*)(witness_program_ptr);
+       witness_program_conv = WitnessProgram_clone((LDKWitnessProgram*)untag_ptr(witness_program));
        LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
-       *ret_conv = ShutdownScript_new_witness_program((LDKWitnessVersion){ ._0 = version }, program_ref);
-       FREE(program);
+       *ret_conv = ShutdownScript_new_witness_program(witness_program_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -54004,6 +59469,16 @@ jboolean  CS_LDK_Offer_is_expired(int64_t this_arg) {
        return ret_conv;
 }
 
+jboolean  CS_LDK_Offer_is_expired_no_std(int64_t this_arg, int64_t duration_since_epoch) {
+       LDKOffer this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = Offer_is_expired_no_std(&this_arg_conv, duration_since_epoch);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Offer_is_valid_quantity(int64_t this_arg, int64_t quantity) {
        LDKOffer this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -56101,6 +61576,70 @@ void  CS_LDK_TaggedHash_free(int64_t this_obj) {
        TaggedHash_free(this_obj_conv);
 }
 
+static inline uint64_t TaggedHash_clone_ptr(LDKTaggedHash *NONNULL_PTR arg) {
+       LDKTaggedHash ret_var = TaggedHash_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_TaggedHash_clone_ptr(int64_t arg) {
+       LDKTaggedHash arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = TaggedHash_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TaggedHash_clone(int64_t orig) {
+       LDKTaggedHash orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKTaggedHash ret_var = TaggedHash_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_TaggedHash_as_digest(int64_t this_arg) {
+       LDKTaggedHash this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *TaggedHash_as_digest(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+jstring  CS_LDK_TaggedHash_tag(int64_t this_arg) {
+       LDKTaggedHash this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKStr ret_str = TaggedHash_tag(&this_arg_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_TaggedHash_merkle_root(int64_t this_arg) {
+       LDKTaggedHash this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, TaggedHash_merkle_root(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
 void  CS_LDK_Bolt12ParseError_free(int64_t this_obj) {
        LDKBolt12ParseError this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -56353,6 +61892,16 @@ jboolean  CS_LDK_Refund_is_expired(int64_t this_arg) {
        return ret_conv;
 }
 
+jboolean  CS_LDK_Refund_is_expired_no_std(int64_t this_arg, int64_t duration_since_epoch) {
+       LDKRefund this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = Refund_is_expired_no_std(&this_arg_conv, duration_since_epoch);
+       return ret_conv;
+}
+
 int64_t  CS_LDK_Refund_issuer(int64_t this_arg) {
        LDKRefund this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -56713,6 +62262,17 @@ int8_tArray  CS_LDK_NodeId_as_slice(int64_t this_arg) {
        return ret_arr;
 }
 
+int8_tArray  CS_LDK_NodeId_as_array(int64_t this_arg) {
+       LDKNodeId this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, *NodeId_as_array(&this_arg_conv), 33);
+       return ret_arr;
+}
+
 int64_t  CS_LDK_NodeId_as_pubkey(int64_t this_arg) {
        LDKNodeId this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -57551,16 +63111,6 @@ int64_t  CS_LDK_DirectedChannelInfo_channel(int64_t this_arg) {
        return ret_ref;
 }
 
-int64_t  CS_LDK_DirectedChannelInfo_htlc_maximum_msat(int64_t this_arg) {
-       LDKDirectedChannelInfo this_arg_conv;
-       this_arg_conv.inner = untag_ptr(this_arg);
-       this_arg_conv.is_owned = ptr_is_owned(this_arg);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
-       this_arg_conv.is_owned = false;
-       int64_t ret_conv = DirectedChannelInfo_htlc_maximum_msat(&this_arg_conv);
-       return ret_conv;
-}
-
 int64_t  CS_LDK_DirectedChannelInfo_effective_capacity(int64_t this_arg) {
        LDKDirectedChannelInfo this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -58100,6 +63650,16 @@ int64_t  CS_LDK_NodeAlias_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_NodeAlias_hash(int64_t o) {
+       LDKNodeAlias o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = NodeAlias_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_NodeAlias_eq(int64_t a, int64_t b) {
        LDKNodeAlias a_conv;
        a_conv.inner = untag_ptr(a);
@@ -58692,7 +64252,7 @@ void  CS_LDK_DefaultRouter_free(int64_t this_obj) {
        DefaultRouter_free(this_obj_conv);
 }
 
-int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int8_tArray random_seed_bytes, int64_t scorer, int64_t score_params) {
+int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int64_t entropy_source, int64_t scorer, int64_t score_params) {
        LDKNetworkGraph network_graph_conv;
        network_graph_conv.inner = untag_ptr(network_graph);
        network_graph_conv.is_owned = ptr_is_owned(network_graph);
@@ -58705,9 +64265,13 @@ int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int8_tA
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_cloned(&logger_conv);
        }
-       LDKThirtyTwoBytes random_seed_bytes_ref;
-       CHECK(random_seed_bytes->arr_len == 32);
-       memcpy(random_seed_bytes_ref.data, random_seed_bytes->elems, 32); FREE(random_seed_bytes);
+       void* entropy_source_ptr = untag_ptr(entropy_source);
+       CHECK_ACCESS(entropy_source_ptr);
+       LDKEntropySource entropy_source_conv = *(LDKEntropySource*)(entropy_source_ptr);
+       if (entropy_source_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&entropy_source_conv);
+       }
        void* scorer_ptr = untag_ptr(scorer);
        CHECK_ACCESS(scorer_ptr);
        LDKLockableScore scorer_conv = *(LDKLockableScore*)(scorer_ptr);
@@ -58720,7 +64284,7 @@ int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int8_tA
        score_params_conv.is_owned = ptr_is_owned(score_params);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(score_params_conv);
        score_params_conv = ProbabilisticScoringFeeParameters_clone(&score_params_conv);
-       LDKDefaultRouter ret_var = DefaultRouter_new(&network_graph_conv, logger_conv, random_seed_bytes_ref, scorer_conv, score_params_conv);
+       LDKDefaultRouter ret_var = DefaultRouter_new(&network_graph_conv, logger_conv, entropy_source_conv, scorer_conv, score_params_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -58738,6 +64302,17 @@ int64_t  CS_LDK_DefaultRouter_as_Router(int64_t this_arg) {
        return tag_ptr(ret_ret, true);
 }
 
+int64_t  CS_LDK_DefaultRouter_as_MessageRouter(int64_t this_arg) {
+       LDKDefaultRouter this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKMessageRouter* ret_ret = MALLOC(sizeof(LDKMessageRouter), "LDKMessageRouter");
+       *ret_ret = DefaultRouter_as_MessageRouter(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
 void  CS_LDK_Router_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -60149,7 +65724,47 @@ void  CS_LDK_PaymentParameters_set_previously_failed_channels(int64_t this_ptr,
        PaymentParameters_set_previously_failed_channels(&this_ptr_conv, val_constr);
 }
 
-int64_t  CS_LDK_PaymentParameters_new(int64_t payee_arg, int64_t expiry_time_arg, int32_t max_total_cltv_expiry_delta_arg, int8_t max_path_count_arg, int8_t max_channel_saturation_power_of_half_arg, int64_tArray previously_failed_channels_arg) {
+int64_tArray  CS_LDK_PaymentParameters_get_previously_failed_blinded_path_idxs(int64_t this_ptr) {
+       LDKPaymentParameters this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u64Z ret_var = PaymentParameters_get_previously_failed_blinded_path_idxs(&this_ptr_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t g = 0; g < ret_var.datalen; g++) {
+               int64_t ret_conv_6_conv = ret_var.data[g];
+               ret_arr_ptr[g] = ret_conv_6_conv;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_PaymentParameters_set_previously_failed_blinded_path_idxs(int64_t this_ptr, int64_tArray val) {
+       LDKPaymentParameters this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u64Z val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t g = 0; g < val_constr.datalen; g++) {
+               int64_t val_conv_6 = val_vals[g];
+               val_constr.data[g] = val_conv_6;
+       }
+       FREE(val);
+       PaymentParameters_set_previously_failed_blinded_path_idxs(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_PaymentParameters_new(int64_t payee_arg, int64_t expiry_time_arg, int32_t max_total_cltv_expiry_delta_arg, int8_t max_path_count_arg, int8_t max_channel_saturation_power_of_half_arg, int64_tArray previously_failed_channels_arg, int64_tArray previously_failed_blinded_path_idxs_arg) {
        void* payee_arg_ptr = untag_ptr(payee_arg);
        CHECK_ACCESS(payee_arg_ptr);
        LDKPayee payee_arg_conv = *(LDKPayee*)(payee_arg_ptr);
@@ -60170,7 +65785,19 @@ int64_t  CS_LDK_PaymentParameters_new(int64_t payee_arg, int64_t expiry_time_arg
                previously_failed_channels_arg_constr.data[g] = previously_failed_channels_arg_conv_6;
        }
        FREE(previously_failed_channels_arg);
-       LDKPaymentParameters ret_var = PaymentParameters_new(payee_arg_conv, expiry_time_arg_conv, max_total_cltv_expiry_delta_arg, max_path_count_arg, max_channel_saturation_power_of_half_arg, previously_failed_channels_arg_constr);
+       LDKCVec_u64Z previously_failed_blinded_path_idxs_arg_constr;
+       previously_failed_blinded_path_idxs_arg_constr.datalen = previously_failed_blinded_path_idxs_arg->arr_len;
+       if (previously_failed_blinded_path_idxs_arg_constr.datalen > 0)
+               previously_failed_blinded_path_idxs_arg_constr.data = MALLOC(previously_failed_blinded_path_idxs_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               previously_failed_blinded_path_idxs_arg_constr.data = NULL;
+       int64_t* previously_failed_blinded_path_idxs_arg_vals = previously_failed_blinded_path_idxs_arg->elems;
+       for (size_t g = 0; g < previously_failed_blinded_path_idxs_arg_constr.datalen; g++) {
+               int64_t previously_failed_blinded_path_idxs_arg_conv_6 = previously_failed_blinded_path_idxs_arg_vals[g];
+               previously_failed_blinded_path_idxs_arg_constr.data[g] = previously_failed_blinded_path_idxs_arg_conv_6;
+       }
+       FREE(previously_failed_blinded_path_idxs_arg);
+       LDKPaymentParameters ret_var = PaymentParameters_new(payee_arg_conv, expiry_time_arg_conv, max_total_cltv_expiry_delta_arg, max_path_count_arg, max_channel_saturation_power_of_half_arg, previously_failed_channels_arg_constr, previously_failed_blinded_path_idxs_arg_constr);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -60823,6 +66450,351 @@ int64_t  CS_LDK_RouteHintHop_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_FirstHopCandidate_free(int64_t this_obj) {
+       LDKFirstHopCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       FirstHopCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t FirstHopCandidate_clone_ptr(LDKFirstHopCandidate *NONNULL_PTR arg) {
+       LDKFirstHopCandidate ret_var = FirstHopCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_FirstHopCandidate_clone_ptr(int64_t arg) {
+       LDKFirstHopCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = FirstHopCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FirstHopCandidate_clone(int64_t orig) {
+       LDKFirstHopCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKFirstHopCandidate ret_var = FirstHopCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_PublicHopCandidate_free(int64_t this_obj) {
+       LDKPublicHopCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       PublicHopCandidate_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PublicHopCandidate_get_short_channel_id(int64_t this_ptr) {
+       LDKPublicHopCandidate this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = PublicHopCandidate_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PublicHopCandidate_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKPublicHopCandidate this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       PublicHopCandidate_set_short_channel_id(&this_ptr_conv, val);
+}
+
+static inline uint64_t PublicHopCandidate_clone_ptr(LDKPublicHopCandidate *NONNULL_PTR arg) {
+       LDKPublicHopCandidate ret_var = PublicHopCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_PublicHopCandidate_clone_ptr(int64_t arg) {
+       LDKPublicHopCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = PublicHopCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PublicHopCandidate_clone(int64_t orig) {
+       LDKPublicHopCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKPublicHopCandidate ret_var = PublicHopCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_PrivateHopCandidate_free(int64_t this_obj) {
+       LDKPrivateHopCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       PrivateHopCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t PrivateHopCandidate_clone_ptr(LDKPrivateHopCandidate *NONNULL_PTR arg) {
+       LDKPrivateHopCandidate ret_var = PrivateHopCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_PrivateHopCandidate_clone_ptr(int64_t arg) {
+       LDKPrivateHopCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = PrivateHopCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PrivateHopCandidate_clone(int64_t orig) {
+       LDKPrivateHopCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKPrivateHopCandidate ret_var = PrivateHopCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_BlindedPathCandidate_free(int64_t this_obj) {
+       LDKBlindedPathCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       BlindedPathCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t BlindedPathCandidate_clone_ptr(LDKBlindedPathCandidate *NONNULL_PTR arg) {
+       LDKBlindedPathCandidate ret_var = BlindedPathCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_BlindedPathCandidate_clone_ptr(int64_t arg) {
+       LDKBlindedPathCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = BlindedPathCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPathCandidate_clone(int64_t orig) {
+       LDKBlindedPathCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKBlindedPathCandidate ret_var = BlindedPathCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_OneHopBlindedPathCandidate_free(int64_t this_obj) {
+       LDKOneHopBlindedPathCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       OneHopBlindedPathCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t OneHopBlindedPathCandidate_clone_ptr(LDKOneHopBlindedPathCandidate *NONNULL_PTR arg) {
+       LDKOneHopBlindedPathCandidate ret_var = OneHopBlindedPathCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_OneHopBlindedPathCandidate_clone_ptr(int64_t arg) {
+       LDKOneHopBlindedPathCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = OneHopBlindedPathCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OneHopBlindedPathCandidate_clone(int64_t orig) {
+       LDKOneHopBlindedPathCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKOneHopBlindedPathCandidate ret_var = OneHopBlindedPathCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_CandidateRouteHop_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKCandidateRouteHop this_ptr_conv = *(LDKCandidateRouteHop*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CandidateRouteHop_free(this_ptr_conv);
+}
+
+static inline uint64_t CandidateRouteHop_clone_ptr(LDKCandidateRouteHop *NONNULL_PTR arg) {
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_CandidateRouteHop_clone_ptr(int64_t arg) {
+       LDKCandidateRouteHop* arg_conv = (LDKCandidateRouteHop*)untag_ptr(arg);
+       int64_t ret_conv = CandidateRouteHop_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_clone(int64_t orig) {
+       LDKCandidateRouteHop* orig_conv = (LDKCandidateRouteHop*)untag_ptr(orig);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_first_hop(int64_t a) {
+       LDKFirstHopCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = FirstHopCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_first_hop(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_public_hop(int64_t a) {
+       LDKPublicHopCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = PublicHopCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_public_hop(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_private_hop(int64_t a) {
+       LDKPrivateHopCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = PrivateHopCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_private_hop(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_blinded(int64_t a) {
+       LDKBlindedPathCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = BlindedPathCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_blinded(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_one_hop_blinded(int64_t a) {
+       LDKOneHopBlindedPathCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = OneHopBlindedPathCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_one_hop_blinded(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_globally_unique_short_channel_id(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = CandidateRouteHop_globally_unique_short_channel_id(this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_CandidateRouteHop_cltv_expiry_delta(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       int32_t ret_conv = CandidateRouteHop_cltv_expiry_delta(this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_htlc_minimum_msat(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       int64_t ret_conv = CandidateRouteHop_htlc_minimum_msat(this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_fees(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKRoutingFees ret_var = CandidateRouteHop_fees(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_source(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKNodeId ret_var = CandidateRouteHop_source(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_target(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKNodeId ret_var = CandidateRouteHop_target(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 int64_t  CS_LDK_find_route(int8_tArray our_node_pubkey, int64_t route_params, int64_t network_graph, int64_tArray first_hops, int64_t logger, int64_t scorer, int64_t score_params, int8_tArray random_seed_bytes) {
        LDKPublicKey our_node_pubkey_ref;
        CHECK(our_node_pubkey->arr_len == 33);
@@ -61958,27 +67930,31 @@ void  CS_LDK_DelayedPaymentOutputDescriptor_set_output(int64_t this_ptr, int64_t
        DelayedPaymentOutputDescriptor_set_output(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_revocation_pubkey(int64_t this_ptr) {
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_revocation_pubkey(int64_t this_ptr) {
        LDKDelayedPaymentOutputDescriptor this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, DelayedPaymentOutputDescriptor_get_revocation_pubkey(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKRevocationKey ret_var = DelayedPaymentOutputDescriptor_get_revocation_pubkey(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey(int64_t this_ptr, int64_t val) {
        LDKDelayedPaymentOutputDescriptor this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       DelayedPaymentOutputDescriptor_set_revocation_pubkey(&this_ptr_conv, val_ref);
+       LDKRevocationKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = RevocationKey_clone(&val_conv);
+       DelayedPaymentOutputDescriptor_set_revocation_pubkey(&this_ptr_conv, val_conv);
 }
 
 int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_channel_keys_id(int64_t this_ptr) {
@@ -62023,7 +67999,7 @@ void  CS_LDK_DelayedPaymentOutputDescriptor_set_channel_value_satoshis(int64_t t
        DelayedPaymentOutputDescriptor_set_channel_value_satoshis(&this_ptr_conv, val);
 }
 
-int64_t  CS_LDK_DelayedPaymentOutputDescriptor_new(int64_t outpoint_arg, int8_tArray per_commitment_point_arg, int16_t to_self_delay_arg, int64_t output_arg, int8_tArray revocation_pubkey_arg, int8_tArray channel_keys_id_arg, int64_t channel_value_satoshis_arg) {
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_new(int64_t outpoint_arg, int8_tArray per_commitment_point_arg, int16_t to_self_delay_arg, int64_t output_arg, int64_t revocation_pubkey_arg, int8_tArray channel_keys_id_arg, int64_t channel_value_satoshis_arg) {
        LDKOutPoint outpoint_arg_conv;
        outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
        outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
@@ -62036,13 +68012,15 @@ int64_t  CS_LDK_DelayedPaymentOutputDescriptor_new(int64_t outpoint_arg, int8_tA
        CHECK_ACCESS(output_arg_ptr);
        LDKTxOut output_arg_conv = *(LDKTxOut*)(output_arg_ptr);
        output_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(output_arg));
-       LDKPublicKey revocation_pubkey_arg_ref;
-       CHECK(revocation_pubkey_arg->arr_len == 33);
-       memcpy(revocation_pubkey_arg_ref.compressed_form, revocation_pubkey_arg->elems, 33); FREE(revocation_pubkey_arg);
+       LDKRevocationKey revocation_pubkey_arg_conv;
+       revocation_pubkey_arg_conv.inner = untag_ptr(revocation_pubkey_arg);
+       revocation_pubkey_arg_conv.is_owned = ptr_is_owned(revocation_pubkey_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_pubkey_arg_conv);
+       revocation_pubkey_arg_conv = RevocationKey_clone(&revocation_pubkey_arg_conv);
        LDKThirtyTwoBytes channel_keys_id_arg_ref;
        CHECK(channel_keys_id_arg->arr_len == 32);
        memcpy(channel_keys_id_arg_ref.data, channel_keys_id_arg->elems, 32); FREE(channel_keys_id_arg);
-       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_new(outpoint_arg_conv, per_commitment_point_arg_ref, to_self_delay_arg, output_arg_conv, revocation_pubkey_arg_ref, channel_keys_id_arg_ref, channel_value_satoshis_arg);
+       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_new(outpoint_arg_conv, per_commitment_point_arg_ref, to_self_delay_arg, output_arg_conv, revocation_pubkey_arg_conv, channel_keys_id_arg_ref, channel_value_satoshis_arg);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -62409,7 +68387,7 @@ int64_t  CS_LDK_SpendableOutputDescriptor_clone(int64_t orig) {
        return ret_ref;
 }
 
-int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_t output) {
+int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_t output, int8_tArray channel_keys_id) {
        LDKOutPoint outpoint_conv;
        outpoint_conv.inner = untag_ptr(outpoint);
        outpoint_conv.is_owned = ptr_is_owned(outpoint);
@@ -62419,8 +68397,11 @@ int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_
        CHECK_ACCESS(output_ptr);
        LDKTxOut output_conv = *(LDKTxOut*)(output_ptr);
        output_conv = TxOut_clone((LDKTxOut*)untag_ptr(output));
+       LDKThirtyTwoBytes channel_keys_id_ref;
+       CHECK(channel_keys_id->arr_len == 32);
+       memcpy(channel_keys_id_ref.data, channel_keys_id->elems, 32); FREE(channel_keys_id);
        LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
-       *ret_copy = SpendableOutputDescriptor_static_output(outpoint_conv, output_conv);
+       *ret_copy = SpendableOutputDescriptor_static_output(outpoint_conv, output_conv, channel_keys_id_ref);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -62522,7 +68503,7 @@ int64_t  CS_LDK_SpendableOutputDescriptor_create_spendable_outputs_psbt(int64_tA
        CHECK_ACCESS(locktime_ptr);
        LDKCOption_u32Z locktime_conv = *(LDKCOption_u32Z*)(locktime_ptr);
        locktime_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(locktime));
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
        *ret_conv = SpendableOutputDescriptor_create_spendable_outputs_psbt(descriptors_constr, outputs_constr, change_destination_script_ref, feerate_sat_per_1000_weight, locktime_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -63029,46 +69010,6 @@ void  CS_LDK_ChannelSigner_free(int64_t this_ptr) {
        ChannelSigner_free(this_ptr_conv);
 }
 
-void  CS_LDK_EcdsaChannelSigner_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKEcdsaChannelSigner this_ptr_conv = *(LDKEcdsaChannelSigner*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       EcdsaChannelSigner_free(this_ptr_conv);
-}
-
-static inline uint64_t WriteableEcdsaChannelSigner_clone_ptr(LDKWriteableEcdsaChannelSigner *NONNULL_PTR arg) {
-       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
-       *ret_ret = WriteableEcdsaChannelSigner_clone(arg);
-       return tag_ptr(ret_ret, true);
-}
-int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone_ptr(int64_t arg) {
-       void* arg_ptr = untag_ptr(arg);
-       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
-       LDKWriteableEcdsaChannelSigner* arg_conv = (LDKWriteableEcdsaChannelSigner*)arg_ptr;
-       int64_t ret_conv = WriteableEcdsaChannelSigner_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone(int64_t orig) {
-       void* orig_ptr = untag_ptr(orig);
-       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
-       LDKWriteableEcdsaChannelSigner* orig_conv = (LDKWriteableEcdsaChannelSigner*)orig_ptr;
-       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
-       *ret_ret = WriteableEcdsaChannelSigner_clone(orig_conv);
-       return tag_ptr(ret_ret, true);
-}
-
-void  CS_LDK_WriteableEcdsaChannelSigner_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKWriteableEcdsaChannelSigner this_ptr_conv = *(LDKWriteableEcdsaChannelSigner*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       WriteableEcdsaChannelSigner_free(this_ptr_conv);
-}
-
 int32_t  CS_LDK_Recipient_clone(int64_t orig) {
        LDKRecipient* orig_conv = (LDKRecipient*)untag_ptr(orig);
        int32_t ret_conv = LDKRecipient_to_cs(Recipient_clone(orig_conv));
@@ -63424,7 +69365,7 @@ int64_t  CS_LDK_InMemorySigner_sign_counterparty_payment_input(int64_t this_arg,
        descriptor_conv.is_owned = ptr_is_owned(descriptor);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(descriptor_conv);
        descriptor_conv.is_owned = false;
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
        *ret_conv = InMemorySigner_sign_counterparty_payment_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -63445,7 +69386,7 @@ int64_t  CS_LDK_InMemorySigner_sign_dynamic_p2wsh_input(int64_t this_arg, int8_t
        descriptor_conv.is_owned = ptr_is_owned(descriptor);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(descriptor_conv);
        descriptor_conv.is_owned = false;
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
        *ret_conv = InMemorySigner_sign_dynamic_p2wsh_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -63834,6 +69775,46 @@ int8_tArray  CS_LDK_PhantomKeysManager_get_phantom_node_secret_key(int64_t this_
        return ret_arr;
 }
 
+void  CS_LDK_EcdsaChannelSigner_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKEcdsaChannelSigner this_ptr_conv = *(LDKEcdsaChannelSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EcdsaChannelSigner_free(this_ptr_conv);
+}
+
+static inline uint64_t WriteableEcdsaChannelSigner_clone_ptr(LDKWriteableEcdsaChannelSigner *NONNULL_PTR arg) {
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = WriteableEcdsaChannelSigner_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKWriteableEcdsaChannelSigner* arg_conv = (LDKWriteableEcdsaChannelSigner*)arg_ptr;
+       int64_t ret_conv = WriteableEcdsaChannelSigner_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKWriteableEcdsaChannelSigner* orig_conv = (LDKWriteableEcdsaChannelSigner*)orig_ptr;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = WriteableEcdsaChannelSigner_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_WriteableEcdsaChannelSigner_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKWriteableEcdsaChannelSigner this_ptr_conv = *(LDKWriteableEcdsaChannelSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       WriteableEcdsaChannelSigner_free(this_ptr_conv);
+}
+
 void  CS_LDK_OnionMessenger_free(int64_t this_obj) {
        LDKOnionMessenger this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -63859,8 +69840,20 @@ void  CS_LDK_DefaultMessageRouter_free(int64_t this_obj) {
        DefaultMessageRouter_free(this_obj_conv);
 }
 
-int64_t  CS_LDK_DefaultMessageRouter_new() {
-       LDKDefaultMessageRouter ret_var = DefaultMessageRouter_new();
+int64_t  CS_LDK_DefaultMessageRouter_new(int64_t network_graph, int64_t entropy_source) {
+       LDKNetworkGraph network_graph_conv;
+       network_graph_conv.inner = untag_ptr(network_graph);
+       network_graph_conv.is_owned = ptr_is_owned(network_graph);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(network_graph_conv);
+       network_graph_conv.is_owned = false;
+       void* entropy_source_ptr = untag_ptr(entropy_source);
+       CHECK_ACCESS(entropy_source_ptr);
+       LDKEntropySource entropy_source_conv = *(LDKEntropySource*)(entropy_source_ptr);
+       if (entropy_source_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&entropy_source_conv);
+       }
+       LDKDefaultMessageRouter ret_var = DefaultMessageRouter_new(&network_graph_conv, entropy_source_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -63955,7 +69948,32 @@ void  CS_LDK_OnionMessagePath_set_destination(int64_t this_ptr, int64_t val) {
        OnionMessagePath_set_destination(&this_ptr_conv, val_conv);
 }
 
-int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t destination_arg) {
+int64_t  CS_LDK_OnionMessagePath_get_first_node_addresses(int64_t this_ptr) {
+       LDKOnionMessagePath this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = OnionMessagePath_get_first_node_addresses(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OnionMessagePath_set_first_node_addresses(int64_t this_ptr, int64_t val) {
+       LDKOnionMessagePath this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_CVec_SocketAddressZZ val_conv = *(LDKCOption_CVec_SocketAddressZZ*)(val_ptr);
+       val_conv = COption_CVec_SocketAddressZZ_clone((LDKCOption_CVec_SocketAddressZZ*)untag_ptr(val));
+       OnionMessagePath_set_first_node_addresses(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t destination_arg, int64_t first_node_addresses_arg) {
        LDKCVec_PublicKeyZ intermediate_nodes_arg_constr;
        intermediate_nodes_arg_constr.datalen = intermediate_nodes_arg->arr_len;
        if (intermediate_nodes_arg_constr.datalen > 0)
@@ -63975,7 +69993,10 @@ int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t de
        CHECK_ACCESS(destination_arg_ptr);
        LDKDestination destination_arg_conv = *(LDKDestination*)(destination_arg_ptr);
        destination_arg_conv = Destination_clone((LDKDestination*)untag_ptr(destination_arg));
-       LDKOnionMessagePath ret_var = OnionMessagePath_new(intermediate_nodes_arg_constr, destination_arg_conv);
+       void* first_node_addresses_arg_ptr = untag_ptr(first_node_addresses_arg);
+       CHECK_ACCESS(first_node_addresses_arg_ptr);
+       LDKCOption_CVec_SocketAddressZZ first_node_addresses_arg_conv = *(LDKCOption_CVec_SocketAddressZZ*)(first_node_addresses_arg_ptr);
+       LDKOnionMessagePath ret_var = OnionMessagePath_new(intermediate_nodes_arg_constr, destination_arg_conv, first_node_addresses_arg_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -64012,6 +70033,17 @@ int64_t  CS_LDK_OnionMessagePath_clone(int64_t orig) {
        return ret_ref;
 }
 
+int8_tArray  CS_LDK_OnionMessagePath_first_node(int64_t this_arg) {
+       LDKOnionMessagePath this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, OnionMessagePath_first_node(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
 void  CS_LDK_Destination_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -64063,6 +70095,59 @@ int64_t  CS_LDK_Destination_blinded_path(int64_t a) {
        return ret_ref;
 }
 
+void  CS_LDK_SendSuccess_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKSendSuccess this_ptr_conv = *(LDKSendSuccess*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SendSuccess_free(this_ptr_conv);
+}
+
+static inline uint64_t SendSuccess_clone_ptr(LDKSendSuccess *NONNULL_PTR arg) {
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SendSuccess_clone_ptr(int64_t arg) {
+       LDKSendSuccess* arg_conv = (LDKSendSuccess*)untag_ptr(arg);
+       int64_t ret_conv = SendSuccess_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SendSuccess_clone(int64_t orig) {
+       LDKSendSuccess* orig_conv = (LDKSendSuccess*)untag_ptr(orig);
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendSuccess_buffered() {
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_buffered();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendSuccess_buffered_awaiting_connection(int8_tArray a) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_buffered_awaiting_connection(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SendSuccess_eq(int64_t a, int64_t b) {
+       LDKSendSuccess* a_conv = (LDKSendSuccess*)untag_ptr(a);
+       LDKSendSuccess* b_conv = (LDKSendSuccess*)untag_ptr(b);
+       jboolean ret_conv = SendSuccess_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_SendError_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -64114,9 +70199,19 @@ int64_t  CS_LDK_SendError_too_few_blinded_hops() {
        return ret_ref;
 }
 
-int64_t  CS_LDK_SendError_invalid_first_hop() {
+int64_t  CS_LDK_SendError_invalid_first_hop(int8_tArray a) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_invalid_first_hop(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_path_not_found() {
        LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
-       *ret_copy = SendError_invalid_first_hop();
+       *ret_copy = SendError_path_not_found();
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -64252,7 +70347,7 @@ int64_t  CS_LDK_create_onion_message(int64_t entropy_source, int64_t node_signer
        reply_path_conv.is_owned = ptr_is_owned(reply_path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(reply_path_conv);
        reply_path_conv = BlindedPath_clone(&reply_path_conv);
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ), "LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ");
        *ret_conv = create_onion_message(entropy_source_conv, node_signer_conv, path_conv, contents_conv, reply_path_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -64339,17 +70434,12 @@ int64_t  CS_LDK_OnionMessenger_new(int64_t entropy_source, int64_t node_signer,
        return ret_ref;
 }
 
-int64_t  CS_LDK_OnionMessenger_send_onion_message(int64_t this_arg, int64_t path, int64_t contents, int64_t reply_path) {
+int64_t  CS_LDK_OnionMessenger_send_onion_message(int64_t this_arg, int64_t contents, int64_t destination, int64_t reply_path) {
        LDKOnionMessenger this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
        this_arg_conv.is_owned = false;
-       LDKOnionMessagePath path_conv;
-       path_conv.inner = untag_ptr(path);
-       path_conv.is_owned = ptr_is_owned(path);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
-       path_conv = OnionMessagePath_clone(&path_conv);
        void* contents_ptr = untag_ptr(contents);
        CHECK_ACCESS(contents_ptr);
        LDKOnionMessageContents contents_conv = *(LDKOnionMessageContents*)(contents_ptr);
@@ -64357,13 +70447,17 @@ int64_t  CS_LDK_OnionMessenger_send_onion_message(int64_t this_arg, int64_t path
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKOnionMessageContents_JCalls_cloned(&contents_conv);
        }
+       void* destination_ptr = untag_ptr(destination);
+       CHECK_ACCESS(destination_ptr);
+       LDKDestination destination_conv = *(LDKDestination*)(destination_ptr);
+       destination_conv = Destination_clone((LDKDestination*)untag_ptr(destination));
        LDKBlindedPath reply_path_conv;
        reply_path_conv.inner = untag_ptr(reply_path);
        reply_path_conv.is_owned = ptr_is_owned(reply_path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(reply_path_conv);
        reply_path_conv = BlindedPath_clone(&reply_path_conv);
-       LDKCResult_NoneSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneSendErrorZ), "LDKCResult_NoneSendErrorZ");
-       *ret_conv = OnionMessenger_send_onion_message(&this_arg_conv, path_conv, contents_conv, reply_path_conv);
+       LDKCResult_SendSuccessSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SendSuccessSendErrorZ), "LDKCResult_SendSuccessSendErrorZ");
+       *ret_conv = OnionMessenger_send_onion_message(&this_arg_conv, contents_conv, destination_conv, reply_path_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -64457,6 +70551,13 @@ jboolean  CS_LDK_OffersMessage_is_known_type(int64_t tlv_type) {
        return ret_conv;
 }
 
+int64_t  CS_LDK_OffersMessage_as_OnionMessageContents(int64_t this_arg) {
+       LDKOffersMessage* this_arg_conv = (LDKOffersMessage*)untag_ptr(this_arg);
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = OffersMessage_as_OnionMessageContents(this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
 int8_tArray  CS_LDK_OffersMessage_write(int64_t obj) {
        LDKOffersMessage* obj_conv = (LDKOffersMessage*)untag_ptr(obj);
        LDKCVec_u8Z ret_var = OffersMessage_write(obj_conv);
@@ -64626,6 +70727,16 @@ int64_t  CS_LDK_Packet_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Packet_hash(int64_t o) {
+       LDKPacket o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Packet_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Packet_eq(int64_t a, int64_t b) {
        LDKPacket a_conv;
        a_conv.inner = untag_ptr(a);
@@ -65123,6 +71234,40 @@ int64_t  CS_LDK_BlindedPath_one_hop_for_payment(int8_tArray payee_node_id, int64
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_BlindedPath_new_for_payment(int64_tArray intermediate_nodes, int8_tArray payee_node_id, int64_t payee_tlvs, int64_t htlc_maximum_msat, int64_t entropy_source) {
+       LDKCVec_ForwardNodeZ intermediate_nodes_constr;
+       intermediate_nodes_constr.datalen = intermediate_nodes->arr_len;
+       if (intermediate_nodes_constr.datalen > 0)
+               intermediate_nodes_constr.data = MALLOC(intermediate_nodes_constr.datalen * sizeof(LDKForwardNode), "LDKCVec_ForwardNodeZ Elements");
+       else
+               intermediate_nodes_constr.data = NULL;
+       int64_t* intermediate_nodes_vals = intermediate_nodes->elems;
+       for (size_t n = 0; n < intermediate_nodes_constr.datalen; n++) {
+               int64_t intermediate_nodes_conv_13 = intermediate_nodes_vals[n];
+               LDKForwardNode intermediate_nodes_conv_13_conv;
+               intermediate_nodes_conv_13_conv.inner = untag_ptr(intermediate_nodes_conv_13);
+               intermediate_nodes_conv_13_conv.is_owned = ptr_is_owned(intermediate_nodes_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(intermediate_nodes_conv_13_conv);
+               intermediate_nodes_conv_13_conv = ForwardNode_clone(&intermediate_nodes_conv_13_conv);
+               intermediate_nodes_constr.data[n] = intermediate_nodes_conv_13_conv;
+       }
+       FREE(intermediate_nodes);
+       LDKPublicKey payee_node_id_ref;
+       CHECK(payee_node_id->arr_len == 33);
+       memcpy(payee_node_id_ref.compressed_form, payee_node_id->elems, 33); FREE(payee_node_id);
+       LDKReceiveTlvs payee_tlvs_conv;
+       payee_tlvs_conv.inner = untag_ptr(payee_tlvs);
+       payee_tlvs_conv.is_owned = ptr_is_owned(payee_tlvs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payee_tlvs_conv);
+       payee_tlvs_conv = ReceiveTlvs_clone(&payee_tlvs_conv);
+       void* entropy_source_ptr = untag_ptr(entropy_source);
+       if (ptr_is_owned(entropy_source)) { CHECK_ACCESS(entropy_source_ptr); }
+       LDKEntropySource* entropy_source_conv = (LDKEntropySource*)entropy_source_ptr;
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = BlindedPath_new_for_payment(intermediate_nodes_constr, payee_node_id_ref, payee_tlvs_conv, htlc_maximum_msat, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_BlindedPath_write(int64_t obj) {
        LDKBlindedPath obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -65770,16 +71915,6 @@ int8_tArray  CS_LDK_ReceiveTlvs_write(int64_t obj) {
        return ret_arr;
 }
 
-int64_t  CS_LDK_ReceiveTlvs_read(int8_tArray ser) {
-       LDKu8slice ser_ref;
-       ser_ref.datalen = ser->arr_len;
-       ser_ref.data = ser->elems;
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = ReceiveTlvs_read(ser_ref);
-       FREE(ser);
-       return tag_ptr(ret_conv, true);
-}
-
 int8_tArray  CS_LDK_PaymentRelay_write(int64_t obj) {
        LDKPaymentRelay obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -65886,6 +72021,14 @@ jboolean  CS_LDK_PaymentPurpose_eq(int64_t a, int64_t b) {
        return ret_conv;
 }
 
+int64_t  CS_LDK_PaymentPurpose_preimage(int64_t this_arg) {
+       LDKPaymentPurpose* this_arg_conv = (LDKPaymentPurpose*)untag_ptr(this_arg);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = PaymentPurpose_preimage(this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 int8_tArray  CS_LDK_PaymentPurpose_write(int64_t obj) {
        LDKPaymentPurpose* obj_conv = (LDKPaymentPurpose*)untag_ptr(obj);
        LDKCVec_u8Z ret_var = PaymentPurpose_write(obj_conv);
@@ -65997,14 +72140,33 @@ void  CS_LDK_ClaimedHTLC_set_value_msat(int64_t this_ptr, int64_t val) {
        ClaimedHTLC_set_value_msat(&this_ptr_conv, val);
 }
 
-int64_t  CS_LDK_ClaimedHTLC_new(int8_tArray channel_id_arg, int8_tArray user_channel_id_arg, int32_t cltv_expiry_arg, int64_t value_msat_arg) {
+int64_t  CS_LDK_ClaimedHTLC_get_counterparty_skimmed_fee_msat(int64_t this_ptr) {
+       LDKClaimedHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = ClaimedHTLC_get_counterparty_skimmed_fee_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClaimedHTLC_set_counterparty_skimmed_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKClaimedHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       ClaimedHTLC_set_counterparty_skimmed_fee_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClaimedHTLC_new(int8_tArray channel_id_arg, int8_tArray user_channel_id_arg, int32_t cltv_expiry_arg, int64_t value_msat_arg, int64_t counterparty_skimmed_fee_msat_arg) {
        LDKThirtyTwoBytes channel_id_arg_ref;
        CHECK(channel_id_arg->arr_len == 32);
        memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
        LDKU128 user_channel_id_arg_ref;
        CHECK(user_channel_id_arg->arr_len == 16);
        memcpy(user_channel_id_arg_ref.le_bytes, user_channel_id_arg->elems, 16); FREE(user_channel_id_arg);
-       LDKClaimedHTLC ret_var = ClaimedHTLC_new(channel_id_arg_ref, user_channel_id_arg_ref, cltv_expiry_arg, value_msat_arg);
+       LDKClaimedHTLC ret_var = ClaimedHTLC_new(channel_id_arg_ref, user_channel_id_arg_ref, cltv_expiry_arg, value_msat_arg, counterparty_skimmed_fee_msat_arg);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -66562,6 +72724,31 @@ int64_t  CS_LDK_Event_payment_claimed(int8_tArray receiver_node_id, int8_tArray
        return ret_ref;
 }
 
+int64_t  CS_LDK_Event_connection_needed(int8_tArray node_id, int64_tArray addresses) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKCVec_SocketAddressZ addresses_constr;
+       addresses_constr.datalen = addresses->arr_len;
+       if (addresses_constr.datalen > 0)
+               addresses_constr.data = MALLOC(addresses_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               addresses_constr.data = NULL;
+       int64_t* addresses_vals = addresses->elems;
+       for (size_t p = 0; p < addresses_constr.datalen; p++) {
+               int64_t addresses_conv_15 = addresses_vals[p];
+               void* addresses_conv_15_ptr = untag_ptr(addresses_conv_15);
+               CHECK_ACCESS(addresses_conv_15_ptr);
+               LDKSocketAddress addresses_conv_15_conv = *(LDKSocketAddress*)(addresses_conv_15_ptr);
+               addresses_constr.data[p] = addresses_conv_15_conv;
+       }
+       FREE(addresses);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_connection_needed(node_id_ref, addresses_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 int64_t  CS_LDK_Event_invoice_request_failed(int8_tArray payment_id) {
        LDKThirtyTwoBytes payment_id_ref;
        CHECK(payment_id->arr_len == 32);
@@ -66812,7 +72999,7 @@ int64_t  CS_LDK_Event_channel_ready(int8_tArray channel_id, int8_tArray user_cha
        return ret_ref;
 }
 
-int64_t  CS_LDK_Event_channel_closed(int8_tArray channel_id, int8_tArray user_channel_id, int64_t reason, int8_tArray counterparty_node_id, int64_t channel_capacity_sats) {
+int64_t  CS_LDK_Event_channel_closed(int8_tArray channel_id, int8_tArray user_channel_id, int64_t reason, int8_tArray counterparty_node_id, int64_t channel_capacity_sats, int64_t channel_funding_txo) {
        LDKThirtyTwoBytes channel_id_ref;
        CHECK(channel_id->arr_len == 32);
        memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
@@ -66830,8 +73017,13 @@ int64_t  CS_LDK_Event_channel_closed(int8_tArray channel_id, int8_tArray user_ch
        CHECK_ACCESS(channel_capacity_sats_ptr);
        LDKCOption_u64Z channel_capacity_sats_conv = *(LDKCOption_u64Z*)(channel_capacity_sats_ptr);
        channel_capacity_sats_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(channel_capacity_sats));
+       LDKOutPoint channel_funding_txo_conv;
+       channel_funding_txo_conv.inner = untag_ptr(channel_funding_txo);
+       channel_funding_txo_conv.is_owned = ptr_is_owned(channel_funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_funding_txo_conv);
+       channel_funding_txo_conv = OutPoint_clone(&channel_funding_txo_conv);
        LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
-       *ret_copy = Event_channel_closed(channel_id_ref, user_channel_id_ref, reason_conv, counterparty_node_id_ref, channel_capacity_sats_conv);
+       *ret_copy = Event_channel_closed(channel_id_ref, user_channel_id_ref, reason_conv, counterparty_node_id_ref, channel_capacity_sats_conv, channel_funding_txo_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -67039,6 +73231,66 @@ int64_t  CS_LDK_MessageSendEvent_send_funding_signed(int8_tArray node_id, int64_
        return ret_ref;
 }
 
+int64_t  CS_LDK_MessageSendEvent_send_stfu(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKStfu msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = Stfu_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_stfu(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_splice(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKSplice msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = Splice_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_splice(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_splice_ack(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKSpliceAck msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = SpliceAck_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_splice_ack(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_splice_locked(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKSpliceLocked msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = SpliceLocked_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_splice_locked(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 int64_t  CS_LDK_MessageSendEvent_send_tx_add_input(int8_tArray node_id, int64_t msg) {
        LDKPublicKey node_id_ref;
        CHECK(node_id->arr_len == 33);
@@ -70346,13 +76598,26 @@ int64_t  CS_LDK_Description_new(jstring description) {
        return tag_ptr(ret_conv, true);
 }
 
-jstring  CS_LDK_Description_into_inner(int64_t this_arg) {
+int64_t  CS_LDK_Description_into_inner(int64_t this_arg) {
        LDKDescription this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
        this_arg_conv = Description_clone(&this_arg_conv);
-       LDKStr ret_str = Description_into_inner(this_arg_conv);
+       LDKUntrustedString ret_var = Description_into_inner(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jstring  CS_LDK_Description_to_str(int64_t o) {
+       LDKDescription o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       LDKStr ret_str = Description_to_str(&o_conv);
        jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
        Str_free(ret_str);
        return ret_conv;
@@ -70599,239 +76864,28 @@ jstring  CS_LDK_SignOrCreationError_to_str(int64_t o) {
        return ret_conv;
 }
 
-int64_t  CS_LDK_pay_invoice(int64_t invoice, int64_t retry_strategy, int64_t channelmanager) {
+int64_t  CS_LDK_payment_parameters_from_zero_amount_invoice(int64_t invoice, int64_t amount_msat) {
        LDKBolt11Invoice invoice_conv;
        invoice_conv.inner = untag_ptr(invoice);
        invoice_conv.is_owned = ptr_is_owned(invoice);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
        invoice_conv.is_owned = false;
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = pay_invoice(&invoice_conv, retry_strategy_conv, &channelmanager_conv);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = payment_parameters_from_zero_amount_invoice(&invoice_conv, amount_msat);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_pay_invoice_with_id(int64_t invoice, int8_tArray payment_id, int64_t retry_strategy, int64_t channelmanager) {
+int64_t  CS_LDK_payment_parameters_from_invoice(int64_t invoice) {
        LDKBolt11Invoice invoice_conv;
        invoice_conv.inner = untag_ptr(invoice);
        invoice_conv.is_owned = ptr_is_owned(invoice);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
        invoice_conv.is_owned = false;
-       LDKThirtyTwoBytes payment_id_ref;
-       CHECK(payment_id->arr_len == 32);
-       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = pay_invoice_with_id(&invoice_conv, payment_id_ref, retry_strategy_conv, &channelmanager_conv);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = payment_parameters_from_invoice(&invoice_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_pay_zero_value_invoice(int64_t invoice, int64_t amount_msats, int64_t retry_strategy, int64_t channelmanager) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = pay_zero_value_invoice(&invoice_conv, amount_msats, retry_strategy_conv, &channelmanager_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_pay_zero_value_invoice_with_id(int64_t invoice, int64_t amount_msats, int8_tArray payment_id, int64_t retry_strategy, int64_t channelmanager) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       LDKThirtyTwoBytes payment_id_ref;
-       CHECK(payment_id->arr_len == 32);
-       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = pay_zero_value_invoice_with_id(&invoice_conv, amount_msats, payment_id_ref, retry_strategy_conv, &channelmanager_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_preflight_probe_invoice(int64_t invoice, int64_t channelmanager, int64_t liquidity_limit_multiplier) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       void* liquidity_limit_multiplier_ptr = untag_ptr(liquidity_limit_multiplier);
-       CHECK_ACCESS(liquidity_limit_multiplier_ptr);
-       LDKCOption_u64Z liquidity_limit_multiplier_conv = *(LDKCOption_u64Z*)(liquidity_limit_multiplier_ptr);
-       liquidity_limit_multiplier_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(liquidity_limit_multiplier));
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = preflight_probe_invoice(&invoice_conv, &channelmanager_conv, liquidity_limit_multiplier_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_preflight_probe_zero_value_invoice(int64_t invoice, int64_t amount_msat, int64_t channelmanager, int64_t liquidity_limit_multiplier) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       void* liquidity_limit_multiplier_ptr = untag_ptr(liquidity_limit_multiplier);
-       CHECK_ACCESS(liquidity_limit_multiplier_ptr);
-       LDKCOption_u64Z liquidity_limit_multiplier_conv = *(LDKCOption_u64Z*)(liquidity_limit_multiplier_ptr);
-       liquidity_limit_multiplier_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(liquidity_limit_multiplier));
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = preflight_probe_zero_value_invoice(&invoice_conv, amount_msat, &channelmanager_conv, liquidity_limit_multiplier_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-void  CS_LDK_PaymentError_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKPaymentError this_ptr_conv = *(LDKPaymentError*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       PaymentError_free(this_ptr_conv);
-}
-
-static inline uint64_t PaymentError_clone_ptr(LDKPaymentError *NONNULL_PTR arg) {
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_clone(arg);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-int64_t  CS_LDK_PaymentError_clone_ptr(int64_t arg) {
-       LDKPaymentError* arg_conv = (LDKPaymentError*)untag_ptr(arg);
-       int64_t ret_conv = PaymentError_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_PaymentError_clone(int64_t orig) {
-       LDKPaymentError* orig_conv = (LDKPaymentError*)untag_ptr(orig);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_clone(orig_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_PaymentError_invoice(jstring a) {
-       LDKStr a_conv = str_ref_to_owned_c(a);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_invoice(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_PaymentError_sending(int32_t a) {
-       LDKRetryableSendFailure a_conv = LDKRetryableSendFailure_from_cs(a);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_sending(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-jboolean  CS_LDK_PaymentError_eq(int64_t a, int64_t b) {
-       LDKPaymentError* a_conv = (LDKPaymentError*)untag_ptr(a);
-       LDKPaymentError* b_conv = (LDKPaymentError*)untag_ptr(b);
-       jboolean ret_conv = PaymentError_eq(a_conv, b_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_ProbingError_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKProbingError this_ptr_conv = *(LDKProbingError*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       ProbingError_free(this_ptr_conv);
-}
-
-static inline uint64_t ProbingError_clone_ptr(LDKProbingError *NONNULL_PTR arg) {
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_clone(arg);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-int64_t  CS_LDK_ProbingError_clone_ptr(int64_t arg) {
-       LDKProbingError* arg_conv = (LDKProbingError*)untag_ptr(arg);
-       int64_t ret_conv = ProbingError_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_ProbingError_clone(int64_t orig) {
-       LDKProbingError* orig_conv = (LDKProbingError*)untag_ptr(orig);
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_clone(orig_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_ProbingError_invoice(jstring a) {
-       LDKStr a_conv = str_ref_to_owned_c(a);
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_invoice(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_ProbingError_sending(int64_t a) {
-       void* a_ptr = untag_ptr(a);
-       CHECK_ACCESS(a_ptr);
-       LDKProbeSendFailure a_conv = *(LDKProbeSendFailure*)(a_ptr);
-       a_conv = ProbeSendFailure_clone((LDKProbeSendFailure*)untag_ptr(a));
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_sending(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-jboolean  CS_LDK_ProbingError_eq(int64_t a, int64_t b) {
-       LDKProbingError* a_conv = (LDKProbingError*)untag_ptr(a);
-       LDKProbingError* b_conv = (LDKProbingError*)untag_ptr(b);
-       jboolean ret_conv = ProbingError_eq(a_conv, b_conv);
-       return ret_conv;
-}
-
 int64_t  CS_LDK_create_phantom_invoice(int64_t amt_msat, int64_t payment_hash, jstring description, int32_t invoice_expiry_delta_secs, int64_tArray phantom_route_hints, int64_t entropy_source, int64_t node_signer, int64_t logger, int32_t network, int64_t min_final_cltv_expiry_delta, int64_t duration_since_epoch) {
        void* amt_msat_ptr = untag_ptr(amt_msat);
        CHECK_ACCESS(amt_msat_ptr);
@@ -71215,6 +77269,58 @@ jstring  CS_LDK_SiPrefix_to_str(int64_t o) {
        return ret_conv;
 }
 
+void  CS_LDK_GraphSyncError_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKGraphSyncError this_ptr_conv = *(LDKGraphSyncError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       GraphSyncError_free(this_ptr_conv);
+}
+
+static inline uint64_t GraphSyncError_clone_ptr(LDKGraphSyncError *NONNULL_PTR arg) {
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_GraphSyncError_clone_ptr(int64_t arg) {
+       LDKGraphSyncError* arg_conv = (LDKGraphSyncError*)untag_ptr(arg);
+       int64_t ret_conv = GraphSyncError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_GraphSyncError_clone(int64_t orig) {
+       LDKGraphSyncError* orig_conv = (LDKGraphSyncError*)untag_ptr(orig);
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GraphSyncError_decode_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKDecodeError a_conv = *(LDKDecodeError*)(a_ptr);
+       a_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(a));
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_decode_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GraphSyncError_lightning_error(int64_t a) {
+       LDKLightningError a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = LightningError_clone(&a_conv);
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_lightning_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 void  CS_LDK_RapidGossipSync_free(int64_t this_obj) {
        LDKRapidGossipSync this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -71299,55 +77405,3 @@ jboolean  CS_LDK_RapidGossipSync_is_initial_sync_complete(int64_t this_arg) {
        return ret_conv;
 }
 
-void  CS_LDK_GraphSyncError_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKGraphSyncError this_ptr_conv = *(LDKGraphSyncError*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       GraphSyncError_free(this_ptr_conv);
-}
-
-static inline uint64_t GraphSyncError_clone_ptr(LDKGraphSyncError *NONNULL_PTR arg) {
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_clone(arg);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-int64_t  CS_LDK_GraphSyncError_clone_ptr(int64_t arg) {
-       LDKGraphSyncError* arg_conv = (LDKGraphSyncError*)untag_ptr(arg);
-       int64_t ret_conv = GraphSyncError_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_GraphSyncError_clone(int64_t orig) {
-       LDKGraphSyncError* orig_conv = (LDKGraphSyncError*)untag_ptr(orig);
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_clone(orig_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_GraphSyncError_decode_error(int64_t a) {
-       void* a_ptr = untag_ptr(a);
-       CHECK_ACCESS(a_ptr);
-       LDKDecodeError a_conv = *(LDKDecodeError*)(a_ptr);
-       a_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(a));
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_decode_error(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_GraphSyncError_lightning_error(int64_t a) {
-       LDKLightningError a_conv;
-       a_conv.inner = untag_ptr(a);
-       a_conv.is_owned = ptr_is_owned(a);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
-       a_conv = LightningError_clone(&a_conv);
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_lightning_error(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
index b595907e867295983eee9cb696d1512ca2dbe703..6eea9029ee522e3dd8b269797d0a59c9018f6a90 100644 (file)
@@ -27,6 +27,18 @@ _Static_assert(offsetof(LDKCVec_u8Z, datalen) == offsetof(LDKu8slice, datalen),
 
 _Static_assert(sizeof(void*) <= 8, "Pointers must fit into 64 bits");
 
+// Int types across Windows/Linux are different, so make sure we're using the right headers.
+_Static_assert(sizeof(void*) == sizeof(uintptr_t), "stdints must be correct");
+_Static_assert(sizeof(void*) == sizeof(intptr_t), "stdints must be correct");
+_Static_assert(sizeof(uint64_t) == 8, "stdints must be correct");
+_Static_assert(sizeof(int64_t) == 8, "stdints must be correct");
+_Static_assert(sizeof(uint32_t) == 4, "stdints must be correct");
+_Static_assert(sizeof(int32_t) == 4, "stdints must be correct");
+_Static_assert(sizeof(uint16_t) == 2, "stdints must be correct");
+_Static_assert(sizeof(int16_t) == 2, "stdints must be correct");
+_Static_assert(sizeof(uint8_t) == 1, "stdints must be correct");
+_Static_assert(sizeof(int8_t) == 1, "stdints must be correct");
+
 #define DECL_ARR_TYPE(ty, name) \
        struct name##array { \
                uint64_t arr_len; /* uint32_t would suffice but we want to align uint64_ts as well */ \
@@ -111,6 +123,13 @@ int CS_LDK_register_void_l_invoker(invoker_void_l invoker) {
        return 0;
 }
 
+typedef int64_t (*invoker_l_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
+static invoker_l_lll js_invoke_function_l_lll;
+int CS_LDK_register_l_lll_invoker(invoker_l_lll invoker) {
+       js_invoke_function_l_lll = invoker;
+       return 0;
+}
+
 typedef int64_t (*invoker_l_llll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c, int64_t d);
 static invoker_l_llll js_invoke_function_l_llll;
 int CS_LDK_register_l_llll_invoker(invoker_l_llll invoker) {
@@ -125,10 +144,10 @@ int CS_LDK_register_l_lllll_invoker(invoker_l_lllll invoker) {
        return 0;
 }
 
-typedef int64_t (*invoker_l_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
-static invoker_l_lll js_invoke_function_l_lll;
-int CS_LDK_register_l_lll_invoker(invoker_l_lll invoker) {
-       js_invoke_function_l_lll = invoker;
+typedef void (*invoker_void_lll)(int obj_ptr, int fn_id, int64_t a, int64_t b, int64_t c);
+static invoker_void_lll js_invoke_function_void_lll;
+int CS_LDK_register_void_lll_invoker(invoker_void_lll invoker) {
+       js_invoke_function_void_lll = invoker;
        return 0;
 }
 
@@ -335,6 +354,20 @@ static inline uint64_t tag_ptr(const void* ptr, bool is_owned) {
        }
 }
 
+static inline LDKBlindedFailure LDKBlindedFailure_from_cs(int32_t ord) {
+       switch (ord) {
+               case 0: return LDKBlindedFailure_FromIntroductionNode;
+               case 1: return LDKBlindedFailure_FromBlindedNode;
+               default: abort();
+       }
+}
+static inline int32_t LDKBlindedFailure_to_cs(LDKBlindedFailure val) {
+       switch (val) {
+               case LDKBlindedFailure_FromIntroductionNode: return 0;
+               case LDKBlindedFailure_FromBlindedNode: return 1;
+               default: abort();
+       }
+}
 static inline LDKBolt11SemanticError LDKBolt11SemanticError_from_cs(int32_t ord) {
        switch (ord) {
                case 0: return LDKBolt11SemanticError_NoPaymentHash;
@@ -482,24 +515,22 @@ static inline int32_t LDKChannelShutdownState_to_cs(LDKChannelShutdownState val)
 static inline LDKConfirmationTarget LDKConfirmationTarget_from_cs(int32_t ord) {
        switch (ord) {
                case 0: return LDKConfirmationTarget_OnChainSweep;
-               case 1: return LDKConfirmationTarget_MaxAllowedNonAnchorChannelRemoteFee;
-               case 2: return LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee;
-               case 3: return LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee;
-               case 4: return LDKConfirmationTarget_AnchorChannelFee;
-               case 5: return LDKConfirmationTarget_NonAnchorChannelFee;
-               case 6: return LDKConfirmationTarget_ChannelCloseMinimum;
+               case 1: return LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee;
+               case 2: return LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee;
+               case 3: return LDKConfirmationTarget_AnchorChannelFee;
+               case 4: return LDKConfirmationTarget_NonAnchorChannelFee;
+               case 5: return LDKConfirmationTarget_ChannelCloseMinimum;
                default: abort();
        }
 }
 static inline int32_t LDKConfirmationTarget_to_cs(LDKConfirmationTarget val) {
        switch (val) {
                case LDKConfirmationTarget_OnChainSweep: return 0;
-               case LDKConfirmationTarget_MaxAllowedNonAnchorChannelRemoteFee: return 1;
-               case LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee: return 2;
-               case LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee: return 3;
-               case LDKConfirmationTarget_AnchorChannelFee: return 4;
-               case LDKConfirmationTarget_NonAnchorChannelFee: return 5;
-               case LDKConfirmationTarget_ChannelCloseMinimum: return 6;
+               case LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee: return 1;
+               case LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee: return 2;
+               case LDKConfirmationTarget_AnchorChannelFee: return 3;
+               case LDKConfirmationTarget_NonAnchorChannelFee: return 4;
+               case LDKConfirmationTarget_ChannelCloseMinimum: return 5;
                default: abort();
        }
 }
@@ -785,6 +816,11 @@ static inline int32_t LDKUtxoLookupError_to_cs(LDKUtxoLookupError val) {
                default: abort();
        }
 }
+static inline LDKCVec_u8Z CVec_u8Z_clone(const LDKCVec_u8Z *orig) {
+       LDKCVec_u8Z ret = { .data = MALLOC(sizeof(int8_t) * orig->datalen, "LDKCVec_u8Z clone bytes"), .datalen = orig->datalen };
+       memcpy(ret.data, orig->data, sizeof(int8_t) * ret.datalen);
+       return ret;
+}
 struct LDKThirtyTwoBytes BigEndianScalar_get_bytes (struct LDKBigEndianScalar* thing) {
        LDKThirtyTwoBytes ret = { .data = *thing->big_endian_bytes };
        return ret;
@@ -831,63 +867,6 @@ int8_t CS_LDK_LDKBech32Error_InvalidData_get_invalid_data(int64_t ptr) {
        int8_t invalid_data_conv = obj->invalid_data;
        return invalid_data_conv;
 }
-static inline LDKCVec_u8Z CVec_u8Z_clone(const LDKCVec_u8Z *orig) {
-       LDKCVec_u8Z ret = { .data = MALLOC(sizeof(int8_t) * orig->datalen, "LDKCVec_u8Z clone bytes"), .datalen = orig->datalen };
-       memcpy(ret.data, orig->data, sizeof(int8_t) * ret.datalen);
-       return ret;
-}
-struct LDKWitness TxIn_get_witness (struct LDKTxIn* thing) {   return Witness_clone(&thing->witness);}int8_tArray  CS_LDK_TxIn_get_witness(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       LDKWitness ret_var = TxIn_get_witness(thing_conv);
-       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
-       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
-       Witness_free(ret_var);
-       return ret_arr;
-}
-
-struct LDKCVec_u8Z TxIn_get_script_sig (struct LDKTxIn* thing) {       return CVec_u8Z_clone(&thing->script_sig);}int8_tArray  CS_LDK_TxIn_get_script_sig(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       LDKCVec_u8Z ret_var = TxIn_get_script_sig(thing_conv);
-       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
-       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
-       CVec_u8Z_free(ret_var);
-       return ret_arr;
-}
-
-LDKThirtyTwoBytes TxIn_get_previous_txid (struct LDKTxIn* thing) {     return thing->previous_txid;}int8_tArray  CS_LDK_TxIn_get_previous_txid(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(ret_arr->elems, TxIn_get_previous_txid(thing_conv).data, 32);
-       return ret_arr;
-}
-
-uint32_t TxIn_get_previous_vout (struct LDKTxIn* thing) {      return thing->previous_vout;}int32_t  CS_LDK_TxIn_get_previous_vout(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       int32_t ret_conv = TxIn_get_previous_vout(thing_conv);
-       return ret_conv;
-}
-
-uint32_t TxIn_get_sequence (struct LDKTxIn* thing) {   return thing->sequence;}int32_t  CS_LDK_TxIn_get_sequence(int64_t thing) {
-       LDKTxIn* thing_conv = (LDKTxIn*)untag_ptr(thing);
-       int32_t ret_conv = TxIn_get_sequence(thing_conv);
-       return ret_conv;
-}
-
-struct LDKCVec_u8Z TxOut_get_script_pubkey (struct LDKTxOut* thing) {  return CVec_u8Z_clone(&thing->script_pubkey);}int8_tArray  CS_LDK_TxOut_get_script_pubkey(int64_t thing) {
-       LDKTxOut* thing_conv = (LDKTxOut*)untag_ptr(thing);
-       LDKCVec_u8Z ret_var = TxOut_get_script_pubkey(thing_conv);
-       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
-       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
-       CVec_u8Z_free(ret_var);
-       return ret_arr;
-}
-
-uint64_t TxOut_get_value (struct LDKTxOut* thing) {    return thing->value;}int64_t  CS_LDK_TxOut_get_value(int64_t thing) {
-       LDKTxOut* thing_conv = (LDKTxOut*)untag_ptr(thing);
-       int64_t ret_conv = TxOut_get_value(thing_conv);
-       return ret_conv;
-}
-
 uint32_t CS_LDK_LDKCOption_u64Z_ty_from_ptr(int64_t ptr) {
        LDKCOption_u64Z *obj = (LDKCOption_u64Z*)untag_ptr(ptr);
        switch(obj->tag) {
@@ -1350,6 +1329,13 @@ int64_t CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_output(int64_t ptr)
        LDKTxOut* output_ref = &obj->static_output.output;
        return tag_ptr(output_ref, false);
 }
+int8_tArray CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_channel_keys_id(int64_t ptr) {
+       LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSpendableOutputDescriptor_StaticOutput);
+       int8_tArray channel_keys_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_keys_id_arr->elems, obj->static_output.channel_keys_id.data, 32);
+       return channel_keys_id_arr;
+}
 int64_t CS_LDK_LDKSpendableOutputDescriptor_DelayedPaymentOutput_get_delayed_payment_output(int64_t ptr) {
        LDKSpendableOutputDescriptor *obj = (LDKSpendableOutputDescriptor*)untag_ptr(ptr);
        CHECK(obj->tag == LDKSpendableOutputDescriptor_DelayedPaymentOutput);
@@ -1420,45 +1406,45 @@ int32_t CS_LDK_LDKCOption_u32Z_Some_get_some(int64_t ptr) {
        int32_t some_conv = obj->some;
        return some_conv;
 }
-static inline struct LDKCVec_u8Z C2Tuple_CVec_u8ZusizeZ_get_a(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR owner){
+static inline struct LDKCVec_u8Z C2Tuple_CVec_u8Zu64Z_get_a(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR owner){
        return CVec_u8Z_clone(&owner->a);
 }
-int8_tArray  CS_LDK_C2Tuple_CVec_u8ZusizeZ_get_a(int64_t owner) {
-       LDKC2Tuple_CVec_u8ZusizeZ* owner_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(owner);
-       LDKCVec_u8Z ret_var = C2Tuple_CVec_u8ZusizeZ_get_a(owner_conv);
+int8_tArray  CS_LDK_C2Tuple_CVec_u8Zu64Z_get_a(int64_t owner) {
+       LDKC2Tuple_CVec_u8Zu64Z* owner_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(owner);
+       LDKCVec_u8Z ret_var = C2Tuple_CVec_u8Zu64Z_get_a(owner_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
        CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
-static inline uintptr_t C2Tuple_CVec_u8ZusizeZ_get_b(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR owner){
+static inline uint64_t C2Tuple_CVec_u8Zu64Z_get_b(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR owner){
        return owner->b;
 }
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_get_b(int64_t owner) {
-       LDKC2Tuple_CVec_u8ZusizeZ* owner_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(owner);
-       int64_t ret_conv = C2Tuple_CVec_u8ZusizeZ_get_b(owner_conv);
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_get_b(int64_t owner) {
+       LDKC2Tuple_CVec_u8Zu64Z* owner_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(owner);
+       int64_t ret_conv = C2Tuple_CVec_u8Zu64Z_get_b(owner_conv);
        return ret_conv;
 }
 
-static inline struct LDKC2Tuple_CVec_u8ZusizeZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner){
+static inline struct LDKC2Tuple_CVec_u8Zu64Z CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return C2Tuple_CVec_u8ZusizeZ_clone(&*owner->contents.result);
+       return C2Tuple_CVec_u8Zu64Z_clone(&*owner->contents.result);
 }
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(int64_t owner) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(owner);
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(owner_conv);
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(owner_conv);
        return tag_ptr(ret_conv, true);
 }
 
-static inline void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner){
+static inline void CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return *owner->contents.err;
 }
-void  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(int64_t owner) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(owner);
-       CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(owner_conv);
+void  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* owner_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(owner_conv);
 }
 
 static inline struct LDKChannelDerivationParameters CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner){
@@ -1531,74 +1517,6 @@ void  CS_LDK_CResult_NoneNoneZ_get_err(int64_t owner) {
        CResult_NoneNoneZ_get_err(owner_conv);
 }
 
-static inline struct LDKECDSASignature C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
-       return owner->a;
-}
-int8_tArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(int64_t owner) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
-       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
-       memcpy(ret_arr->elems, C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(owner_conv).compact_form, 64);
-       return ret_arr;
-}
-
-static inline struct LDKCVec_ECDSASignatureZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
-       return owner->b;
-}
-ptrArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(int64_t owner) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
-       LDKCVec_ECDSASignatureZ ret_var = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(owner_conv);
-       ptrArray ret_arr = NULL;
-       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
-       int8_tArray *ret_arr_ptr = (int8_tArray*)(((uint8_t*)ret_arr) + 8);
-       for (size_t i = 0; i < ret_var.datalen; i++) {
-               int8_tArray ret_conv_8_arr = init_int8_tArray(64, __LINE__);
-               memcpy(ret_conv_8_arr->elems, ret_var.data[i].compact_form, 64);
-               ret_arr_ptr[i] = ret_conv_8_arr;
-       }
-       
-       return ret_arr;
-}
-
-static inline struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(&*owner->contents.result);
-}
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(int64_t owner) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(owner_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-static inline void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return *owner->contents.err;
-}
-void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(int64_t owner) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
-       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(owner_conv);
-}
-
-static inline struct LDKECDSASignature CResult_ECDSASignatureNoneZ_get_ok(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return *owner->contents.result;
-}
-int8_tArray  CS_LDK_CResult_ECDSASignatureNoneZ_get_ok(int64_t owner) {
-       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
-       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
-       memcpy(ret_arr->elems, CResult_ECDSASignatureNoneZ_get_ok(owner_conv).compact_form, 64);
-       return ret_arr;
-}
-
-static inline void CResult_ECDSASignatureNoneZ_get_err(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return *owner->contents.err;
-}
-void  CS_LDK_CResult_ECDSASignatureNoneZ_get_err(int64_t owner) {
-       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
-       CResult_ECDSASignatureNoneZ_get_err(owner_conv);
-}
-
 static inline struct LDKPublicKey CResult_PublicKeyNoneZ_get_ok(LDKCResult_PublicKeyNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
        return *owner->contents.result;
@@ -1673,6 +1591,74 @@ void  CS_LDK_CResult_SchnorrSignatureNoneZ_get_err(int64_t owner) {
        CResult_SchnorrSignatureNoneZ_get_err(owner_conv);
 }
 
+static inline struct LDKECDSASignature CResult_ECDSASignatureNoneZ_get_ok(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return *owner->contents.result;
+}
+int8_tArray  CS_LDK_CResult_ECDSASignatureNoneZ_get_ok(int64_t owner) {
+       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, CResult_ECDSASignatureNoneZ_get_ok(owner_conv).compact_form, 64);
+       return ret_arr;
+}
+
+static inline void CResult_ECDSASignatureNoneZ_get_err(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_ECDSASignatureNoneZ_get_err(int64_t owner) {
+       LDKCResult_ECDSASignatureNoneZ* owner_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(owner);
+       CResult_ECDSASignatureNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKECDSASignature C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(int64_t owner) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(64, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(owner_conv).compact_form, 64);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_ECDSASignatureZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner){
+       return owner->b;
+}
+ptrArray  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(int64_t owner) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* owner_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(owner);
+       LDKCVec_ECDSASignatureZ ret_var = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(owner_conv);
+       ptrArray ret_arr = NULL;
+       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
+       int8_tArray *ret_arr_ptr = (int8_tArray*)(((uint8_t*)ret_arr) + 8);
+       for (size_t i = 0; i < ret_var.datalen; i++) {
+               int8_tArray ret_conv_8_arr = init_int8_tArray(64, __LINE__);
+               memcpy(ret_conv_8_arr->elems, ret_var.data[i].compact_form, 64);
+               ret_arr_ptr[i] = ret_conv_8_arr;
+       }
+       
+       return ret_arr;
+}
+
+static inline struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+static inline void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* owner_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(owner);
+       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(owner_conv);
+}
+
 typedef struct LDKChannelSigner_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -1701,25 +1687,37 @@ LDKThirtyTwoBytes release_commitment_secret_LDKChannelSigner_jcall(const void* t
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
        return ret_ref;
 }
-LDKCResult_NoneNoneZ validate_holder_commitment_LDKChannelSigner_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * holder_tx, LDKCVec_ThirtyTwoBytesZ preimages) {
+LDKCResult_NoneNoneZ validate_holder_commitment_LDKChannelSigner_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * holder_tx, LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages) {
        LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
        LDKHolderCommitmentTransaction holder_tx_var = *holder_tx;
        int64_t holder_tx_ref = 0;
        holder_tx_var = HolderCommitmentTransaction_clone(&holder_tx_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_tx_var);
        holder_tx_ref = tag_ptr(holder_tx_var.inner, holder_tx_var.is_owned);
-       LDKCVec_ThirtyTwoBytesZ preimages_var = preimages;
-       ptrArray preimages_arr = NULL;
-       preimages_arr = init_ptrArray(preimages_var.datalen, __LINE__);
-       int8_tArray *preimages_arr_ptr = (int8_tArray*)(((uint8_t*)preimages_arr) + 8);
-       for (size_t i = 0; i < preimages_var.datalen; i++) {
-               int8_tArray preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
-               memcpy(preimages_conv_8_arr->elems, preimages_var.data[i].data, 32);
-               preimages_arr_ptr[i] = preimages_conv_8_arr;
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_var = outbound_htlc_preimages;
+       ptrArray outbound_htlc_preimages_arr = NULL;
+       outbound_htlc_preimages_arr = init_ptrArray(outbound_htlc_preimages_var.datalen, __LINE__);
+       int8_tArray *outbound_htlc_preimages_arr_ptr = (int8_tArray*)(((uint8_t*)outbound_htlc_preimages_arr) + 8);
+       for (size_t i = 0; i < outbound_htlc_preimages_var.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
+               memcpy(outbound_htlc_preimages_conv_8_arr->elems, outbound_htlc_preimages_var.data[i].data, 32);
+               outbound_htlc_preimages_arr_ptr[i] = outbound_htlc_preimages_conv_8_arr;
        }
        
-       FREE(preimages_var.data);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 2, holder_tx_ref, (int64_t)preimages_arr);
+       FREE(outbound_htlc_preimages_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 2, holder_tx_ref, (int64_t)outbound_htlc_preimages_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_NoneNoneZ validate_counterparty_revocation_LDKChannelSigner_jcall(const void* this_arg, uint64_t idx, const uint8_t (* secret)[32]) {
+       LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
+       int64_t idx_conv = idx;
+       int8_tArray secret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(secret_arr->elems, *secret, 32);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 3, idx_conv, (int64_t)secret_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -1728,7 +1726,7 @@ LDKCResult_NoneNoneZ validate_holder_commitment_LDKChannelSigner_jcall(const voi
 }
 LDKThirtyTwoBytes channel_keys_id_LDKChannelSigner_jcall(const void* this_arg) {
        LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 3);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 4);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -1741,7 +1739,7 @@ void provide_channel_parameters_LDKChannelSigner_jcall(void* this_arg, const LDK
        channel_parameters_var = ChannelTransactionParameters_clone(&channel_parameters_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_parameters_var);
        channel_parameters_ref = tag_ptr(channel_parameters_var.inner, channel_parameters_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 4, channel_parameters_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 5, channel_parameters_ref);
 }
 static void LDKChannelSigner_JCalls_cloned(LDKChannelSigner* new_obj) {
        LDKChannelSigner_JCalls *j_calls = (LDKChannelSigner_JCalls*) new_obj->this_arg;
@@ -1762,6 +1760,7 @@ static inline LDKChannelSigner LDKChannelSigner_init (int64_t o, int64_t pubkeys
                .get_per_commitment_point = get_per_commitment_point_LDKChannelSigner_jcall,
                .release_commitment_secret = release_commitment_secret_LDKChannelSigner_jcall,
                .validate_holder_commitment = validate_holder_commitment_LDKChannelSigner_jcall,
+               .validate_counterparty_revocation = validate_counterparty_revocation_LDKChannelSigner_jcall,
                .channel_keys_id = channel_keys_id_LDKChannelSigner_jcall,
                .provide_channel_parameters = provide_channel_parameters_LDKChannelSigner_jcall,
                .free = LDKChannelSigner_JCalls_free,
@@ -1793,7 +1792,7 @@ int8_tArray  CS_LDK_ChannelSigner_release_commitment_secret(int64_t this_arg, in
        return ret_arr;
 }
 
-int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64_t holder_tx, ptrArray preimages) {
+int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64_t holder_tx, ptrArray outbound_htlc_preimages) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKChannelSigner* this_arg_conv = (LDKChannelSigner*)this_arg_ptr;
@@ -1802,23 +1801,36 @@ int64_t  CS_LDK_ChannelSigner_validate_holder_commitment(int64_t this_arg, int64
        holder_tx_conv.is_owned = ptr_is_owned(holder_tx);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(holder_tx_conv);
        holder_tx_conv.is_owned = false;
-       LDKCVec_ThirtyTwoBytesZ preimages_constr;
-       preimages_constr.datalen = preimages->arr_len;
-       if (preimages_constr.datalen > 0)
-               preimages_constr.data = MALLOC(preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_constr;
+       outbound_htlc_preimages_constr.datalen = outbound_htlc_preimages->arr_len;
+       if (outbound_htlc_preimages_constr.datalen > 0)
+               outbound_htlc_preimages_constr.data = MALLOC(outbound_htlc_preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
        else
-               preimages_constr.data = NULL;
-       int8_tArray* preimages_vals = (void*) preimages->elems;
-       for (size_t i = 0; i < preimages_constr.datalen; i++) {
-               int8_tArray preimages_conv_8 = preimages_vals[i];
-               LDKThirtyTwoBytes preimages_conv_8_ref;
-               CHECK(preimages_conv_8->arr_len == 32);
-               memcpy(preimages_conv_8_ref.data, preimages_conv_8->elems, 32); FREE(preimages_conv_8);
-               preimages_constr.data[i] = preimages_conv_8_ref;
-       }
-       FREE(preimages);
+               outbound_htlc_preimages_constr.data = NULL;
+       int8_tArray* outbound_htlc_preimages_vals = (void*) outbound_htlc_preimages->elems;
+       for (size_t i = 0; i < outbound_htlc_preimages_constr.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8 = outbound_htlc_preimages_vals[i];
+               LDKThirtyTwoBytes outbound_htlc_preimages_conv_8_ref;
+               CHECK(outbound_htlc_preimages_conv_8->arr_len == 32);
+               memcpy(outbound_htlc_preimages_conv_8_ref.data, outbound_htlc_preimages_conv_8->elems, 32); FREE(outbound_htlc_preimages_conv_8);
+               outbound_htlc_preimages_constr.data[i] = outbound_htlc_preimages_conv_8_ref;
+       }
+       FREE(outbound_htlc_preimages);
        LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
-       *ret_conv = (this_arg_conv->validate_holder_commitment)(this_arg_conv->this_arg, &holder_tx_conv, preimages_constr);
+       *ret_conv = (this_arg_conv->validate_holder_commitment)(this_arg_conv->this_arg, &holder_tx_conv, outbound_htlc_preimages_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_ChannelSigner_validate_counterparty_revocation(int64_t this_arg, int64_t idx, int8_tArray secret) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelSigner* this_arg_conv = (LDKChannelSigner*)this_arg_ptr;
+       uint8_t secret_arr[32];
+       CHECK(secret->arr_len == 32);
+       memcpy(secret_arr, secret->elems, 32); FREE(secret);
+       uint8_t (*secret_ref)[32] = &secret_arr;
+       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
+       *ret_conv = (this_arg_conv->validate_counterparty_revocation)(this_arg_conv->this_arg, idx, secret_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -1870,43 +1882,42 @@ static void LDKEcdsaChannelSigner_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKCommitmentTransaction * commitment_tx, LDKCVec_ThirtyTwoBytesZ preimages) {
+LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKCommitmentTransaction * commitment_tx, LDKCVec_ThirtyTwoBytesZ inbound_htlc_preimages, LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages) {
        LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
        LDKCommitmentTransaction commitment_tx_var = *commitment_tx;
        int64_t commitment_tx_ref = 0;
        commitment_tx_var = CommitmentTransaction_clone(&commitment_tx_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_tx_var);
        commitment_tx_ref = tag_ptr(commitment_tx_var.inner, commitment_tx_var.is_owned);
-       LDKCVec_ThirtyTwoBytesZ preimages_var = preimages;
-       ptrArray preimages_arr = NULL;
-       preimages_arr = init_ptrArray(preimages_var.datalen, __LINE__);
-       int8_tArray *preimages_arr_ptr = (int8_tArray*)(((uint8_t*)preimages_arr) + 8);
-       for (size_t i = 0; i < preimages_var.datalen; i++) {
-               int8_tArray preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
-               memcpy(preimages_conv_8_arr->elems, preimages_var.data[i].data, 32);
-               preimages_arr_ptr[i] = preimages_conv_8_arr;
+       LDKCVec_ThirtyTwoBytesZ inbound_htlc_preimages_var = inbound_htlc_preimages;
+       ptrArray inbound_htlc_preimages_arr = NULL;
+       inbound_htlc_preimages_arr = init_ptrArray(inbound_htlc_preimages_var.datalen, __LINE__);
+       int8_tArray *inbound_htlc_preimages_arr_ptr = (int8_tArray*)(((uint8_t*)inbound_htlc_preimages_arr) + 8);
+       for (size_t i = 0; i < inbound_htlc_preimages_var.datalen; i++) {
+               int8_tArray inbound_htlc_preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
+               memcpy(inbound_htlc_preimages_conv_8_arr->elems, inbound_htlc_preimages_var.data[i].data, 32);
+               inbound_htlc_preimages_arr_ptr[i] = inbound_htlc_preimages_conv_8_arr;
+       }
+       
+       FREE(inbound_htlc_preimages_var.data);
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_var = outbound_htlc_preimages;
+       ptrArray outbound_htlc_preimages_arr = NULL;
+       outbound_htlc_preimages_arr = init_ptrArray(outbound_htlc_preimages_var.datalen, __LINE__);
+       int8_tArray *outbound_htlc_preimages_arr_ptr = (int8_tArray*)(((uint8_t*)outbound_htlc_preimages_arr) + 8);
+       for (size_t i = 0; i < outbound_htlc_preimages_var.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8_arr = init_int8_tArray(32, __LINE__);
+               memcpy(outbound_htlc_preimages_conv_8_arr->elems, outbound_htlc_preimages_var.data[i].data, 32);
+               outbound_htlc_preimages_arr_ptr[i] = outbound_htlc_preimages_conv_8_arr;
        }
        
-       FREE(preimages_var.data);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 5, commitment_tx_ref, (int64_t)preimages_arr);
+       FREE(outbound_htlc_preimages_var.data);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 6, commitment_tx_ref, (int64_t)inbound_htlc_preimages_arr, (int64_t)outbound_htlc_preimages_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret_conv = *(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_NoneNoneZ validate_counterparty_revocation_LDKEcdsaChannelSigner_jcall(const void* this_arg, uint64_t idx, const uint8_t (* secret)[32]) {
-       LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
-       int64_t idx_conv = idx;
-       int8_tArray secret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(secret_arr->elems, *secret, 32);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 6, idx_conv, (int64_t)secret_arr);
-       void* ret_ptr = untag_ptr(ret);
-       CHECK_ACCESS(ret_ptr);
-       LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
-       FREE(untag_ptr(ret));
-       return ret_conv;
-}
 LDKCResult_ECDSASignatureNoneZ sign_holder_commitment_LDKEcdsaChannelSigner_jcall(const void* this_arg, const LDKHolderCommitmentTransaction * commitment_tx) {
        LDKEcdsaChannelSigner_JCalls *j_calls = (LDKEcdsaChannelSigner_JCalls*) this_arg;
        LDKHolderCommitmentTransaction commitment_tx_var = *commitment_tx;
@@ -2061,7 +2072,6 @@ static inline LDKEcdsaChannelSigner LDKEcdsaChannelSigner_init (int64_t o, int64
        LDKEcdsaChannelSigner ret = {
                .this_arg = (void*) calls,
                .sign_counterparty_commitment = sign_counterparty_commitment_LDKEcdsaChannelSigner_jcall,
-               .validate_counterparty_revocation = validate_counterparty_revocation_LDKEcdsaChannelSigner_jcall,
                .sign_holder_commitment = sign_holder_commitment_LDKEcdsaChannelSigner_jcall,
                .sign_justice_revoked_output = sign_justice_revoked_output_LDKEcdsaChannelSigner_jcall,
                .sign_justice_revoked_htlc = sign_justice_revoked_htlc_LDKEcdsaChannelSigner_jcall,
@@ -2081,7 +2091,7 @@ uint64_t  CS_LDK_LDKEcdsaChannelSigner_new(int32_t o, int32_t ChannelSigner, int
        *res_ptr = LDKEcdsaChannelSigner_init(o, ChannelSigner, pubkeys);
        return tag_ptr(res_ptr, true);
 }
-int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment(int64_t this_arg, int64_t commitment_tx, ptrArray preimages) {
+int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment(int64_t this_arg, int64_t commitment_tx, ptrArray inbound_htlc_preimages, ptrArray outbound_htlc_preimages) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKEcdsaChannelSigner* this_arg_conv = (LDKEcdsaChannelSigner*)this_arg_ptr;
@@ -2090,36 +2100,38 @@ int64_t  CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment(int64_t this_arg
        commitment_tx_conv.is_owned = ptr_is_owned(commitment_tx);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(commitment_tx_conv);
        commitment_tx_conv.is_owned = false;
-       LDKCVec_ThirtyTwoBytesZ preimages_constr;
-       preimages_constr.datalen = preimages->arr_len;
-       if (preimages_constr.datalen > 0)
-               preimages_constr.data = MALLOC(preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       LDKCVec_ThirtyTwoBytesZ inbound_htlc_preimages_constr;
+       inbound_htlc_preimages_constr.datalen = inbound_htlc_preimages->arr_len;
+       if (inbound_htlc_preimages_constr.datalen > 0)
+               inbound_htlc_preimages_constr.data = MALLOC(inbound_htlc_preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
        else
-               preimages_constr.data = NULL;
-       int8_tArray* preimages_vals = (void*) preimages->elems;
-       for (size_t i = 0; i < preimages_constr.datalen; i++) {
-               int8_tArray preimages_conv_8 = preimages_vals[i];
-               LDKThirtyTwoBytes preimages_conv_8_ref;
-               CHECK(preimages_conv_8->arr_len == 32);
-               memcpy(preimages_conv_8_ref.data, preimages_conv_8->elems, 32); FREE(preimages_conv_8);
-               preimages_constr.data[i] = preimages_conv_8_ref;
-       }
-       FREE(preimages);
+               inbound_htlc_preimages_constr.data = NULL;
+       int8_tArray* inbound_htlc_preimages_vals = (void*) inbound_htlc_preimages->elems;
+       for (size_t i = 0; i < inbound_htlc_preimages_constr.datalen; i++) {
+               int8_tArray inbound_htlc_preimages_conv_8 = inbound_htlc_preimages_vals[i];
+               LDKThirtyTwoBytes inbound_htlc_preimages_conv_8_ref;
+               CHECK(inbound_htlc_preimages_conv_8->arr_len == 32);
+               memcpy(inbound_htlc_preimages_conv_8_ref.data, inbound_htlc_preimages_conv_8->elems, 32); FREE(inbound_htlc_preimages_conv_8);
+               inbound_htlc_preimages_constr.data[i] = inbound_htlc_preimages_conv_8_ref;
+       }
+       FREE(inbound_htlc_preimages);
+       LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages_constr;
+       outbound_htlc_preimages_constr.datalen = outbound_htlc_preimages->arr_len;
+       if (outbound_htlc_preimages_constr.datalen > 0)
+               outbound_htlc_preimages_constr.data = MALLOC(outbound_htlc_preimages_constr.datalen * sizeof(LDKThirtyTwoBytes), "LDKCVec_ThirtyTwoBytesZ Elements");
+       else
+               outbound_htlc_preimages_constr.data = NULL;
+       int8_tArray* outbound_htlc_preimages_vals = (void*) outbound_htlc_preimages->elems;
+       for (size_t i = 0; i < outbound_htlc_preimages_constr.datalen; i++) {
+               int8_tArray outbound_htlc_preimages_conv_8 = outbound_htlc_preimages_vals[i];
+               LDKThirtyTwoBytes outbound_htlc_preimages_conv_8_ref;
+               CHECK(outbound_htlc_preimages_conv_8->arr_len == 32);
+               memcpy(outbound_htlc_preimages_conv_8_ref.data, outbound_htlc_preimages_conv_8->elems, 32); FREE(outbound_htlc_preimages_conv_8);
+               outbound_htlc_preimages_constr.data[i] = outbound_htlc_preimages_conv_8_ref;
+       }
+       FREE(outbound_htlc_preimages);
        LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = (this_arg_conv->sign_counterparty_commitment)(this_arg_conv->this_arg, &commitment_tx_conv, preimages_constr);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_EcdsaChannelSigner_validate_counterparty_revocation(int64_t this_arg, int64_t idx, int8_tArray secret) {
-       void* this_arg_ptr = untag_ptr(this_arg);
-       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
-       LDKEcdsaChannelSigner* this_arg_conv = (LDKEcdsaChannelSigner*)this_arg_ptr;
-       uint8_t secret_arr[32];
-       CHECK(secret->arr_len == 32);
-       memcpy(secret_arr, secret->elems, 32); FREE(secret);
-       uint8_t (*secret_ref)[32] = &secret_arr;
-       LDKCResult_NoneNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneNoneZ), "LDKCResult_NoneNoneZ");
-       *ret_conv = (this_arg_conv->validate_counterparty_revocation)(this_arg_conv->this_arg, idx, secret_ref);
+       *ret_conv = (this_arg_conv->sign_counterparty_commitment)(this_arg_conv->this_arg, &commitment_tx_conv, inbound_htlc_preimages_constr, outbound_htlc_preimages_constr);
        return tag_ptr(ret_conv, true);
 }
 
@@ -2421,42 +2433,26 @@ jboolean CS_LDK_LDKCOption_boolZ_Some_get_some(int64_t ptr) {
        jboolean some_conv = obj->some;
        return some_conv;
 }
-static inline LDKCVec_CVec_u8ZZ CVec_CVec_u8ZZ_clone(const LDKCVec_CVec_u8ZZ *orig) {
-       LDKCVec_CVec_u8ZZ ret = { .data = MALLOC(sizeof(LDKCVec_u8Z) * orig->datalen, "LDKCVec_CVec_u8ZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = CVec_u8Z_clone(&orig->data[i]);
-       }
-       return ret;
-}
-static inline struct LDKCVec_CVec_u8ZZ CResult_CVec_CVec_u8ZZNoneZ_get_ok(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR owner){
+static inline struct LDKWitness CResult_WitnessNoneZ_get_ok(LDKCResult_WitnessNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return CVec_CVec_u8ZZ_clone(&*owner->contents.result);
+       return Witness_clone(&*owner->contents.result);
 }
-ptrArray  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_get_ok(int64_t owner) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* owner_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(owner);
-       LDKCVec_CVec_u8ZZ ret_var = CResult_CVec_CVec_u8ZZNoneZ_get_ok(owner_conv);
-       ptrArray ret_arr = NULL;
-       ret_arr = init_ptrArray(ret_var.datalen, __LINE__);
-       int8_tArray *ret_arr_ptr = (int8_tArray*)(((uint8_t*)ret_arr) + 8);
-       for (size_t i = 0; i < ret_var.datalen; i++) {
-               LDKCVec_u8Z ret_conv_8_var = ret_var.data[i];
-               int8_tArray ret_conv_8_arr = init_int8_tArray(ret_conv_8_var.datalen, __LINE__);
-               memcpy(ret_conv_8_arr->elems, ret_conv_8_var.data, ret_conv_8_var.datalen);
-               CVec_u8Z_free(ret_conv_8_var);
-               ret_arr_ptr[i] = ret_conv_8_arr;
-       }
-       
-       FREE(ret_var.data);
+int8_tArray  CS_LDK_CResult_WitnessNoneZ_get_ok(int64_t owner) {
+       LDKCResult_WitnessNoneZ* owner_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(owner);
+       LDKWitness ret_var = CResult_WitnessNoneZ_get_ok(owner_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       Witness_free(ret_var);
        return ret_arr;
 }
 
-static inline void CResult_CVec_CVec_u8ZZNoneZ_get_err(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR owner){
+static inline void CResult_WitnessNoneZ_get_err(LDKCResult_WitnessNoneZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return *owner->contents.err;
 }
-void  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_get_err(int64_t owner) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* owner_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(owner);
-       CResult_CVec_CVec_u8ZZNoneZ_get_err(owner_conv);
+void  CS_LDK_CResult_WitnessNoneZ_get_err(int64_t owner) {
+       LDKCResult_WitnessNoneZ* owner_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(owner);
+       CResult_WitnessNoneZ_get_err(owner_conv);
 }
 
 static inline struct LDKInMemorySigner CResult_InMemorySignerDecodeErrorZ_get_ok(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner){
@@ -2506,6 +2502,62 @@ void  CS_LDK_CResult_TransactionNoneZ_get_err(int64_t owner) {
        CResult_TransactionNoneZ_get_err(owner_conv);
 }
 
+uint32_t CS_LDK_LDKCandidateRouteHop_ty_from_ptr(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKCandidateRouteHop_FirstHop: return 0;
+               case LDKCandidateRouteHop_PublicHop: return 1;
+               case LDKCandidateRouteHop_PrivateHop: return 2;
+               case LDKCandidateRouteHop_Blinded: return 3;
+               case LDKCandidateRouteHop_OneHopBlinded: return 4;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKCandidateRouteHop_FirstHop_get_first_hop(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_FirstHop);
+       LDKFirstHopCandidate first_hop_var = obj->first_hop;
+                       int64_t first_hop_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(first_hop_var);
+                       first_hop_ref = tag_ptr(first_hop_var.inner, false);
+       return first_hop_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_PublicHop_get_public_hop(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_PublicHop);
+       LDKPublicHopCandidate public_hop_var = obj->public_hop;
+                       int64_t public_hop_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(public_hop_var);
+                       public_hop_ref = tag_ptr(public_hop_var.inner, false);
+       return public_hop_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_PrivateHop_get_private_hop(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_PrivateHop);
+       LDKPrivateHopCandidate private_hop_var = obj->private_hop;
+                       int64_t private_hop_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(private_hop_var);
+                       private_hop_ref = tag_ptr(private_hop_var.inner, false);
+       return private_hop_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_Blinded_get_blinded(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_Blinded);
+       LDKBlindedPathCandidate blinded_var = obj->blinded;
+                       int64_t blinded_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_var);
+                       blinded_ref = tag_ptr(blinded_var.inner, false);
+       return blinded_ref;
+}
+int64_t CS_LDK_LDKCandidateRouteHop_OneHopBlinded_get_one_hop_blinded(int64_t ptr) {
+       LDKCandidateRouteHop *obj = (LDKCandidateRouteHop*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKCandidateRouteHop_OneHopBlinded);
+       LDKOneHopBlindedPathCandidate one_hop_blinded_var = obj->one_hop_blinded;
+                       int64_t one_hop_blinded_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(one_hop_blinded_var);
+                       one_hop_blinded_ref = tag_ptr(one_hop_blinded_var.inner, false);
+       return one_hop_blinded_ref;
+}
 typedef struct LDKScoreLookUp_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -2516,19 +2568,11 @@ static void LDKScoreLookUp_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-uint64_t channel_penalty_msat_LDKScoreLookUp_jcall(const void* this_arg, uint64_t short_channel_id, const LDKNodeId * source, const LDKNodeId * target, LDKChannelUsage usage, const LDKProbabilisticScoringFeeParameters * score_params) {
+uint64_t channel_penalty_msat_LDKScoreLookUp_jcall(const void* this_arg, const LDKCandidateRouteHop * candidate, LDKChannelUsage usage, const LDKProbabilisticScoringFeeParameters * score_params) {
        LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) this_arg;
-       int64_t short_channel_id_conv = short_channel_id;
-       LDKNodeId source_var = *source;
-       int64_t source_ref = 0;
-       source_var = NodeId_clone(&source_var);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(source_var);
-       source_ref = tag_ptr(source_var.inner, source_var.is_owned);
-       LDKNodeId target_var = *target;
-       int64_t target_ref = 0;
-       target_var = NodeId_clone(&target_var);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(target_var);
-       target_ref = tag_ptr(target_var.inner, target_var.is_owned);
+       LDKCandidateRouteHop *ret_candidate = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop ret conversion");
+       *ret_candidate = CandidateRouteHop_clone(candidate);
+       int64_t ref_candidate = tag_ptr(ret_candidate, true);
        LDKChannelUsage usage_var = usage;
        int64_t usage_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(usage_var);
@@ -2538,7 +2582,7 @@ uint64_t channel_penalty_msat_LDKScoreLookUp_jcall(const void* this_arg, uint64_
        score_params_var = ProbabilisticScoringFeeParameters_clone(&score_params_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(score_params_var);
        score_params_ref = tag_ptr(score_params_var.inner, score_params_var.is_owned);
-       return js_invoke_function_l_lllll(j_calls->instance_ptr, 16, short_channel_id_conv, source_ref, target_ref, usage_ref, score_params_ref);
+       return js_invoke_function_l_lll(j_calls->instance_ptr, 16, ref_candidate, usage_ref, score_params_ref);
 }
 static void LDKScoreLookUp_JCalls_cloned(LDKScoreLookUp* new_obj) {
        LDKScoreLookUp_JCalls *j_calls = (LDKScoreLookUp_JCalls*) new_obj->this_arg;
@@ -2561,20 +2605,11 @@ uint64_t  CS_LDK_LDKScoreLookUp_new(int32_t o) {
        *res_ptr = LDKScoreLookUp_init(o);
        return tag_ptr(res_ptr, true);
 }
-int64_t  CS_LDK_ScoreLookUp_channel_penalty_msat(int64_t this_arg, int64_t short_channel_id, int64_t source, int64_t target, int64_t usage, int64_t score_params) {
+int64_t  CS_LDK_ScoreLookUp_channel_penalty_msat(int64_t this_arg, int64_t candidate, int64_t usage, int64_t score_params) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreLookUp* this_arg_conv = (LDKScoreLookUp*)this_arg_ptr;
-       LDKNodeId source_conv;
-       source_conv.inner = untag_ptr(source);
-       source_conv.is_owned = ptr_is_owned(source);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(source_conv);
-       source_conv.is_owned = false;
-       LDKNodeId target_conv;
-       target_conv.inner = untag_ptr(target);
-       target_conv.is_owned = ptr_is_owned(target);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(target_conv);
-       target_conv.is_owned = false;
+       LDKCandidateRouteHop* candidate_conv = (LDKCandidateRouteHop*)untag_ptr(candidate);
        LDKChannelUsage usage_conv;
        usage_conv.inner = untag_ptr(usage);
        usage_conv.is_owned = ptr_is_owned(usage);
@@ -2585,7 +2620,7 @@ int64_t  CS_LDK_ScoreLookUp_channel_penalty_msat(int64_t this_arg, int64_t short
        score_params_conv.is_owned = ptr_is_owned(score_params);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(score_params_conv);
        score_params_conv.is_owned = false;
-       int64_t ret_conv = (this_arg_conv->channel_penalty_msat)(this_arg_conv->this_arg, short_channel_id, &source_conv, &target_conv, usage_conv, &score_params_conv);
+       int64_t ret_conv = (this_arg_conv->channel_penalty_msat)(this_arg_conv->this_arg, candidate_conv, usage_conv, &score_params_conv);
        return ret_conv;
 }
 
@@ -2599,7 +2634,7 @@ static void LDKScoreUpdate_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
@@ -2607,18 +2642,20 @@ void payment_path_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * pa
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
        int64_t short_channel_id_conv = short_channel_id;
-       js_invoke_function_void_ll(j_calls->instance_ptr, 17, path_ref, short_channel_id_conv);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_lll(j_calls->instance_ptr, 17, path_ref, short_channel_id_conv, duration_since_epoch_conv);
 }
-void payment_path_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+void payment_path_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
        path_var = Path_clone(&path_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 18, path_ref);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_ll(j_calls->instance_ptr, 18, path_ref, duration_since_epoch_conv);
 }
-void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id) {
+void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t short_channel_id, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
@@ -2626,16 +2663,23 @@ void probe_failed_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uin
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
        int64_t short_channel_id_conv = short_channel_id;
-       js_invoke_function_void_ll(j_calls->instance_ptr, 19, path_ref, short_channel_id_conv);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_lll(j_calls->instance_ptr, 19, path_ref, short_channel_id_conv, duration_since_epoch_conv);
 }
-void probe_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path) {
+void probe_successful_LDKScoreUpdate_jcall(void* this_arg, const LDKPath * path, uint64_t duration_since_epoch) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
        LDKPath path_var = *path;
        int64_t path_ref = 0;
        path_var = Path_clone(&path_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_var);
        path_ref = tag_ptr(path_var.inner, path_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 20, path_ref);
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_ll(j_calls->instance_ptr, 20, path_ref, duration_since_epoch_conv);
+}
+void time_passed_LDKScoreUpdate_jcall(void* this_arg, uint64_t duration_since_epoch) {
+       LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) this_arg;
+       int64_t duration_since_epoch_conv = duration_since_epoch;
+       js_invoke_function_void_l(j_calls->instance_ptr, 21, duration_since_epoch_conv);
 }
 static void LDKScoreUpdate_JCalls_cloned(LDKScoreUpdate* new_obj) {
        LDKScoreUpdate_JCalls *j_calls = (LDKScoreUpdate_JCalls*) new_obj->this_arg;
@@ -2652,6 +2696,7 @@ static inline LDKScoreUpdate LDKScoreUpdate_init (int64_t o) {
                .payment_path_successful = payment_path_successful_LDKScoreUpdate_jcall,
                .probe_failed = probe_failed_LDKScoreUpdate_jcall,
                .probe_successful = probe_successful_LDKScoreUpdate_jcall,
+               .time_passed = time_passed_LDKScoreUpdate_jcall,
                .free = LDKScoreUpdate_JCalls_free,
        };
        return ret;
@@ -2661,7 +2706,7 @@ uint64_t  CS_LDK_LDKScoreUpdate_new(int32_t o) {
        *res_ptr = LDKScoreUpdate_init(o);
        return tag_ptr(res_ptr, true);
 }
-void  CS_LDK_ScoreUpdate_payment_path_failed(int64_t this_arg, int64_t path, int64_t short_channel_id) {
+void  CS_LDK_ScoreUpdate_payment_path_failed(int64_t this_arg, int64_t path, int64_t short_channel_id, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2670,10 +2715,10 @@ void  CS_LDK_ScoreUpdate_payment_path_failed(int64_t this_arg, int64_t path, int
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->payment_path_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+       (this_arg_conv->payment_path_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id, duration_since_epoch);
 }
 
-void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path) {
+void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2682,10 +2727,10 @@ void  CS_LDK_ScoreUpdate_payment_path_successful(int64_t this_arg, int64_t path)
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->payment_path_successful)(this_arg_conv->this_arg, &path_conv);
+       (this_arg_conv->payment_path_successful)(this_arg_conv->this_arg, &path_conv, duration_since_epoch);
 }
 
-void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t short_channel_id) {
+void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t short_channel_id, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2694,10 +2739,10 @@ void  CS_LDK_ScoreUpdate_probe_failed(int64_t this_arg, int64_t path, int64_t sh
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->probe_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id);
+       (this_arg_conv->probe_failed)(this_arg_conv->this_arg, &path_conv, short_channel_id, duration_since_epoch);
 }
 
-void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path) {
+void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path, int64_t duration_since_epoch) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
@@ -2706,7 +2751,14 @@ void  CS_LDK_ScoreUpdate_probe_successful(int64_t this_arg, int64_t path) {
        path_conv.is_owned = ptr_is_owned(path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
        path_conv.is_owned = false;
-       (this_arg_conv->probe_successful)(this_arg_conv->this_arg, &path_conv);
+       (this_arg_conv->probe_successful)(this_arg_conv->this_arg, &path_conv, duration_since_epoch);
+}
+
+void  CS_LDK_ScoreUpdate_time_passed(int64_t this_arg, int64_t duration_since_epoch) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKScoreUpdate* this_arg_conv = (LDKScoreUpdate*)this_arg_ptr;
+       (this_arg_conv->time_passed)(this_arg_conv->this_arg, duration_since_epoch);
 }
 
 typedef struct LDKLockableScore_JCalls {
@@ -2721,7 +2773,7 @@ static void LDKLockableScore_JCalls_free(void* this_arg) {
 }
 LDKScoreLookUp read_lock_LDKLockableScore_jcall(const void* this_arg) {
        LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 21);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 22);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKScoreLookUp ret_conv = *(LDKScoreLookUp*)(ret_ptr);
@@ -2734,7 +2786,7 @@ LDKScoreLookUp read_lock_LDKLockableScore_jcall(const void* this_arg) {
 }
 LDKScoreUpdate write_lock_LDKLockableScore_jcall(const void* this_arg) {
        LDKLockableScore_JCalls *j_calls = (LDKLockableScore_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 22);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 23);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKScoreUpdate ret_conv = *(LDKScoreUpdate*)(ret_ptr);
@@ -2798,7 +2850,7 @@ static void LDKWriteableScore_JCalls_free(void* this_arg) {
 }
 LDKCVec_u8Z write_LDKWriteableScore_jcall(const void* this_arg) {
        LDKWriteableScore_JCalls *j_calls = (LDKWriteableScore_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 23);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 24);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
@@ -2914,6 +2966,124 @@ int64_t  CS_LDK_CResult_RouteLightningErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKBlindedPayInfo C2Tuple_BlindedPayInfoBlindedPathZ_get_a(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPayInfo ret = owner->a;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_a(int64_t owner) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPayInfo ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_a(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKBlindedPath C2Tuple_BlindedPayInfoBlindedPathZ_get_b(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
+       LDKBlindedPath ret = owner->b;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_b(int64_t owner) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
+       LDKBlindedPath ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_b(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_clone(const LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ *orig) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ) * orig->datalen, "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_BlindedPayInfoBlindedPathZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
+static inline struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* owner_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(owner);
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ ret_var = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(owner_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t l = 0; l < ret_var.datalen; l++) {
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv_37_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+               *ret_conv_37_conv = ret_var.data[l];
+               ret_arr_ptr[l] = tag_ptr(ret_conv_37_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* owner_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(owner);
+       CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKOnionMessagePath CResult_OnionMessagePathNoneZ_get_ok(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
+       LDKOnionMessagePath ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_get_ok(int64_t owner) {
+       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
+       LDKOnionMessagePath ret_var = CResult_OnionMessagePathNoneZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline void CResult_OnionMessagePathNoneZ_get_err(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_OnionMessagePathNoneZ_get_err(int64_t owner) {
+       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
+       CResult_OnionMessagePathNoneZ_get_err(owner_conv);
+}
+
+static inline struct LDKCVec_BlindedPathZ CResult_CVec_BlindedPathZNoneZ_get_ok(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return CVec_BlindedPathZ_clone(&*owner->contents.result);
+}
+int64_tArray  CS_LDK_CResult_CVec_BlindedPathZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_CVec_BlindedPathZNoneZ* owner_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(owner);
+       LDKCVec_BlindedPathZ ret_var = CResult_CVec_BlindedPathZNoneZ_get_ok(owner_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t n = 0; n < ret_var.datalen; n++) {
+               LDKBlindedPath ret_conv_13_var = ret_var.data[n];
+               int64_t ret_conv_13_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_conv_13_var);
+               ret_conv_13_ref = tag_ptr(ret_conv_13_var.inner, ret_conv_13_var.is_owned);
+               ret_arr_ptr[n] = ret_conv_13_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline void CResult_CVec_BlindedPathZNoneZ_get_err(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return *owner->contents.err;
+}
+void  CS_LDK_CResult_CVec_BlindedPathZNoneZ_get_err(int64_t owner) {
+       LDKCResult_CVec_BlindedPathZNoneZ* owner_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(owner);
+       CResult_CVec_BlindedPathZNoneZ_get_err(owner_conv);
+}
+
 static inline struct LDKInFlightHtlcs CResult_InFlightHtlcsDecodeErrorZ_get_ok(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner){
        LDKInFlightHtlcs ret = *owner->contents.result;
        ret.is_owned = false;
@@ -3096,41 +3266,6 @@ int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
-static inline struct LDKBlindedPayInfo C2Tuple_BlindedPayInfoBlindedPathZ_get_a(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
-       LDKBlindedPayInfo ret = owner->a;
-       ret.is_owned = false;
-       return ret;
-}
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_a(int64_t owner) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
-       LDKBlindedPayInfo ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_a(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
-}
-
-static inline struct LDKBlindedPath C2Tuple_BlindedPayInfoBlindedPathZ_get_b(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner){
-       LDKBlindedPath ret = owner->b;
-       ret.is_owned = false;
-       return ret;
-}
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_b(int64_t owner) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* owner_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(owner);
-       LDKBlindedPath ret_var = C2Tuple_BlindedPayInfoBlindedPathZ_get_b(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
-}
-
-static inline LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_clone(const LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ *orig) {
-       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ) * orig->datalen, "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ clone bytes"), .datalen = orig->datalen };
-       for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C2Tuple_BlindedPayInfoBlindedPathZ_clone(&orig->data[i]);
-       }
-       return ret;
-}
 static inline LDKCVec_RouteHintZ CVec_RouteHintZ_clone(const LDKCVec_RouteHintZ *orig) {
        LDKCVec_RouteHintZ ret = { .data = MALLOC(sizeof(LDKRouteHint) * orig->datalen, "LDKCVec_RouteHintZ clone bytes"), .datalen = orig->datalen };
        for (size_t i = 0; i < ret.datalen; i++) {
@@ -3343,14 +3478,13 @@ static void LDKLogger_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
-void log_LDKLogger_jcall(const void* this_arg, const LDKRecord * record) {
+void log_LDKLogger_jcall(const void* this_arg, LDKRecord record) {
        LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) this_arg;
-       LDKRecord record_var = *record;
+       LDKRecord record_var = record;
        int64_t record_ref = 0;
-       record_var = Record_clone(&record_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(record_var);
        record_ref = tag_ptr(record_var.inner, record_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 24, record_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 25, record_ref);
 }
 static void LDKLogger_JCalls_cloned(LDKLogger* new_obj) {
        LDKLogger_JCalls *j_calls = (LDKLogger_JCalls*) new_obj->this_arg;
@@ -3426,31 +3560,40 @@ static inline LDKCVec_C2Tuple_usizeTransactionZZ CVec_C2Tuple_usizeTransactionZZ
        }
        return ret;
 }
-static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
+static inline struct LDKThirtyTwoBytes C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
        return ThirtyTwoBytes_clone(&owner->a);
 }
-int8_tArray  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(int64_t owner) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+int8_tArray  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(owner);
        int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(ret_arr->elems, C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(owner_conv).data, 32);
+       memcpy(ret_arr->elems, C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(owner_conv).data, 32);
        return ret_arr;
 }
 
-static inline struct LDKCOption_ThirtyTwoBytesZ C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
-       return COption_ThirtyTwoBytesZ_clone(&owner->b);
+static inline uint32_t C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
+       return owner->b;
 }
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(int64_t owner) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* owner_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+int32_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(owner);
+       int32_t ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(owner_conv);
+       return ret_conv;
+}
+
+static inline struct LDKCOption_ThirtyTwoBytesZ C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner){
+       return COption_ThirtyTwoBytesZ_clone(&owner->c);
+}
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(owner);
        LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
-       *ret_copy = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(owner_conv);
+       *ret_copy = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(owner_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
 
-static inline LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_clone(const LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ *orig) {
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ) * orig->datalen, "LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ clone bytes"), .datalen = orig->datalen };
+static inline LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_clone(const LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ *orig) {
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret = { .data = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ) * orig->datalen, "LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ clone bytes"), .datalen = orig->datalen };
        for (size_t i = 0; i < ret.datalen; i++) {
-               ret.data[i] = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(&orig->data[i]);
+               ret.data[i] = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(&orig->data[i]);
        }
        return ret;
 }
@@ -3972,7 +4115,7 @@ LDKUtxoResult get_utxo_LDKUtxoLookup_jcall(const void* this_arg, const uint8_t (
        int8_tArray chain_hash_arr = init_int8_tArray(32, __LINE__);
        memcpy(chain_hash_arr->elems, *chain_hash, 32);
        int64_t short_channel_id_conv = short_channel_id;
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 25, (int64_t)chain_hash_arr, short_channel_id_conv);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 26, (int64_t)chain_hash_arr, short_channel_id_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKUtxoResult ret_conv = *(LDKUtxoResult*)(ret_ptr);
@@ -4209,32 +4352,36 @@ uint32_t CS_LDK_LDKMessageSendEvent_ty_from_ptr(int64_t ptr) {
                case LDKMessageSendEvent_SendOpenChannelV2: return 3;
                case LDKMessageSendEvent_SendFundingCreated: return 4;
                case LDKMessageSendEvent_SendFundingSigned: return 5;
-               case LDKMessageSendEvent_SendTxAddInput: return 6;
-               case LDKMessageSendEvent_SendTxAddOutput: return 7;
-               case LDKMessageSendEvent_SendTxRemoveInput: return 8;
-               case LDKMessageSendEvent_SendTxRemoveOutput: return 9;
-               case LDKMessageSendEvent_SendTxComplete: return 10;
-               case LDKMessageSendEvent_SendTxSignatures: return 11;
-               case LDKMessageSendEvent_SendTxInitRbf: return 12;
-               case LDKMessageSendEvent_SendTxAckRbf: return 13;
-               case LDKMessageSendEvent_SendTxAbort: return 14;
-               case LDKMessageSendEvent_SendChannelReady: return 15;
-               case LDKMessageSendEvent_SendAnnouncementSignatures: return 16;
-               case LDKMessageSendEvent_UpdateHTLCs: return 17;
-               case LDKMessageSendEvent_SendRevokeAndACK: return 18;
-               case LDKMessageSendEvent_SendClosingSigned: return 19;
-               case LDKMessageSendEvent_SendShutdown: return 20;
-               case LDKMessageSendEvent_SendChannelReestablish: return 21;
-               case LDKMessageSendEvent_SendChannelAnnouncement: return 22;
-               case LDKMessageSendEvent_BroadcastChannelAnnouncement: return 23;
-               case LDKMessageSendEvent_BroadcastChannelUpdate: return 24;
-               case LDKMessageSendEvent_BroadcastNodeAnnouncement: return 25;
-               case LDKMessageSendEvent_SendChannelUpdate: return 26;
-               case LDKMessageSendEvent_HandleError: return 27;
-               case LDKMessageSendEvent_SendChannelRangeQuery: return 28;
-               case LDKMessageSendEvent_SendShortIdsQuery: return 29;
-               case LDKMessageSendEvent_SendReplyChannelRange: return 30;
-               case LDKMessageSendEvent_SendGossipTimestampFilter: return 31;
+               case LDKMessageSendEvent_SendStfu: return 6;
+               case LDKMessageSendEvent_SendSplice: return 7;
+               case LDKMessageSendEvent_SendSpliceAck: return 8;
+               case LDKMessageSendEvent_SendSpliceLocked: return 9;
+               case LDKMessageSendEvent_SendTxAddInput: return 10;
+               case LDKMessageSendEvent_SendTxAddOutput: return 11;
+               case LDKMessageSendEvent_SendTxRemoveInput: return 12;
+               case LDKMessageSendEvent_SendTxRemoveOutput: return 13;
+               case LDKMessageSendEvent_SendTxComplete: return 14;
+               case LDKMessageSendEvent_SendTxSignatures: return 15;
+               case LDKMessageSendEvent_SendTxInitRbf: return 16;
+               case LDKMessageSendEvent_SendTxAckRbf: return 17;
+               case LDKMessageSendEvent_SendTxAbort: return 18;
+               case LDKMessageSendEvent_SendChannelReady: return 19;
+               case LDKMessageSendEvent_SendAnnouncementSignatures: return 20;
+               case LDKMessageSendEvent_UpdateHTLCs: return 21;
+               case LDKMessageSendEvent_SendRevokeAndACK: return 22;
+               case LDKMessageSendEvent_SendClosingSigned: return 23;
+               case LDKMessageSendEvent_SendShutdown: return 24;
+               case LDKMessageSendEvent_SendChannelReestablish: return 25;
+               case LDKMessageSendEvent_SendChannelAnnouncement: return 26;
+               case LDKMessageSendEvent_BroadcastChannelAnnouncement: return 27;
+               case LDKMessageSendEvent_BroadcastChannelUpdate: return 28;
+               case LDKMessageSendEvent_BroadcastNodeAnnouncement: return 29;
+               case LDKMessageSendEvent_SendChannelUpdate: return 30;
+               case LDKMessageSendEvent_HandleError: return 31;
+               case LDKMessageSendEvent_SendChannelRangeQuery: return 32;
+               case LDKMessageSendEvent_SendShortIdsQuery: return 33;
+               case LDKMessageSendEvent_SendReplyChannelRange: return 34;
+               case LDKMessageSendEvent_SendGossipTimestampFilter: return 35;
                default: abort();
        }
 }
@@ -4334,6 +4481,70 @@ int64_t CS_LDK_LDKMessageSendEvent_SendFundingSigned_get_msg(int64_t ptr) {
                        msg_ref = tag_ptr(msg_var.inner, false);
        return msg_ref;
 }
+int8_tArray CS_LDK_LDKMessageSendEvent_SendStfu_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendStfu);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_stfu.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendStfu_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendStfu);
+       LDKStfu msg_var = obj->send_stfu.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendSplice_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSplice);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_splice.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendSplice_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSplice);
+       LDKSplice msg_var = obj->send_splice.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendSpliceAck_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceAck);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_splice_ack.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendSpliceAck_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceAck);
+       LDKSpliceAck msg_var = obj->send_splice_ack.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
+int8_tArray CS_LDK_LDKMessageSendEvent_SendSpliceLocked_get_node_id(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceLocked);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->send_splice_locked.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_t CS_LDK_LDKMessageSendEvent_SendSpliceLocked_get_msg(int64_t ptr) {
+       LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKMessageSendEvent_SendSpliceLocked);
+       LDKSpliceLocked msg_var = obj->send_splice_locked.msg;
+                       int64_t msg_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+                       msg_ref = tag_ptr(msg_var.inner, false);
+       return msg_ref;
+}
 int8_tArray CS_LDK_LDKMessageSendEvent_SendTxAddInput_get_node_id(int64_t ptr) {
        LDKMessageSendEvent *obj = (LDKMessageSendEvent*)untag_ptr(ptr);
        CHECK(obj->tag == LDKMessageSendEvent_SendTxAddInput);
@@ -5046,6 +5257,34 @@ int64_tArray CS_LDK_LDKCOption_CVec_SocketAddressZZ_Some_get_some(int64_t ptr) {
                        
        return some_arr;
 }
+static inline struct LDKPendingHTLCInfo CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(LDKCResult_PendingHTLCInfoInboundHTLCErrZ *NONNULL_PTR owner){
+       LDKPendingHTLCInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(int64_t owner) {
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* owner_conv = (LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)untag_ptr(owner);
+       LDKPendingHTLCInfo ret_var = CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKInboundHTLCErr CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(LDKCResult_PendingHTLCInfoInboundHTLCErrZ *NONNULL_PTR owner){
+       LDKInboundHTLCErr ret = *owner->contents.err;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(int64_t owner) {
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* owner_conv = (LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)untag_ptr(owner);
+       LDKInboundHTLCErr ret_var = CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 static inline LDKCVec_HTLCOutputInCommitmentZ CVec_HTLCOutputInCommitmentZ_clone(const LDKCVec_HTLCOutputInCommitmentZ *orig) {
        LDKCVec_HTLCOutputInCommitmentZ ret = { .data = MALLOC(sizeof(LDKHTLCOutputInCommitment) * orig->datalen, "LDKCVec_HTLCOutputInCommitmentZ clone bytes"), .datalen = orig->datalen };
        for (size_t i = 0; i < ret.datalen; i++) {
@@ -5845,6 +6084,231 @@ int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKBlindedForward CResult_BlindedForwardDecodeErrorZ_get_ok(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR owner){
+       LDKBlindedForward ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedForwardDecodeErrorZ* owner_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(owner);
+       LDKBlindedForward ret_var = CResult_BlindedForwardDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_BlindedForwardDecodeErrorZ_get_err(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedForwardDecodeErrorZ* owner_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedForwardDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+uint32_t CS_LDK_LDKPendingHTLCRouting_ty_from_ptr(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKPendingHTLCRouting_Forward: return 0;
+               case LDKPendingHTLCRouting_Receive: return 1;
+               case LDKPendingHTLCRouting_ReceiveKeysend: return 2;
+               default: abort();
+       }
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Forward_get_onion_packet(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Forward);
+       LDKOnionPacket onion_packet_var = obj->forward.onion_packet;
+                       int64_t onion_packet_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_packet_var);
+                       onion_packet_ref = tag_ptr(onion_packet_var.inner, false);
+       return onion_packet_ref;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Forward_get_short_channel_id(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Forward);
+       int64_t short_channel_id_conv = obj->forward.short_channel_id;
+       return short_channel_id_conv;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Forward_get_blinded(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Forward);
+       LDKBlindedForward blinded_var = obj->forward.blinded;
+                       int64_t blinded_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_var);
+                       blinded_ref = tag_ptr(blinded_var.inner, false);
+       return blinded_ref;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Receive_get_payment_data(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       LDKFinalOnionHopData payment_data_var = obj->receive.payment_data;
+                       int64_t payment_data_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_var);
+                       payment_data_ref = tag_ptr(payment_data_var.inner, false);
+       return payment_data_ref;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_Receive_get_payment_metadata(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       int64_t payment_metadata_ref = tag_ptr(&obj->receive.payment_metadata, false);
+       return payment_metadata_ref;
+}
+int32_t CS_LDK_LDKPendingHTLCRouting_Receive_get_incoming_cltv_expiry(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       int32_t incoming_cltv_expiry_conv = obj->receive.incoming_cltv_expiry;
+       return incoming_cltv_expiry_conv;
+}
+int8_tArray CS_LDK_LDKPendingHTLCRouting_Receive_get_phantom_shared_secret(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       int8_tArray phantom_shared_secret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(phantom_shared_secret_arr->elems, obj->receive.phantom_shared_secret.data, 32);
+       return phantom_shared_secret_arr;
+}
+int64_tArray CS_LDK_LDKPendingHTLCRouting_Receive_get_custom_tlvs(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_var = obj->receive.custom_tlvs;
+                       int64_tArray custom_tlvs_arr = NULL;
+                       custom_tlvs_arr = init_int64_tArray(custom_tlvs_var.datalen, __LINE__);
+                       int64_t *custom_tlvs_arr_ptr = (int64_t*)(((uint8_t*)custom_tlvs_arr) + 8);
+                       for (size_t x = 0; x < custom_tlvs_var.datalen; x++) {
+                               LDKC2Tuple_u64CVec_u8ZZ* custom_tlvs_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+                               *custom_tlvs_conv_23_conv = custom_tlvs_var.data[x];
+                               *custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone(custom_tlvs_conv_23_conv);
+                               custom_tlvs_arr_ptr[x] = tag_ptr(custom_tlvs_conv_23_conv, true);
+                       }
+                       
+       return custom_tlvs_arr;
+}
+jboolean CS_LDK_LDKPendingHTLCRouting_Receive_get_requires_blinded_error(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_Receive);
+       jboolean requires_blinded_error_conv = obj->receive.requires_blinded_error;
+       return requires_blinded_error_conv;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_data(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       LDKFinalOnionHopData payment_data_var = obj->receive_keysend.payment_data;
+                       int64_t payment_data_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_var);
+                       payment_data_ref = tag_ptr(payment_data_var.inner, false);
+       return payment_data_ref;
+}
+int8_tArray CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_preimage(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       int8_tArray payment_preimage_arr = init_int8_tArray(32, __LINE__);
+       memcpy(payment_preimage_arr->elems, obj->receive_keysend.payment_preimage.data, 32);
+       return payment_preimage_arr;
+}
+int64_t CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_metadata(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       int64_t payment_metadata_ref = tag_ptr(&obj->receive_keysend.payment_metadata, false);
+       return payment_metadata_ref;
+}
+int32_t CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_incoming_cltv_expiry(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       int32_t incoming_cltv_expiry_conv = obj->receive_keysend.incoming_cltv_expiry;
+       return incoming_cltv_expiry_conv;
+}
+int64_tArray CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_custom_tlvs(int64_t ptr) {
+       LDKPendingHTLCRouting *obj = (LDKPendingHTLCRouting*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKPendingHTLCRouting_ReceiveKeysend);
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_var = obj->receive_keysend.custom_tlvs;
+                       int64_tArray custom_tlvs_arr = NULL;
+                       custom_tlvs_arr = init_int64_tArray(custom_tlvs_var.datalen, __LINE__);
+                       int64_t *custom_tlvs_arr_ptr = (int64_t*)(((uint8_t*)custom_tlvs_arr) + 8);
+                       for (size_t x = 0; x < custom_tlvs_var.datalen; x++) {
+                               LDKC2Tuple_u64CVec_u8ZZ* custom_tlvs_conv_23_conv = MALLOC(sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKC2Tuple_u64CVec_u8ZZ");
+                               *custom_tlvs_conv_23_conv = custom_tlvs_var.data[x];
+                               *custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone(custom_tlvs_conv_23_conv);
+                               custom_tlvs_arr_ptr[x] = tag_ptr(custom_tlvs_conv_23_conv, true);
+                       }
+                       
+       return custom_tlvs_arr;
+}
+static inline struct LDKPendingHTLCRouting CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return PendingHTLCRouting_clone(&*owner->contents.result);
+}
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(owner);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_PendingHTLCRoutingDecodeErrorZ_get_err(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PendingHTLCRoutingDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKPendingHTLCInfo CResult_PendingHTLCInfoDecodeErrorZ_get_ok(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR owner){
+       LDKPendingHTLCInfo ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKPendingHTLCInfo ret_var = CResult_PendingHTLCInfoDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_PendingHTLCInfoDecodeErrorZ_get_err(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* owner_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_PendingHTLCInfoDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline enum LDKBlindedFailure CResult_BlindedFailureDecodeErrorZ_get_ok(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(owner->result_ok);
+       return BlindedFailure_clone(&*owner->contents.result);
+}
+int32_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_BlindedFailureDecodeErrorZ* owner_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(owner);
+       int32_t ret_conv = LDKBlindedFailure_to_cs(CResult_BlindedFailureDecodeErrorZ_get_ok(owner_conv));
+       return ret_conv;
+}
+
+static inline struct LDKDecodeError CResult_BlindedFailureDecodeErrorZ_get_err(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_BlindedFailureDecodeErrorZ* owner_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_BlindedFailureDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline enum LDKChannelShutdownState CResult_ChannelShutdownStateDecodeErrorZ_get_ok(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
        return ChannelShutdownState_clone(&*owner->contents.result);
@@ -5894,7 +6358,7 @@ LDKCResult_ChannelMonitorUpdateStatusNoneZ watch_channel_LDKWatch_jcall(const vo
        int64_t monitor_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(monitor_var);
        monitor_ref = tag_ptr(monitor_var.inner, monitor_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 26, funding_txo_ref, monitor_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 27, funding_txo_ref, monitor_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ChannelMonitorUpdateStatusNoneZ ret_conv = *(LDKCResult_ChannelMonitorUpdateStatusNoneZ*)(ret_ptr);
@@ -5912,13 +6376,13 @@ LDKChannelMonitorUpdateStatus update_channel_LDKWatch_jcall(const void* this_arg
        update_var = ChannelMonitorUpdate_clone(&update_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(update_var);
        update_ref = tag_ptr(update_var.inner, update_var.is_owned);
-       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_ll(j_calls->instance_ptr, 27, funding_txo_ref, update_ref);
+       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_ll(j_calls->instance_ptr, 28, funding_txo_ref, update_ref);
        LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
        return ret_conv;
 }
 LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ release_pending_monitor_events_LDKWatch_jcall(const void* this_arg) {
        LDKWatch_JCalls *j_calls = (LDKWatch_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 28);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 29);
        LDKCVec_C3Tuple_OutPointCVec_MonitorEventZPublicKeyZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -6040,7 +6504,7 @@ void broadcast_transactions_LDKBroadcasterInterface_jcall(const void* this_arg,
        }
        
        FREE(txs_var.data);
-       js_invoke_function_void_l(j_calls->instance_ptr, 29, (int64_t)txs_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 30, (int64_t)txs_arr);
 }
 static void LDKBroadcasterInterface_JCalls_cloned(LDKBroadcasterInterface* new_obj) {
        LDKBroadcasterInterface_JCalls *j_calls = (LDKBroadcasterInterface_JCalls*) new_obj->this_arg;
@@ -6099,7 +6563,7 @@ static void LDKEntropySource_JCalls_free(void* this_arg) {
 }
 LDKThirtyTwoBytes get_secure_random_bytes_LDKEntropySource_jcall(const void* this_arg) {
        LDKEntropySource_JCalls *j_calls = (LDKEntropySource_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 30);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 31);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -6183,7 +6647,7 @@ static void LDKNodeSigner_JCalls_free(void* this_arg) {
 }
 LDKThirtyTwoBytes get_inbound_payment_key_material_LDKNodeSigner_jcall(const void* this_arg) {
        LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 31);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 32);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -6192,7 +6656,7 @@ LDKThirtyTwoBytes get_inbound_payment_key_material_LDKNodeSigner_jcall(const voi
 LDKCResult_PublicKeyNoneZ get_node_id_LDKNodeSigner_jcall(const void* this_arg, LDKRecipient recipient) {
        LDKNodeSigner_JCalls *j_calls = (LDKNodeSigner_JCalls*) this_arg;
        int32_t recipient_conv = LDKRecipient_to_cs(recipient);
-       uint64_t ret = js_invoke_function_l_Recipient(j_calls->instance_ptr, 32, recipient_conv);
+       uint64_t ret = js_invoke_function_l_Recipient(j_calls->instance_ptr, 33, recipient_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_PublicKeyNoneZ ret_conv = *(LDKCResult_PublicKeyNoneZ*)(ret_ptr);
@@ -6207,7 +6671,7 @@ LDKCResult_ThirtyTwoBytesNoneZ ecdh_LDKNodeSigner_jcall(const void* this_arg, LD
        LDKCOption_BigEndianScalarZ *tweak_copy = MALLOC(sizeof(LDKCOption_BigEndianScalarZ), "LDKCOption_BigEndianScalarZ");
        *tweak_copy = tweak;
        int64_t tweak_ref = tag_ptr(tweak_copy, true);
-       uint64_t ret = js_invoke_function_l_Recipientll(j_calls->instance_ptr, 33, recipient_conv, (int64_t)other_key_arr, tweak_ref);
+       uint64_t ret = js_invoke_function_l_Recipientll(j_calls->instance_ptr, 34, recipient_conv, (int64_t)other_key_arr, tweak_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ThirtyTwoBytesNoneZ ret_conv = *(LDKCResult_ThirtyTwoBytesNoneZ*)(ret_ptr);
@@ -6230,7 +6694,7 @@ LDKCResult_RecoverableSignatureNoneZ sign_invoice_LDKNodeSigner_jcall(const void
        
        FREE(invoice_data_var.data);
        int32_t recipient_conv = LDKRecipient_to_cs(recipient);
-       uint64_t ret = js_invoke_function_l_llRecipient(j_calls->instance_ptr, 34, (int64_t)hrp_bytes_arr, (int64_t)invoice_data_arr, recipient_conv);
+       uint64_t ret = js_invoke_function_l_llRecipient(j_calls->instance_ptr, 35, (int64_t)hrp_bytes_arr, (int64_t)invoice_data_arr, recipient_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_RecoverableSignatureNoneZ ret_conv = *(LDKCResult_RecoverableSignatureNoneZ*)(ret_ptr);
@@ -6244,7 +6708,7 @@ LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_request_LDKNodeSigner_jcall
        // WARNING: we may need a move here but no clone is available for LDKUnsignedInvoiceRequest
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_request_var);
        invoice_request_ref = tag_ptr(invoice_request_var.inner, invoice_request_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 35, invoice_request_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 36, invoice_request_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
@@ -6258,7 +6722,7 @@ LDKCResult_SchnorrSignatureNoneZ sign_bolt12_invoice_LDKNodeSigner_jcall(const v
        // WARNING: we may need a move here but no clone is available for LDKUnsignedBolt12Invoice
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_var);
        invoice_ref = tag_ptr(invoice_var.inner, invoice_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 36, invoice_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 37, invoice_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_SchnorrSignatureNoneZ ret_conv = *(LDKCResult_SchnorrSignatureNoneZ*)(ret_ptr);
@@ -6270,7 +6734,7 @@ LDKCResult_ECDSASignatureNoneZ sign_gossip_message_LDKNodeSigner_jcall(const voi
        LDKUnsignedGossipMessage *msg_copy = MALLOC(sizeof(LDKUnsignedGossipMessage), "LDKUnsignedGossipMessage");
        *msg_copy = msg;
        int64_t msg_ref = tag_ptr(msg_copy, true);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 37, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 38, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ECDSASignatureNoneZ ret_conv = *(LDKCResult_ECDSASignatureNoneZ*)(ret_ptr);
@@ -6424,7 +6888,7 @@ LDKThirtyTwoBytes generate_channel_keys_id_LDKSignerProvider_jcall(const void* t
        int64_t channel_value_satoshis_conv = channel_value_satoshis;
        int8_tArray user_channel_id_arr = init_int8_tArray(16, __LINE__);
        memcpy(user_channel_id_arr->elems, user_channel_id.le_bytes, 16);
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_bll(j_calls->instance_ptr, 38, inbound_conv, channel_value_satoshis_conv, (int64_t)user_channel_id_arr);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_bll(j_calls->instance_ptr, 39, inbound_conv, channel_value_satoshis_conv, (int64_t)user_channel_id_arr);
        LDKThirtyTwoBytes ret_ref;
        CHECK(ret->arr_len == 32);
        memcpy(ret_ref.data, ret->elems, 32); FREE(ret);
@@ -6435,7 +6899,7 @@ LDKWriteableEcdsaChannelSigner derive_channel_signer_LDKSignerProvider_jcall(con
        int64_t channel_value_satoshis_conv = channel_value_satoshis;
        int8_tArray channel_keys_id_arr = init_int8_tArray(32, __LINE__);
        memcpy(channel_keys_id_arr->elems, channel_keys_id.data, 32);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 39, channel_value_satoshis_conv, (int64_t)channel_keys_id_arr);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 40, channel_value_satoshis_conv, (int64_t)channel_keys_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKWriteableEcdsaChannelSigner ret_conv = *(LDKWriteableEcdsaChannelSigner*)(ret_ptr);
@@ -6447,16 +6911,18 @@ LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ read_chan_signer_LDKSignerPro
        LDKu8slice reader_var = reader;
        int8_tArray reader_arr = init_int8_tArray(reader_var.datalen, __LINE__);
        memcpy(reader_arr->elems, reader_var.data, reader_var.datalen);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 40, (int64_t)reader_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 41, (int64_t)reader_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ ret_conv = *(LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_CVec_u8ZNoneZ get_destination_script_LDKSignerProvider_jcall(const void* this_arg) {
+LDKCResult_CVec_u8ZNoneZ get_destination_script_LDKSignerProvider_jcall(const void* this_arg, LDKThirtyTwoBytes channel_keys_id) {
        LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 41);
+       int8_tArray channel_keys_id_arr = init_int8_tArray(32, __LINE__);
+       memcpy(channel_keys_id_arr->elems, channel_keys_id.data, 32);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 42, (int64_t)channel_keys_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_u8ZNoneZ ret_conv = *(LDKCResult_CVec_u8ZNoneZ*)(ret_ptr);
@@ -6465,7 +6931,7 @@ LDKCResult_CVec_u8ZNoneZ get_destination_script_LDKSignerProvider_jcall(const vo
 }
 LDKCResult_ShutdownScriptNoneZ get_shutdown_scriptpubkey_LDKSignerProvider_jcall(const void* this_arg) {
        LDKSignerProvider_JCalls *j_calls = (LDKSignerProvider_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 42);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 43);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_ShutdownScriptNoneZ ret_conv = *(LDKCResult_ShutdownScriptNoneZ*)(ret_ptr);
@@ -6534,12 +7000,15 @@ int64_t  CS_LDK_SignerProvider_read_chan_signer(int64_t this_arg, int8_tArray re
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_SignerProvider_get_destination_script(int64_t this_arg) {
+int64_t  CS_LDK_SignerProvider_get_destination_script(int64_t this_arg, int8_tArray channel_keys_id) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKSignerProvider* this_arg_conv = (LDKSignerProvider*)this_arg_ptr;
+       LDKThirtyTwoBytes channel_keys_id_ref;
+       CHECK(channel_keys_id->arr_len == 32);
+       memcpy(channel_keys_id_ref.data, channel_keys_id->elems, 32); FREE(channel_keys_id);
        LDKCResult_CVec_u8ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_u8ZNoneZ), "LDKCResult_CVec_u8ZNoneZ");
-       *ret_conv = (this_arg_conv->get_destination_script)(this_arg_conv->this_arg);
+       *ret_conv = (this_arg_conv->get_destination_script)(this_arg_conv->this_arg, channel_keys_id_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -6565,7 +7034,7 @@ static void LDKFeeEstimator_JCalls_free(void* this_arg) {
 uint32_t get_est_sat_per_1000_weight_LDKFeeEstimator_jcall(const void* this_arg, LDKConfirmationTarget confirmation_target) {
        LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) this_arg;
        int32_t confirmation_target_conv = LDKConfirmationTarget_to_cs(confirmation_target);
-       return js_invoke_function_i_ConfirmationTarget(j_calls->instance_ptr, 43, confirmation_target_conv);
+       return js_invoke_function_i_ConfirmationTarget(j_calls->instance_ptr, 44, confirmation_target_conv);
 }
 static void LDKFeeEstimator_JCalls_cloned(LDKFeeEstimator* new_obj) {
        LDKFeeEstimator_JCalls *j_calls = (LDKFeeEstimator_JCalls*) new_obj->this_arg;
@@ -6597,9 +7066,147 @@ int32_t  CS_LDK_FeeEstimator_get_est_sat_per_1000_weight(int64_t this_arg, int32
        return ret_conv;
 }
 
+typedef struct LDKMessageRouter_JCalls {
+       atomic_size_t refcnt;
+       uint32_t instance_ptr;
+} LDKMessageRouter_JCalls;
+static void LDKMessageRouter_JCalls_free(void* this_arg) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
+       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
+               FREE(j_calls);
+       }
+}
+LDKCResult_OnionMessagePathNoneZ find_path_LDKMessageRouter_jcall(const void* this_arg, LDKPublicKey sender, LDKCVec_PublicKeyZ peers, LDKDestination destination) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
+       int8_tArray sender_arr = init_int8_tArray(33, __LINE__);
+       memcpy(sender_arr->elems, sender.compressed_form, 33);
+       LDKCVec_PublicKeyZ peers_var = peers;
+       ptrArray peers_arr = NULL;
+       peers_arr = init_ptrArray(peers_var.datalen, __LINE__);
+       int8_tArray *peers_arr_ptr = (int8_tArray*)(((uint8_t*)peers_arr) + 8);
+       for (size_t i = 0; i < peers_var.datalen; i++) {
+               int8_tArray peers_conv_8_arr = init_int8_tArray(33, __LINE__);
+               memcpy(peers_conv_8_arr->elems, peers_var.data[i].compressed_form, 33);
+               peers_arr_ptr[i] = peers_conv_8_arr;
+       }
+       
+       FREE(peers_var.data);
+       LDKDestination *destination_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
+       *destination_copy = destination;
+       int64_t destination_ref = tag_ptr(destination_copy, true);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 45, (int64_t)sender_arr, (int64_t)peers_arr, destination_ref);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_OnionMessagePathNoneZ ret_conv = *(LDKCResult_OnionMessagePathNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+LDKCResult_CVec_BlindedPathZNoneZ create_blinded_paths_LDKMessageRouter_jcall(const void* this_arg, LDKPublicKey recipient, LDKCVec_PublicKeyZ peers) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
+       int8_tArray recipient_arr = init_int8_tArray(33, __LINE__);
+       memcpy(recipient_arr->elems, recipient.compressed_form, 33);
+       LDKCVec_PublicKeyZ peers_var = peers;
+       ptrArray peers_arr = NULL;
+       peers_arr = init_ptrArray(peers_var.datalen, __LINE__);
+       int8_tArray *peers_arr_ptr = (int8_tArray*)(((uint8_t*)peers_arr) + 8);
+       for (size_t i = 0; i < peers_var.datalen; i++) {
+               int8_tArray peers_conv_8_arr = init_int8_tArray(33, __LINE__);
+               memcpy(peers_conv_8_arr->elems, peers_var.data[i].compressed_form, 33);
+               peers_arr_ptr[i] = peers_conv_8_arr;
+       }
+       
+       FREE(peers_var.data);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 46, (int64_t)recipient_arr, (int64_t)peers_arr);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_BlindedPathZNoneZ ret_conv = *(LDKCResult_CVec_BlindedPathZNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
+static void LDKMessageRouter_JCalls_cloned(LDKMessageRouter* new_obj) {
+       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) new_obj->this_arg;
+       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+}
+static inline LDKMessageRouter LDKMessageRouter_init (int64_t o) {
+       LDKMessageRouter_JCalls *calls = MALLOC(sizeof(LDKMessageRouter_JCalls), "LDKMessageRouter_JCalls");
+       atomic_init(&calls->refcnt, 1);
+       calls->instance_ptr = o;
+
+       LDKMessageRouter ret = {
+               .this_arg = (void*) calls,
+               .find_path = find_path_LDKMessageRouter_jcall,
+               .create_blinded_paths = create_blinded_paths_LDKMessageRouter_jcall,
+               .free = LDKMessageRouter_JCalls_free,
+       };
+       return ret;
+}
+uint64_t  CS_LDK_LDKMessageRouter_new(int32_t o) {
+       LDKMessageRouter *res_ptr = MALLOC(sizeof(LDKMessageRouter), "LDKMessageRouter");
+       *res_ptr = LDKMessageRouter_init(o);
+       return tag_ptr(res_ptr, true);
+}
+int64_t  CS_LDK_MessageRouter_find_path(int64_t this_arg, int8_tArray sender, ptrArray peers, int64_t destination) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKMessageRouter* this_arg_conv = (LDKMessageRouter*)this_arg_ptr;
+       LDKPublicKey sender_ref;
+       CHECK(sender->arr_len == 33);
+       memcpy(sender_ref.compressed_form, sender->elems, 33); FREE(sender);
+       LDKCVec_PublicKeyZ peers_constr;
+       peers_constr.datalen = peers->arr_len;
+       if (peers_constr.datalen > 0)
+               peers_constr.data = MALLOC(peers_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               peers_constr.data = NULL;
+       int8_tArray* peers_vals = (void*) peers->elems;
+       for (size_t i = 0; i < peers_constr.datalen; i++) {
+               int8_tArray peers_conv_8 = peers_vals[i];
+               LDKPublicKey peers_conv_8_ref;
+               CHECK(peers_conv_8->arr_len == 33);
+               memcpy(peers_conv_8_ref.compressed_form, peers_conv_8->elems, 33); FREE(peers_conv_8);
+               peers_constr.data[i] = peers_conv_8_ref;
+       }
+       FREE(peers);
+       void* destination_ptr = untag_ptr(destination);
+       CHECK_ACCESS(destination_ptr);
+       LDKDestination destination_conv = *(LDKDestination*)(destination_ptr);
+       destination_conv = Destination_clone((LDKDestination*)untag_ptr(destination));
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = (this_arg_conv->find_path)(this_arg_conv->this_arg, sender_ref, peers_constr, destination_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_MessageRouter_create_blinded_paths(int64_t this_arg, int8_tArray recipient, ptrArray peers) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKMessageRouter* this_arg_conv = (LDKMessageRouter*)this_arg_ptr;
+       LDKPublicKey recipient_ref;
+       CHECK(recipient->arr_len == 33);
+       memcpy(recipient_ref.compressed_form, recipient->elems, 33); FREE(recipient);
+       LDKCVec_PublicKeyZ peers_constr;
+       peers_constr.datalen = peers->arr_len;
+       if (peers_constr.datalen > 0)
+               peers_constr.data = MALLOC(peers_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               peers_constr.data = NULL;
+       int8_tArray* peers_vals = (void*) peers->elems;
+       for (size_t i = 0; i < peers_constr.datalen; i++) {
+               int8_tArray peers_conv_8 = peers_vals[i];
+               LDKPublicKey peers_conv_8_ref;
+               CHECK(peers_conv_8->arr_len == 33);
+               memcpy(peers_conv_8_ref.compressed_form, peers_conv_8->elems, 33); FREE(peers_conv_8);
+               peers_constr.data[i] = peers_conv_8_ref;
+       }
+       FREE(peers);
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = (this_arg_conv->create_blinded_paths)(this_arg_conv->this_arg, recipient_ref, peers_constr);
+       return tag_ptr(ret_conv, true);
+}
+
 typedef struct LDKRouter_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
+       LDKMessageRouter_JCalls* MessageRouter;
 } LDKRouter_JCalls;
 static void LDKRouter_JCalls_free(void* this_arg) {
        LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
@@ -6635,7 +7242,7 @@ LDKCResult_RouteLightningErrorZ find_route_LDKRouter_jcall(const void* this_arg,
        int64_t inflight_htlcs_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(inflight_htlcs_var);
        inflight_htlcs_ref = tag_ptr(inflight_htlcs_var.inner, inflight_htlcs_var.is_owned);
-       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 44, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref);
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 47, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_RouteLightningErrorZ ret_conv = *(LDKCResult_RouteLightningErrorZ*)(ret_ptr);
@@ -6674,18 +7281,48 @@ LDKCResult_RouteLightningErrorZ find_route_with_id_LDKRouter_jcall(const void* t
        memcpy(_payment_hash_arr->elems, _payment_hash.data, 32);
        int8_tArray _payment_id_arr = init_int8_tArray(32, __LINE__);
        memcpy(_payment_id_arr->elems, _payment_id.data, 32);
-       uint64_t ret = js_invoke_function_l_llllll(j_calls->instance_ptr, 45, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref, (int64_t)_payment_hash_arr, (int64_t)_payment_id_arr);
+       uint64_t ret = js_invoke_function_l_llllll(j_calls->instance_ptr, 48, (int64_t)payer_arr, route_params_ref, (int64_t)first_hops_arr, inflight_htlcs_ref, (int64_t)_payment_hash_arr, (int64_t)_payment_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_RouteLightningErrorZ ret_conv = *(LDKCResult_RouteLightningErrorZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
+LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ create_blinded_payment_paths_LDKRouter_jcall(const void* this_arg, LDKPublicKey recipient, LDKCVec_ChannelDetailsZ first_hops, LDKReceiveTlvs tlvs, uint64_t amount_msats) {
+       LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) this_arg;
+       int8_tArray recipient_arr = init_int8_tArray(33, __LINE__);
+       memcpy(recipient_arr->elems, recipient.compressed_form, 33);
+       LDKCVec_ChannelDetailsZ first_hops_var = first_hops;
+       int64_tArray first_hops_arr = NULL;
+       first_hops_arr = init_int64_tArray(first_hops_var.datalen, __LINE__);
+       int64_t *first_hops_arr_ptr = (int64_t*)(((uint8_t*)first_hops_arr) + 8);
+       for (size_t q = 0; q < first_hops_var.datalen; q++) {
+               LDKChannelDetails first_hops_conv_16_var = first_hops_var.data[q];
+               int64_t first_hops_conv_16_ref = 0;
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(first_hops_conv_16_var);
+               first_hops_conv_16_ref = tag_ptr(first_hops_conv_16_var.inner, first_hops_conv_16_var.is_owned);
+               first_hops_arr_ptr[q] = first_hops_conv_16_ref;
+       }
+       
+       FREE(first_hops_var.data);
+       LDKReceiveTlvs tlvs_var = tlvs;
+       int64_t tlvs_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(tlvs_var);
+       tlvs_ref = tag_ptr(tlvs_var.inner, tlvs_var.is_owned);
+       int64_t amount_msats_conv = amount_msats;
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 49, (int64_t)recipient_arr, (int64_t)first_hops_arr, tlvs_ref, amount_msats_conv);
+       void* ret_ptr = untag_ptr(ret);
+       CHECK_ACCESS(ret_ptr);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ret_conv = *(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)(ret_ptr);
+       FREE(untag_ptr(ret));
+       return ret_conv;
+}
 static void LDKRouter_JCalls_cloned(LDKRouter* new_obj) {
        LDKRouter_JCalls *j_calls = (LDKRouter_JCalls*) new_obj->this_arg;
        atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
+       atomic_fetch_add_explicit(&j_calls->MessageRouter->refcnt, 1, memory_order_release);
 }
-static inline LDKRouter LDKRouter_init (int64_t o) {
+static inline LDKRouter LDKRouter_init (int64_t o, int64_t MessageRouter) {
        LDKRouter_JCalls *calls = MALLOC(sizeof(LDKRouter_JCalls), "LDKRouter_JCalls");
        atomic_init(&calls->refcnt, 1);
        calls->instance_ptr = o;
@@ -6694,13 +7331,16 @@ static inline LDKRouter LDKRouter_init (int64_t o) {
                .this_arg = (void*) calls,
                .find_route = find_route_LDKRouter_jcall,
                .find_route_with_id = find_route_with_id_LDKRouter_jcall,
+               .create_blinded_payment_paths = create_blinded_payment_paths_LDKRouter_jcall,
                .free = LDKRouter_JCalls_free,
+               .MessageRouter = LDKMessageRouter_init(MessageRouter),
        };
+       calls->MessageRouter = ret.MessageRouter.this_arg;
        return ret;
 }
-uint64_t  CS_LDK_LDKRouter_new(int32_t o) {
+uint64_t  CS_LDK_LDKRouter_new(int32_t o, int32_t MessageRouter) {
        LDKRouter *res_ptr = MALLOC(sizeof(LDKRouter), "LDKRouter");
-       *res_ptr = LDKRouter_init(o);
+       *res_ptr = LDKRouter_init(o, MessageRouter);
        return tag_ptr(res_ptr, true);
 }
 int64_t  CS_LDK_Router_find_route(int64_t this_arg, int8_tArray payer, int64_t route_params, int64_tArray first_hops, int64_t inflight_htlcs) {
@@ -6797,6 +7437,40 @@ int64_t  CS_LDK_Router_find_route_with_id(int64_t this_arg, int8_tArray payer, i
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_Router_create_blinded_payment_paths(int64_t this_arg, int8_tArray recipient, int64_tArray first_hops, int64_t tlvs, int64_t amount_msats) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKRouter* this_arg_conv = (LDKRouter*)this_arg_ptr;
+       LDKPublicKey recipient_ref;
+       CHECK(recipient->arr_len == 33);
+       memcpy(recipient_ref.compressed_form, recipient->elems, 33); FREE(recipient);
+       LDKCVec_ChannelDetailsZ first_hops_constr;
+       first_hops_constr.datalen = first_hops->arr_len;
+       if (first_hops_constr.datalen > 0)
+               first_hops_constr.data = MALLOC(first_hops_constr.datalen * sizeof(LDKChannelDetails), "LDKCVec_ChannelDetailsZ Elements");
+       else
+               first_hops_constr.data = NULL;
+       int64_t* first_hops_vals = first_hops->elems;
+       for (size_t q = 0; q < first_hops_constr.datalen; q++) {
+               int64_t first_hops_conv_16 = first_hops_vals[q];
+               LDKChannelDetails first_hops_conv_16_conv;
+               first_hops_conv_16_conv.inner = untag_ptr(first_hops_conv_16);
+               first_hops_conv_16_conv.is_owned = ptr_is_owned(first_hops_conv_16);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(first_hops_conv_16_conv);
+               first_hops_conv_16_conv = ChannelDetails_clone(&first_hops_conv_16_conv);
+               first_hops_constr.data[q] = first_hops_conv_16_conv;
+       }
+       FREE(first_hops);
+       LDKReceiveTlvs tlvs_conv;
+       tlvs_conv.inner = untag_ptr(tlvs);
+       tlvs_conv.is_owned = ptr_is_owned(tlvs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(tlvs_conv);
+       tlvs_conv = ReceiveTlvs_clone(&tlvs_conv);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = (this_arg_conv->create_blinded_payment_paths)(this_arg_conv->this_arg, recipient_ref, first_hops_constr, tlvs_conv, amount_msats);
+       return tag_ptr(ret_conv, true);
+}
+
 static inline struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner){
        return ThirtyTwoBytes_clone(&owner->a);
 }
@@ -7380,17 +8054,17 @@ static void LDKType_JCalls_free(void* this_arg) {
 }
 uint16_t type_id_LDKType_jcall(const void* this_arg) {
        LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
-       return js_invoke_function_s_(j_calls->instance_ptr, 46);
+       return js_invoke_function_s_(j_calls->instance_ptr, 50);
 }
 LDKStr debug_str_LDKType_jcall(const void* this_arg) {
        LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
-       jstring ret = (jstring)js_invoke_function_l_(j_calls->instance_ptr, 47);
+       jstring ret = (jstring)js_invoke_function_l_(j_calls->instance_ptr, 51);
        LDKStr ret_conv = str_ref_to_owned_c(ret);
        return ret_conv;
 }
 LDKCVec_u8Z write_LDKType_jcall(const void* this_arg) {
        LDKType_JCalls *j_calls = (LDKType_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 48);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 52);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
@@ -7477,6 +8151,43 @@ static inline LDKCVec_C2Tuple_PublicKeyTypeZZ CVec_C2Tuple_PublicKeyTypeZZ_clone
        }
        return ret;
 }
+static inline struct LDKPublicKey C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR owner){
+       return owner->a;
+}
+int8_tArray  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(int64_t owner) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(owner_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+static inline struct LDKCVec_SocketAddressZ C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR owner){
+       return CVec_SocketAddressZ_clone(&owner->b);
+}
+int64_tArray  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(int64_t owner) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* owner_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(owner);
+       LDKCVec_SocketAddressZ ret_var = C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(owner_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t p = 0; p < ret_var.datalen; p++) {
+               LDKSocketAddress *ret_conv_15_copy = MALLOC(sizeof(LDKSocketAddress), "LDKSocketAddress");
+               *ret_conv_15_copy = ret_var.data[p];
+               int64_t ret_conv_15_ref = tag_ptr(ret_conv_15_copy, true);
+               ret_arr_ptr[p] = ret_conv_15_ref;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+static inline LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_clone(const LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ *orig) {
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ ret = { .data = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ) * orig->datalen, "LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(&orig->data[i]);
+       }
+       return ret;
+}
 typedef struct LDKOnionMessageContents_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -7489,17 +8200,23 @@ static void LDKOnionMessageContents_JCalls_free(void* this_arg) {
 }
 uint64_t tlv_type_LDKOnionMessageContents_jcall(const void* this_arg) {
        LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
-       return js_invoke_function_l_(j_calls->instance_ptr, 49);
+       return js_invoke_function_l_(j_calls->instance_ptr, 53);
 }
 LDKCVec_u8Z write_LDKOnionMessageContents_jcall(const void* this_arg) {
        LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 50);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 54);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
        memcpy(ret_ref.data, ret->elems, ret_ref.datalen); FREE(ret);
        return ret_ref;
 }
+LDKStr debug_str_LDKOnionMessageContents_jcall(const void* this_arg) {
+       LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) this_arg;
+       jstring ret = (jstring)js_invoke_function_l_(j_calls->instance_ptr, 55);
+       LDKStr ret_conv = str_ref_to_owned_c(ret);
+       return ret_conv;
+}
 static void LDKOnionMessageContents_JCalls_cloned(LDKOnionMessageContents* new_obj) {
        LDKOnionMessageContents_JCalls *j_calls = (LDKOnionMessageContents_JCalls*) new_obj->this_arg;
        atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
@@ -7513,6 +8230,7 @@ static inline LDKOnionMessageContents LDKOnionMessageContents_init (int64_t o) {
                .this_arg = (void*) calls,
                .tlv_type = tlv_type_LDKOnionMessageContents_jcall,
                .write = write_LDKOnionMessageContents_jcall,
+               .debug_str = debug_str_LDKOnionMessageContents_jcall,
                .cloned = LDKOnionMessageContents_JCalls_cloned,
                .free = LDKOnionMessageContents_JCalls_free,
        };
@@ -7542,6 +8260,16 @@ int8_tArray  CS_LDK_OnionMessageContents_write(int64_t this_arg) {
        return ret_arr;
 }
 
+jstring  CS_LDK_OnionMessageContents_debug_str(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOnionMessageContents* this_arg_conv = (LDKOnionMessageContents*)this_arg_ptr;
+       LDKStr ret_str = (this_arg_conv->debug_str)(this_arg_conv->this_arg);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
 uint32_t CS_LDK_LDKCOption_OnionMessageContentsZ_ty_from_ptr(int64_t ptr) {
        LDKCOption_OnionMessageContentsZ *obj = (LDKCOption_OnionMessageContentsZ*)untag_ptr(ptr);
        switch(obj->tag) {
@@ -8118,6 +8846,110 @@ int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKStfu CResult_StfuDecodeErrorZ_get_ok(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR owner){
+       LDKStfu ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_StfuDecodeErrorZ* owner_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(owner);
+       LDKStfu ret_var = CResult_StfuDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_StfuDecodeErrorZ_get_err(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_StfuDecodeErrorZ* owner_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_StfuDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSplice CResult_SpliceDecodeErrorZ_get_ok(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR owner){
+       LDKSplice ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpliceDecodeErrorZ* owner_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(owner);
+       LDKSplice ret_var = CResult_SpliceDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpliceDecodeErrorZ_get_err(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpliceDecodeErrorZ* owner_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpliceDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSpliceAck CResult_SpliceAckDecodeErrorZ_get_ok(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR owner){
+       LDKSpliceAck ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpliceAckDecodeErrorZ* owner_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(owner);
+       LDKSpliceAck ret_var = CResult_SpliceAckDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpliceAckDecodeErrorZ_get_err(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpliceAckDecodeErrorZ* owner_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpliceAckDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKSpliceLocked CResult_SpliceLockedDecodeErrorZ_get_ok(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR owner){
+       LDKSpliceLocked ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SpliceLockedDecodeErrorZ* owner_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(owner);
+       LDKSpliceLocked ret_var = CResult_SpliceLockedDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_SpliceLockedDecodeErrorZ_get_err(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_SpliceLockedDecodeErrorZ* owner_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_SpliceLockedDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline struct LDKTxAddInput CResult_TxAddInputDecodeErrorZ_get_ok(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR owner){
        LDKTxAddInput ret = *owner->contents.result;
        ret.is_owned = false;
@@ -8794,6 +9626,32 @@ int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKOnionPacket CResult_OnionPacketDecodeErrorZ_get_ok(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR owner){
+       LDKOnionPacket ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_OnionPacketDecodeErrorZ* owner_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(owner);
+       LDKOnionPacket ret_var = CResult_OnionPacketDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_OnionPacketDecodeErrorZ_get_err(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_OnionPacketDecodeErrorZ* owner_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_OnionPacketDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline struct LDKUpdateAddHTLC CResult_UpdateAddHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR owner){
        LDKUpdateAddHTLC ret = *owner->contents.result;
        ret.is_owned = false;
@@ -8846,6 +9704,32 @@ int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKFinalOnionHopData CResult_FinalOnionHopDataDecodeErrorZ_get_ok(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR owner){
+       LDKFinalOnionHopData ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* owner_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(owner);
+       LDKFinalOnionHopData ret_var = CResult_FinalOnionHopDataDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_FinalOnionHopDataDecodeErrorZ_get_err(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* owner_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_FinalOnionHopDataDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 static inline struct LDKPing CResult_PingDecodeErrorZ_get_ok(LDKCResult_PingDecodeErrorZ *NONNULL_PTR owner){
        LDKPing ret = *owner->contents.result;
        ret.is_owned = false;
@@ -10152,24 +11036,25 @@ uint32_t CS_LDK_LDKEvent_ty_from_ptr(int64_t ptr) {
                case LDKEvent_FundingGenerationReady: return 0;
                case LDKEvent_PaymentClaimable: return 1;
                case LDKEvent_PaymentClaimed: return 2;
-               case LDKEvent_InvoiceRequestFailed: return 3;
-               case LDKEvent_PaymentSent: return 4;
-               case LDKEvent_PaymentFailed: return 5;
-               case LDKEvent_PaymentPathSuccessful: return 6;
-               case LDKEvent_PaymentPathFailed: return 7;
-               case LDKEvent_ProbeSuccessful: return 8;
-               case LDKEvent_ProbeFailed: return 9;
-               case LDKEvent_PendingHTLCsForwardable: return 10;
-               case LDKEvent_HTLCIntercepted: return 11;
-               case LDKEvent_SpendableOutputs: return 12;
-               case LDKEvent_PaymentForwarded: return 13;
-               case LDKEvent_ChannelPending: return 14;
-               case LDKEvent_ChannelReady: return 15;
-               case LDKEvent_ChannelClosed: return 16;
-               case LDKEvent_DiscardFunding: return 17;
-               case LDKEvent_OpenChannelRequest: return 18;
-               case LDKEvent_HTLCHandlingFailed: return 19;
-               case LDKEvent_BumpTransaction: return 20;
+               case LDKEvent_ConnectionNeeded: return 3;
+               case LDKEvent_InvoiceRequestFailed: return 4;
+               case LDKEvent_PaymentSent: return 5;
+               case LDKEvent_PaymentFailed: return 6;
+               case LDKEvent_PaymentPathSuccessful: return 7;
+               case LDKEvent_PaymentPathFailed: return 8;
+               case LDKEvent_ProbeSuccessful: return 9;
+               case LDKEvent_ProbeFailed: return 10;
+               case LDKEvent_PendingHTLCsForwardable: return 11;
+               case LDKEvent_HTLCIntercepted: return 12;
+               case LDKEvent_SpendableOutputs: return 13;
+               case LDKEvent_PaymentForwarded: return 14;
+               case LDKEvent_ChannelPending: return 15;
+               case LDKEvent_ChannelReady: return 16;
+               case LDKEvent_ChannelClosed: return 17;
+               case LDKEvent_DiscardFunding: return 18;
+               case LDKEvent_OpenChannelRequest: return 19;
+               case LDKEvent_HTLCHandlingFailed: return 20;
+               case LDKEvent_BumpTransaction: return 21;
                default: abort();
        }
 }
@@ -10316,6 +11201,27 @@ int64_t CS_LDK_LDKEvent_PaymentClaimed_get_sender_intended_total_msat(int64_t pt
        int64_t sender_intended_total_msat_ref = tag_ptr(&obj->payment_claimed.sender_intended_total_msat, false);
        return sender_intended_total_msat_ref;
 }
+int8_tArray CS_LDK_LDKEvent_ConnectionNeeded_get_node_id(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ConnectionNeeded);
+       int8_tArray node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(node_id_arr->elems, obj->connection_needed.node_id.compressed_form, 33);
+       return node_id_arr;
+}
+int64_tArray CS_LDK_LDKEvent_ConnectionNeeded_get_addresses(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ConnectionNeeded);
+       LDKCVec_SocketAddressZ addresses_var = obj->connection_needed.addresses;
+                       int64_tArray addresses_arr = NULL;
+                       addresses_arr = init_int64_tArray(addresses_var.datalen, __LINE__);
+                       int64_t *addresses_arr_ptr = (int64_t*)(((uint8_t*)addresses_arr) + 8);
+                       for (size_t p = 0; p < addresses_var.datalen; p++) {
+                               int64_t addresses_conv_15_ref = tag_ptr(&addresses_var.data[p], false);
+                               addresses_arr_ptr[p] = addresses_conv_15_ref;
+                       }
+                       
+       return addresses_arr;
+}
 int8_tArray CS_LDK_LDKEvent_InvoiceRequestFailed_get_payment_id(int64_t ptr) {
        LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
        CHECK(obj->tag == LDKEvent_InvoiceRequestFailed);
@@ -10670,6 +11576,15 @@ int64_t CS_LDK_LDKEvent_ChannelClosed_get_channel_capacity_sats(int64_t ptr) {
        int64_t channel_capacity_sats_ref = tag_ptr(&obj->channel_closed.channel_capacity_sats, false);
        return channel_capacity_sats_ref;
 }
+int64_t CS_LDK_LDKEvent_ChannelClosed_get_channel_funding_txo(int64_t ptr) {
+       LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKEvent_ChannelClosed);
+       LDKOutPoint channel_funding_txo_var = obj->channel_closed.channel_funding_txo;
+                       int64_t channel_funding_txo_ref = 0;
+                       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_funding_txo_var);
+                       channel_funding_txo_ref = tag_ptr(channel_funding_txo_var.inner, false);
+       return channel_funding_txo_ref;
+}
 int8_tArray CS_LDK_LDKEvent_DiscardFunding_get_channel_id(int64_t ptr) {
        LDKEvent *obj = (LDKEvent*)untag_ptr(ptr);
        CHECK(obj->tag == LDKEvent_DiscardFunding);
@@ -11263,30 +12178,23 @@ int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
-static inline struct LDKReceiveTlvs CResult_ReceiveTlvsDecodeErrorZ_get_ok(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner){
-       LDKReceiveTlvs ret = *owner->contents.result;
-       ret.is_owned = false;
-       return ret;
+static inline struct LDKThirtyTwoBytes C2Tuple__u832u16Z_get_a(LDKC2Tuple__u832u16Z *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
 }
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_get_ok(int64_t owner) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* owner_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(owner);
-       LDKReceiveTlvs ret_var = CResult_ReceiveTlvsDecodeErrorZ_get_ok(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
+int8_tArray  CS_LDK_C2Tuple__u832u16Z_get_a(int64_t owner) {
+       LDKC2Tuple__u832u16Z* owner_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(owner);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, C2Tuple__u832u16Z_get_a(owner_conv).data, 32);
+       return ret_arr;
 }
 
-static inline struct LDKDecodeError CResult_ReceiveTlvsDecodeErrorZ_get_err(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return DecodeError_clone(&*owner->contents.err);
+static inline uint16_t C2Tuple__u832u16Z_get_b(LDKC2Tuple__u832u16Z *NONNULL_PTR owner){
+       return owner->b;
 }
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_get_err(int64_t owner) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* owner_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(owner);
-       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
-       *ret_copy = CResult_ReceiveTlvsDecodeErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
+int16_t  CS_LDK_C2Tuple__u832u16Z_get_b(int64_t owner) {
+       LDKC2Tuple__u832u16Z* owner_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(owner);
+       int16_t ret_conv = C2Tuple__u832u16Z_get_b(owner_conv);
+       return ret_conv;
 }
 
 static inline struct LDKPaymentRelay CResult_PaymentRelayDecodeErrorZ_get_ok(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner){
@@ -11341,122 +12249,62 @@ int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
-uint32_t CS_LDK_LDKPaymentError_ty_from_ptr(int64_t ptr) {
-       LDKPaymentError *obj = (LDKPaymentError*)untag_ptr(ptr);
-       switch(obj->tag) {
-               case LDKPaymentError_Invoice: return 0;
-               case LDKPaymentError_Sending: return 1;
-               default: abort();
-       }
-}
-jstring CS_LDK_LDKPaymentError_Invoice_get_invoice(int64_t ptr) {
-       LDKPaymentError *obj = (LDKPaymentError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKPaymentError_Invoice);
-       LDKStr invoice_str = obj->invoice;
-                       jstring invoice_conv = str_ref_to_cs(invoice_str.chars, invoice_str.len);
-       return invoice_conv;
-}
-int32_t CS_LDK_LDKPaymentError_Sending_get_sending(int64_t ptr) {
-       LDKPaymentError *obj = (LDKPaymentError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKPaymentError_Sending);
-       int32_t sending_conv = LDKRetryableSendFailure_to_cs(obj->sending);
-       return sending_conv;
-}
-static inline struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return ThirtyTwoBytes_clone(&*owner->contents.result);
+static inline struct LDKThirtyTwoBytes C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner){
+       return ThirtyTwoBytes_clone(&owner->a);
 }
-int8_tArray  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(int64_t owner) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(owner);
+int8_tArray  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(owner);
        int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
-       memcpy(ret_arr->elems, CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(owner_conv).data, 32);
+       memcpy(ret_arr->elems, C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(owner_conv).data, 32);
        return ret_arr;
 }
 
-static inline struct LDKPaymentError CResult_ThirtyTwoBytesPaymentErrorZ_get_err(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return PaymentError_clone(&*owner->contents.err);
+static inline struct LDKRecipientOnionFields C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner){
+       LDKRecipientOnionFields ret = owner->b;
+       ret.is_owned = false;
+       return ret;
 }
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_err(int64_t owner) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* owner_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(owner);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = CResult_ThirtyTwoBytesPaymentErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(owner);
+       LDKRecipientOnionFields ret_var = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
        return ret_ref;
 }
 
-static inline void CResult_NonePaymentErrorZ_get_ok(LDKCResult_NonePaymentErrorZ *NONNULL_PTR owner){
-CHECK(owner->result_ok);
-       return *owner->contents.result;
-}
-void  CS_LDK_CResult_NonePaymentErrorZ_get_ok(int64_t owner) {
-       LDKCResult_NonePaymentErrorZ* owner_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(owner);
-       CResult_NonePaymentErrorZ_get_ok(owner_conv);
-}
-
-static inline struct LDKPaymentError CResult_NonePaymentErrorZ_get_err(LDKCResult_NonePaymentErrorZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return PaymentError_clone(&*owner->contents.err);
+static inline struct LDKRouteParameters C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner){
+       LDKRouteParameters ret = owner->c;
+       ret.is_owned = false;
+       return ret;
 }
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_get_err(int64_t owner) {
-       LDKCResult_NonePaymentErrorZ* owner_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(owner);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = CResult_NonePaymentErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(int64_t owner) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* owner_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(owner);
+       LDKRouteParameters ret_var = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
        return ret_ref;
 }
 
-uint32_t CS_LDK_LDKProbingError_ty_from_ptr(int64_t ptr) {
-       LDKProbingError *obj = (LDKProbingError*)untag_ptr(ptr);
-       switch(obj->tag) {
-               case LDKProbingError_Invoice: return 0;
-               case LDKProbingError_Sending: return 1;
-               default: abort();
-       }
-}
-jstring CS_LDK_LDKProbingError_Invoice_get_invoice(int64_t ptr) {
-       LDKProbingError *obj = (LDKProbingError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKProbingError_Invoice);
-       LDKStr invoice_str = obj->invoice;
-                       jstring invoice_conv = str_ref_to_cs(invoice_str.chars, invoice_str.len);
-       return invoice_conv;
-}
-int64_t CS_LDK_LDKProbingError_Sending_get_sending(int64_t ptr) {
-       LDKProbingError *obj = (LDKProbingError*)untag_ptr(ptr);
-       CHECK(obj->tag == LDKProbingError_Sending);
-       int64_t sending_ref = tag_ptr(&obj->sending, false);
-       return sending_ref;
-}
-static inline struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner){
+static inline struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ_clone(&*owner->contents.result);
+       return C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(&*owner->contents.result);
 }
-int64_tArray  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(int64_t owner) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(owner);
-       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ ret_var = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(owner_conv);
-       int64_tArray ret_arr = NULL;
-       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
-       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
-       for (size_t o = 0; o < ret_var.datalen; o++) {
-               LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ* ret_conv_40_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ");
-               *ret_conv_40_conv = ret_var.data[o];
-               ret_arr_ptr[o] = tag_ptr(ret_conv_40_conv, true);
-       }
-       
-       FREE(ret_var.data);
-       return ret_arr;
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(int64_t owner) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* owner_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(owner);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(owner_conv);
+       return tag_ptr(ret_conv, true);
 }
 
-static inline struct LDKProbingError CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner){
+static inline void CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
-       return ProbingError_clone(&*owner->contents.err);
+       return *owner->contents.err;
 }
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(int64_t owner) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* owner_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(owner);
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(owner_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
+void  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(int64_t owner) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* owner_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(owner);
+       CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(owner_conv);
 }
 
 static inline struct LDKStr CResult_StrSecp256k1ErrorZ_get_ok(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner){
@@ -11480,53 +12328,41 @@ int32_t  CS_LDK_CResult_StrSecp256k1ErrorZ_get_err(int64_t owner) {
        return ret_conv;
 }
 
-static inline struct LDKOnionMessagePath CResult_OnionMessagePathNoneZ_get_ok(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
-       LDKOnionMessagePath ret = *owner->contents.result;
-       ret.is_owned = false;
-       return ret;
-}
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_get_ok(int64_t owner) {
-       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
-       LDKOnionMessagePath ret_var = CResult_OnionMessagePathNoneZ_get_ok(owner_conv);
-       int64_t ret_ref = 0;
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
-       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
-       return ret_ref;
-}
-
-static inline void CResult_OnionMessagePathNoneZ_get_err(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner){
-CHECK(!owner->result_ok);
-       return *owner->contents.err;
-}
-void  CS_LDK_CResult_OnionMessagePathNoneZ_get_err(int64_t owner) {
-       LDKCResult_OnionMessagePathNoneZ* owner_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(owner);
-       CResult_OnionMessagePathNoneZ_get_err(owner_conv);
-}
-
-static inline struct LDKPublicKey C2Tuple_PublicKeyOnionMessageZ_get_a(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR owner){
+static inline struct LDKPublicKey C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner){
        return owner->a;
 }
-int8_tArray  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_get_a(int64_t owner) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* owner_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(owner);
+int8_tArray  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(int64_t owner) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* owner_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(owner);
        int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, C2Tuple_PublicKeyOnionMessageZ_get_a(owner_conv).compressed_form, 33);
+       memcpy(ret_arr->elems, C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(owner_conv).compressed_form, 33);
        return ret_arr;
 }
 
-static inline struct LDKOnionMessage C2Tuple_PublicKeyOnionMessageZ_get_b(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR owner){
+static inline struct LDKOnionMessage C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner){
        LDKOnionMessage ret = owner->b;
        ret.is_owned = false;
        return ret;
 }
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_get_b(int64_t owner) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* owner_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(owner);
-       LDKOnionMessage ret_var = C2Tuple_PublicKeyOnionMessageZ_get_b(owner_conv);
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(int64_t owner) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* owner_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(owner);
+       LDKOnionMessage ret_var = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(owner_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
        return ret_ref;
 }
 
+static inline struct LDKCOption_CVec_SocketAddressZZ C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner){
+       return COption_CVec_SocketAddressZZ_clone(&owner->c);
+}
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(int64_t owner) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* owner_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(owner);
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 uint32_t CS_LDK_LDKSendError_ty_from_ptr(int64_t ptr) {
        LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
        switch(obj->tag) {
@@ -11534,10 +12370,11 @@ uint32_t CS_LDK_LDKSendError_ty_from_ptr(int64_t ptr) {
                case LDKSendError_TooBigPacket: return 1;
                case LDKSendError_TooFewBlindedHops: return 2;
                case LDKSendError_InvalidFirstHop: return 3;
-               case LDKSendError_InvalidMessage: return 4;
-               case LDKSendError_BufferFull: return 5;
-               case LDKSendError_GetNodeIdFailed: return 6;
-               case LDKSendError_BlindedPathAdvanceFailed: return 7;
+               case LDKSendError_PathNotFound: return 4;
+               case LDKSendError_InvalidMessage: return 5;
+               case LDKSendError_BufferFull: return 6;
+               case LDKSendError_GetNodeIdFailed: return 7;
+               case LDKSendError_BlindedPathAdvanceFailed: return 8;
                default: abort();
        }
 }
@@ -11547,25 +12384,32 @@ int32_t CS_LDK_LDKSendError_Secp256k1_get_secp256k1(int64_t ptr) {
        int32_t secp256k1_conv = LDKSecp256k1Error_to_cs(obj->secp256k1);
        return secp256k1_conv;
 }
-static inline struct LDKC2Tuple_PublicKeyOnionMessageZ CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *NONNULL_PTR owner){
+int8_tArray CS_LDK_LDKSendError_InvalidFirstHop_get_invalid_first_hop(int64_t ptr) {
+       LDKSendError *obj = (LDKSendError*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSendError_InvalidFirstHop);
+       int8_tArray invalid_first_hop_arr = init_int8_tArray(33, __LINE__);
+       memcpy(invalid_first_hop_arr->elems, obj->invalid_first_hop.compressed_form, 33);
+       return invalid_first_hop_arr;
+}
+static inline struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return C2Tuple_PublicKeyOnionMessageZ_clone(&*owner->contents.result);
+       return C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(&*owner->contents.result);
 }
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(int64_t owner) {
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* owner_conv = (LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)untag_ptr(owner);
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(owner_conv);
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(int64_t owner) {
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* owner_conv = (LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)untag_ptr(owner);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(owner_conv);
        return tag_ptr(ret_conv, true);
 }
 
-static inline struct LDKSendError CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *NONNULL_PTR owner){
+static inline struct LDKSendError CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return SendError_clone(&*owner->contents.err);
 }
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(int64_t owner) {
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* owner_conv = (LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)untag_ptr(owner);
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(int64_t owner) {
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* owner_conv = (LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)untag_ptr(owner);
        LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
-       *ret_copy = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(owner_conv);
+       *ret_copy = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(owner_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -11658,23 +12502,41 @@ void  CS_LDK_CResult_PeeledOnionNoneZ_get_err(int64_t owner) {
        CResult_PeeledOnionNoneZ_get_err(owner_conv);
 }
 
-static inline void CResult_NoneSendErrorZ_get_ok(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner){
+uint32_t CS_LDK_LDKSendSuccess_ty_from_ptr(int64_t ptr) {
+       LDKSendSuccess *obj = (LDKSendSuccess*)untag_ptr(ptr);
+       switch(obj->tag) {
+               case LDKSendSuccess_Buffered: return 0;
+               case LDKSendSuccess_BufferedAwaitingConnection: return 1;
+               default: abort();
+       }
+}
+int8_tArray CS_LDK_LDKSendSuccess_BufferedAwaitingConnection_get_buffered_awaiting_connection(int64_t ptr) {
+       LDKSendSuccess *obj = (LDKSendSuccess*)untag_ptr(ptr);
+       CHECK(obj->tag == LDKSendSuccess_BufferedAwaitingConnection);
+       int8_tArray buffered_awaiting_connection_arr = init_int8_tArray(33, __LINE__);
+       memcpy(buffered_awaiting_connection_arr->elems, obj->buffered_awaiting_connection.compressed_form, 33);
+       return buffered_awaiting_connection_arr;
+}
+static inline struct LDKSendSuccess CResult_SendSuccessSendErrorZ_get_ok(LDKCResult_SendSuccessSendErrorZ *NONNULL_PTR owner){
 CHECK(owner->result_ok);
-       return *owner->contents.result;
+       return SendSuccess_clone(&*owner->contents.result);
 }
-void  CS_LDK_CResult_NoneSendErrorZ_get_ok(int64_t owner) {
-       LDKCResult_NoneSendErrorZ* owner_conv = (LDKCResult_NoneSendErrorZ*)untag_ptr(owner);
-       CResult_NoneSendErrorZ_get_ok(owner_conv);
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_get_ok(int64_t owner) {
+       LDKCResult_SendSuccessSendErrorZ* owner_conv = (LDKCResult_SendSuccessSendErrorZ*)untag_ptr(owner);
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = CResult_SendSuccessSendErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
 }
 
-static inline struct LDKSendError CResult_NoneSendErrorZ_get_err(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner){
+static inline struct LDKSendError CResult_SendSuccessSendErrorZ_get_err(LDKCResult_SendSuccessSendErrorZ *NONNULL_PTR owner){
 CHECK(!owner->result_ok);
        return SendError_clone(&*owner->contents.err);
 }
-int64_t  CS_LDK_CResult_NoneSendErrorZ_get_err(int64_t owner) {
-       LDKCResult_NoneSendErrorZ* owner_conv = (LDKCResult_NoneSendErrorZ*)untag_ptr(owner);
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_get_err(int64_t owner) {
+       LDKCResult_SendSuccessSendErrorZ* owner_conv = (LDKCResult_SendSuccessSendErrorZ*)untag_ptr(owner);
        LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
-       *ret_copy = CResult_NoneSendErrorZ_get_err(owner_conv);
+       *ret_copy = CResult_SendSuccessSendErrorZ_get_err(owner_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -11722,6 +12584,13 @@ void  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(int64_t own
        CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_get_err(owner_conv);
 }
 
+static inline LDKCVec_ForwardNodeZ CVec_ForwardNodeZ_clone(const LDKCVec_ForwardNodeZ *orig) {
+       LDKCVec_ForwardNodeZ ret = { .data = MALLOC(sizeof(LDKForwardNode) * orig->datalen, "LDKCVec_ForwardNodeZ clone bytes"), .datalen = orig->datalen };
+       for (size_t i = 0; i < ret.datalen; i++) {
+               ret.data[i] = ForwardNode_clone(&orig->data[i]);
+       }
+       return ret;
+}
 static inline struct LDKBlindedPath CResult_BlindedPathDecodeErrorZ_get_ok(LDKCResult_BlindedPathDecodeErrorZ *NONNULL_PTR owner){
        LDKBlindedPath ret = *owner->contents.result;
        ret.is_owned = false;
@@ -11800,6 +12669,162 @@ int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_err(int64_t owner) {
        return ret_ref;
 }
 
+static inline struct LDKDelayedPaymentBasepoint CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR owner){
+       LDKDelayedPaymentBasepoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDelayedPaymentBasepoint ret_var = CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKDelayedPaymentKey CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR owner){
+       LDKDelayedPaymentKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDelayedPaymentKey ret_var = CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_DelayedPaymentKeyDecodeErrorZ_get_err(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* owner_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_DelayedPaymentKeyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHtlcBasepoint CResult_HtlcBasepointDecodeErrorZ_get_ok(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR owner){
+       LDKHtlcBasepoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* owner_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKHtlcBasepoint ret_var = CResult_HtlcBasepointDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_HtlcBasepointDecodeErrorZ_get_err(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* owner_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HtlcBasepointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKHtlcKey CResult_HtlcKeyDecodeErrorZ_get_ok(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR owner){
+       LDKHtlcKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_HtlcKeyDecodeErrorZ* owner_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKHtlcKey ret_var = CResult_HtlcKeyDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_HtlcKeyDecodeErrorZ_get_err(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_HtlcKeyDecodeErrorZ* owner_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_HtlcKeyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRevocationBasepoint CResult_RevocationBasepointDecodeErrorZ_get_ok(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR owner){
+       LDKRevocationBasepoint ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* owner_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKRevocationBasepoint ret_var = CResult_RevocationBasepointDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_RevocationBasepointDecodeErrorZ_get_err(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* owner_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RevocationBasepointDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+static inline struct LDKRevocationKey CResult_RevocationKeyDecodeErrorZ_get_ok(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR owner){
+       LDKRevocationKey ret = *owner->contents.result;
+       ret.is_owned = false;
+       return ret;
+}
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_get_ok(int64_t owner) {
+       LDKCResult_RevocationKeyDecodeErrorZ* owner_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKRevocationKey ret_var = CResult_RevocationKeyDecodeErrorZ_get_ok(owner_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline struct LDKDecodeError CResult_RevocationKeyDecodeErrorZ_get_err(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR owner){
+CHECK(!owner->result_ok);
+       return DecodeError_clone(&*owner->contents.err);
+}
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_get_err(int64_t owner) {
+       LDKCResult_RevocationKeyDecodeErrorZ* owner_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(owner);
+       LDKDecodeError *ret_copy = MALLOC(sizeof(LDKDecodeError), "LDKDecodeError");
+       *ret_copy = CResult_RevocationKeyDecodeErrorZ_get_err(owner_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 typedef struct LDKFilter_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -11817,7 +12842,7 @@ void register_tx_LDKFilter_jcall(const void* this_arg, const uint8_t (* txid)[32
        LDKu8slice script_pubkey_var = script_pubkey;
        int8_tArray script_pubkey_arr = init_int8_tArray(script_pubkey_var.datalen, __LINE__);
        memcpy(script_pubkey_arr->elems, script_pubkey_var.data, script_pubkey_var.datalen);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 51, (int64_t)txid_arr, (int64_t)script_pubkey_arr);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 56, (int64_t)txid_arr, (int64_t)script_pubkey_arr);
 }
 void register_output_LDKFilter_jcall(const void* this_arg, LDKWatchedOutput output) {
        LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) this_arg;
@@ -11825,7 +12850,7 @@ void register_output_LDKFilter_jcall(const void* this_arg, LDKWatchedOutput outp
        int64_t output_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(output_var);
        output_ref = tag_ptr(output_var.inner, output_var.is_owned);
-       js_invoke_function_void_l(j_calls->instance_ptr, 52, output_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 57, output_ref);
 }
 static void LDKFilter_JCalls_cloned(LDKFilter* new_obj) {
        LDKFilter_JCalls *j_calls = (LDKFilter_JCalls*) new_obj->this_arg;
@@ -11996,7 +13021,7 @@ LDKCResult_CVec_u8ZIOErrorZ read_LDKKVStore_jcall(const void* this_arg, LDKStr p
        LDKStr key_str = key;
        jstring key_conv = str_ref_to_cs(key_str.chars, key_str.len);
        Str_free(key_str);
-       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 53, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv);
+       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 58, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_u8ZIOErrorZ ret_conv = *(LDKCResult_CVec_u8ZIOErrorZ*)(ret_ptr);
@@ -12017,7 +13042,7 @@ LDKCResult_NoneIOErrorZ write_LDKKVStore_jcall(const void* this_arg, LDKStr prim
        LDKu8slice buf_var = buf;
        int8_tArray buf_arr = init_int8_tArray(buf_var.datalen, __LINE__);
        memcpy(buf_arr->elems, buf_var.data, buf_var.datalen);
-       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 54, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, (int64_t)buf_arr);
+       uint64_t ret = js_invoke_function_l_llll(j_calls->instance_ptr, 59, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, (int64_t)buf_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12036,7 +13061,7 @@ LDKCResult_NoneIOErrorZ remove_LDKKVStore_jcall(const void* this_arg, LDKStr pri
        jstring key_conv = str_ref_to_cs(key_str.chars, key_str.len);
        Str_free(key_str);
        jboolean lazy_conv = lazy;
-       uint64_t ret = js_invoke_function_l_lllb(j_calls->instance_ptr, 55, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, lazy_conv);
+       uint64_t ret = js_invoke_function_l_lllb(j_calls->instance_ptr, 60, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv, (int64_t)key_conv, lazy_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12051,7 +13076,7 @@ LDKCResult_CVec_StrZIOErrorZ list_LDKKVStore_jcall(const void* this_arg, LDKStr
        LDKStr secondary_namespace_str = secondary_namespace;
        jstring secondary_namespace_conv = str_ref_to_cs(secondary_namespace_str.chars, secondary_namespace_str.len);
        Str_free(secondary_namespace_str);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 56, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 61, (int64_t)primary_namespace_conv, (int64_t)secondary_namespace_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_StrZIOErrorZ ret_conv = *(LDKCResult_CVec_StrZIOErrorZ*)(ret_ptr);
@@ -12150,7 +13175,7 @@ LDKCResult_NoneIOErrorZ persist_manager_LDKPersister_jcall(const void* this_arg,
        // WARNING: we may need a move here but no clone is available for LDKChannelManager
        CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_manager_var);
        channel_manager_ref = tag_ptr(channel_manager_var.inner, channel_manager_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 57, channel_manager_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 62, channel_manager_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12164,7 +13189,7 @@ LDKCResult_NoneIOErrorZ persist_graph_LDKPersister_jcall(const void* this_arg, c
        // WARNING: we may need a move here but no clone is available for LDKNetworkGraph
        CHECK_INNER_FIELD_ACCESS_OR_NULL(network_graph_var);
        network_graph_ref = tag_ptr(network_graph_var.inner, network_graph_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 58, network_graph_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 63, network_graph_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12175,7 +13200,7 @@ LDKCResult_NoneIOErrorZ persist_scorer_LDKPersister_jcall(const void* this_arg,
        LDKPersister_JCalls *j_calls = (LDKPersister_JCalls*) this_arg;
        // WARNING: This object doesn't live past this scope, needs clone!
        int64_t ret_scorer = tag_ptr(scorer, false);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 59, ret_scorer);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 64, ret_scorer);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneIOErrorZ ret_conv = *(LDKCResult_NoneIOErrorZ*)(ret_ptr);
@@ -12270,7 +13295,7 @@ LDKChannelMonitorUpdateStatus persist_new_channel_LDKPersist_jcall(const void* t
        int64_t update_id_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_var);
        update_id_ref = tag_ptr(update_id_var.inner, update_id_var.is_owned);
-       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_lll(j_calls->instance_ptr, 60, channel_id_ref, data_ref, update_id_ref);
+       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_lll(j_calls->instance_ptr, 65, channel_id_ref, data_ref, update_id_ref);
        LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
        return ret_conv;
 }
@@ -12293,7 +13318,7 @@ LDKChannelMonitorUpdateStatus update_persisted_channel_LDKPersist_jcall(const vo
        int64_t update_id_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(update_id_var);
        update_id_ref = tag_ptr(update_id_var.inner, update_id_var.is_owned);
-       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_llll(j_calls->instance_ptr, 61, channel_id_ref, update_ref, data_ref, update_id_ref);
+       uint64_t ret = js_invoke_function_ChannelMonitorUpdateStatus_llll(j_calls->instance_ptr, 66, channel_id_ref, update_ref, data_ref, update_id_ref);
        LDKChannelMonitorUpdateStatus ret_conv = LDKChannelMonitorUpdateStatus_from_cs(ret);
        return ret_conv;
 }
@@ -12382,7 +13407,7 @@ static void LDKFutureCallback_JCalls_free(void* this_arg) {
 }
 void call_LDKFutureCallback_jcall(const void* this_arg) {
        LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) this_arg;
-       js_invoke_function_void_(j_calls->instance_ptr, 62);
+       js_invoke_function_void_(j_calls->instance_ptr, 67);
 }
 static void LDKFutureCallback_JCalls_cloned(LDKFutureCallback* new_obj) {
        LDKFutureCallback_JCalls *j_calls = (LDKFutureCallback_JCalls*) new_obj->this_arg;
@@ -12438,7 +13463,7 @@ void filtered_block_connected_LDKListen_jcall(const void* this_arg, const uint8_
        
        FREE(txdata_var.data);
        int32_t height_conv = height;
-       js_invoke_function_void_lli(j_calls->instance_ptr, 63, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
+       js_invoke_function_void_lli(j_calls->instance_ptr, 68, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
 }
 void block_connected_LDKListen_jcall(const void* this_arg, LDKu8slice block, uint32_t height) {
        LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
@@ -12446,14 +13471,14 @@ void block_connected_LDKListen_jcall(const void* this_arg, LDKu8slice block, uin
        int8_tArray block_arr = init_int8_tArray(block_var.datalen, __LINE__);
        memcpy(block_arr->elems, block_var.data, block_var.datalen);
        int32_t height_conv = height;
-       js_invoke_function_void_li(j_calls->instance_ptr, 64, (int64_t)block_arr, height_conv);
+       js_invoke_function_void_li(j_calls->instance_ptr, 69, (int64_t)block_arr, height_conv);
 }
 void block_disconnected_LDKListen_jcall(const void* this_arg, const uint8_t (* header)[80], uint32_t height) {
        LDKListen_JCalls *j_calls = (LDKListen_JCalls*) this_arg;
        int8_tArray header_arr = init_int8_tArray(80, __LINE__);
        memcpy(header_arr->elems, *header, 80);
        int32_t height_conv = height;
-       js_invoke_function_void_li(j_calls->instance_ptr, 65, (int64_t)header_arr, height_conv);
+       js_invoke_function_void_li(j_calls->instance_ptr, 70, (int64_t)header_arr, height_conv);
 }
 static void LDKListen_JCalls_cloned(LDKListen* new_obj) {
        LDKListen_JCalls *j_calls = (LDKListen_JCalls*) new_obj->this_arg;
@@ -12553,38 +13578,38 @@ void transactions_confirmed_LDKConfirm_jcall(const void* this_arg, const uint8_t
        
        FREE(txdata_var.data);
        int32_t height_conv = height;
-       js_invoke_function_void_lli(j_calls->instance_ptr, 66, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
+       js_invoke_function_void_lli(j_calls->instance_ptr, 71, (int64_t)header_arr, (int64_t)txdata_arr, height_conv);
 }
 void transaction_unconfirmed_LDKConfirm_jcall(const void* this_arg, const uint8_t (* txid)[32]) {
        LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
        int8_tArray txid_arr = init_int8_tArray(32, __LINE__);
        memcpy(txid_arr->elems, *txid, 32);
-       js_invoke_function_void_l(j_calls->instance_ptr, 67, (int64_t)txid_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 72, (int64_t)txid_arr);
 }
 void best_block_updated_LDKConfirm_jcall(const void* this_arg, const uint8_t (* header)[80], uint32_t height) {
        LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
        int8_tArray header_arr = init_int8_tArray(80, __LINE__);
        memcpy(header_arr->elems, *header, 80);
        int32_t height_conv = height;
-       js_invoke_function_void_li(j_calls->instance_ptr, 68, (int64_t)header_arr, height_conv);
+       js_invoke_function_void_li(j_calls->instance_ptr, 73, (int64_t)header_arr, height_conv);
 }
-LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ get_relevant_txids_LDKConfirm_jcall(const void* this_arg) {
+LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ get_relevant_txids_LDKConfirm_jcall(const void* this_arg) {
        LDKConfirm_JCalls *j_calls = (LDKConfirm_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 69);
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret_constr;
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 74);
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
-               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ Elements");
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ Elements");
        else
                ret_constr.data = NULL;
        int64_t* ret_vals = ret->elems;
-       for (size_t x = 0; x < ret_constr.datalen; x++) {
-               int64_t ret_conv_49 = ret_vals[x];
-               void* ret_conv_49_ptr = untag_ptr(ret_conv_49);
-               CHECK_ACCESS(ret_conv_49_ptr);
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ ret_conv_49_conv = *(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)(ret_conv_49_ptr);
-               FREE(untag_ptr(ret_conv_49));
-               ret_constr.data[x] = ret_conv_49_conv;
+       for (size_t c = 0; c < ret_constr.datalen; c++) {
+               int64_t ret_conv_54 = ret_vals[c];
+               void* ret_conv_54_ptr = untag_ptr(ret_conv_54);
+               CHECK_ACCESS(ret_conv_54_ptr);
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ ret_conv_54_conv = *(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)(ret_conv_54_ptr);
+               FREE(untag_ptr(ret_conv_54));
+               ret_constr.data[c] = ret_conv_54_conv;
        }
        FREE(ret);
        return ret_constr;
@@ -12666,14 +13691,14 @@ int64_tArray  CS_LDK_Confirm_get_relevant_txids(int64_t this_arg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKConfirm* this_arg_conv = (LDKConfirm*)this_arg_ptr;
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret_var = (this_arg_conv->get_relevant_txids)(this_arg_conv->this_arg);
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret_var = (this_arg_conv->get_relevant_txids)(this_arg_conv->this_arg);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
        int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
-       for (size_t x = 0; x < ret_var.datalen; x++) {
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-               *ret_conv_49_conv = ret_var.data[x];
-               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       for (size_t c = 0; c < ret_var.datalen; c++) {
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv_54_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+               *ret_conv_54_conv = ret_var.data[c];
+               ret_arr_ptr[c] = tag_ptr(ret_conv_54_conv, true);
        }
        
        FREE(ret_var.data);
@@ -12695,7 +13720,7 @@ void handle_event_LDKEventHandler_jcall(const void* this_arg, LDKEvent event) {
        LDKEvent *event_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
        *event_copy = event;
        int64_t event_ref = tag_ptr(event_copy, true);
-       js_invoke_function_void_l(j_calls->instance_ptr, 70, event_ref);
+       js_invoke_function_void_l(j_calls->instance_ptr, 75, event_ref);
 }
 static void LDKEventHandler_JCalls_cloned(LDKEventHandler* new_obj) {
        LDKEventHandler_JCalls *j_calls = (LDKEventHandler_JCalls*) new_obj->this_arg;
@@ -12743,7 +13768,7 @@ void process_pending_events_LDKEventsProvider_jcall(const void* this_arg, LDKEve
        LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) this_arg;
        LDKEventHandler* handler_ret = MALLOC(sizeof(LDKEventHandler), "LDKEventHandler");
        *handler_ret = handler;
-       js_invoke_function_void_l(j_calls->instance_ptr, 71, tag_ptr(handler_ret, true));
+       js_invoke_function_void_l(j_calls->instance_ptr, 76, tag_ptr(handler_ret, true));
 }
 static void LDKEventsProvider_JCalls_cloned(LDKEventsProvider* new_obj) {
        LDKEventsProvider_JCalls *j_calls = (LDKEventsProvider_JCalls*) new_obj->this_arg;
@@ -12808,7 +13833,7 @@ static void LDKMessageSendEventsProvider_JCalls_free(void* this_arg) {
 }
 LDKCVec_MessageSendEventZ get_and_clear_pending_msg_events_LDKMessageSendEventsProvider_jcall(const void* this_arg) {
        LDKMessageSendEventsProvider_JCalls *j_calls = (LDKMessageSendEventsProvider_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 72);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 77);
        LDKCVec_MessageSendEventZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -12887,7 +13912,7 @@ void handle_open_channel_LDKChannelMessageHandler_jcall(const void* this_arg, LD
        msg_var = OpenChannel_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 73, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 78, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_open_channel_v2_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKOpenChannelV2 * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12898,7 +13923,7 @@ void handle_open_channel_v2_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = OpenChannelV2_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 74, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 79, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_accept_channel_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKAcceptChannel * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12909,7 +13934,7 @@ void handle_accept_channel_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = AcceptChannel_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 75, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 80, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_accept_channel_v2_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKAcceptChannelV2 * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12920,7 +13945,7 @@ void handle_accept_channel_v2_LDKChannelMessageHandler_jcall(const void* this_ar
        msg_var = AcceptChannelV2_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 76, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 81, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_funding_created_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKFundingCreated * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12931,7 +13956,7 @@ void handle_funding_created_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = FundingCreated_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 77, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 82, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_funding_signed_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKFundingSigned * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12942,7 +13967,7 @@ void handle_funding_signed_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = FundingSigned_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 78, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 83, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_channel_ready_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKChannelReady * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12953,7 +13978,7 @@ void handle_channel_ready_LDKChannelMessageHandler_jcall(const void* this_arg, L
        msg_var = ChannelReady_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 79, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 84, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_shutdown_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKShutdown * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12964,7 +13989,7 @@ void handle_shutdown_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPub
        msg_var = Shutdown_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 80, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 85, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_closing_signed_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKClosingSigned * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12975,7 +14000,51 @@ void handle_closing_signed_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = ClosingSigned_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 81, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 86, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_stfu_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKStfu * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKStfu msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = Stfu_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 87, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_splice_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKSplice * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKSplice msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = Splice_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 88, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_splice_ack_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKSpliceAck * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKSpliceAck msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = SpliceAck_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 89, (int64_t)their_node_id_arr, msg_ref);
+}
+void handle_splice_locked_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKSpliceLocked * msg) {
+       LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
+       int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
+       memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
+       LDKSpliceLocked msg_var = *msg;
+       int64_t msg_ref = 0;
+       msg_var = SpliceLocked_clone(&msg_var);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
+       msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 90, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_add_input_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAddInput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12986,7 +14055,7 @@ void handle_tx_add_input_LDKChannelMessageHandler_jcall(const void* this_arg, LD
        msg_var = TxAddInput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 82, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 91, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_add_output_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAddOutput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -12997,7 +14066,7 @@ void handle_tx_add_output_LDKChannelMessageHandler_jcall(const void* this_arg, L
        msg_var = TxAddOutput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 83, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 92, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_remove_input_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxRemoveInput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13008,7 +14077,7 @@ void handle_tx_remove_input_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = TxRemoveInput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 84, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 93, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_remove_output_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxRemoveOutput * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13019,7 +14088,7 @@ void handle_tx_remove_output_LDKChannelMessageHandler_jcall(const void* this_arg
        msg_var = TxRemoveOutput_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 85, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 94, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_complete_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxComplete * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13030,7 +14099,7 @@ void handle_tx_complete_LDKChannelMessageHandler_jcall(const void* this_arg, LDK
        msg_var = TxComplete_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 86, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 95, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_signatures_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxSignatures * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13041,7 +14110,7 @@ void handle_tx_signatures_LDKChannelMessageHandler_jcall(const void* this_arg, L
        msg_var = TxSignatures_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 87, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 96, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_init_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxInitRbf * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13052,7 +14121,7 @@ void handle_tx_init_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDK
        msg_var = TxInitRbf_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 88, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 97, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_ack_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAckRbf * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13063,7 +14132,7 @@ void handle_tx_ack_rbf_LDKChannelMessageHandler_jcall(const void* this_arg, LDKP
        msg_var = TxAckRbf_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 89, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 98, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_tx_abort_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKTxAbort * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13074,7 +14143,7 @@ void handle_tx_abort_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPub
        msg_var = TxAbort_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 90, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 99, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_add_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateAddHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13085,7 +14154,7 @@ void handle_update_add_htlc_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = UpdateAddHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 91, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 100, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fulfill_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFulfillHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13096,7 +14165,7 @@ void handle_update_fulfill_htlc_LDKChannelMessageHandler_jcall(const void* this_
        msg_var = UpdateFulfillHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 92, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 101, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fail_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFailHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13107,7 +14176,7 @@ void handle_update_fail_htlc_LDKChannelMessageHandler_jcall(const void* this_arg
        msg_var = UpdateFailHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 93, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 102, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fail_malformed_htlc_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFailMalformedHTLC * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13118,7 +14187,7 @@ void handle_update_fail_malformed_htlc_LDKChannelMessageHandler_jcall(const void
        msg_var = UpdateFailMalformedHTLC_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 94, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 103, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_commitment_signed_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKCommitmentSigned * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13129,7 +14198,7 @@ void handle_commitment_signed_LDKChannelMessageHandler_jcall(const void* this_ar
        msg_var = CommitmentSigned_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 95, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 104, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_revoke_and_ack_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKRevokeAndACK * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13140,7 +14209,7 @@ void handle_revoke_and_ack_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = RevokeAndACK_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 96, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 105, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_update_fee_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKUpdateFee * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13151,7 +14220,7 @@ void handle_update_fee_LDKChannelMessageHandler_jcall(const void* this_arg, LDKP
        msg_var = UpdateFee_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 97, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 106, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_announcement_signatures_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKAnnouncementSignatures * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13162,13 +14231,13 @@ void handle_announcement_signatures_LDKChannelMessageHandler_jcall(const void* t
        msg_var = AnnouncementSignatures_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 98, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 107, (int64_t)their_node_id_arr, msg_ref);
 }
 void peer_disconnected_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       js_invoke_function_void_l(j_calls->instance_ptr, 99, (int64_t)their_node_id_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 108, (int64_t)their_node_id_arr);
 }
 LDKCResult_NoneNoneZ peer_connected_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKInit * msg, bool inbound) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13180,7 +14249,7 @@ LDKCResult_NoneNoneZ peer_connected_LDKChannelMessageHandler_jcall(const void* t
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
        jboolean inbound_conv = inbound;
-       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 100, (int64_t)their_node_id_arr, msg_ref, inbound_conv);
+       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 109, (int64_t)their_node_id_arr, msg_ref, inbound_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -13196,7 +14265,7 @@ void handle_channel_reestablish_LDKChannelMessageHandler_jcall(const void* this_
        msg_var = ChannelReestablish_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 101, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 110, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_channel_update_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKChannelUpdate * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13207,7 +14276,7 @@ void handle_channel_update_LDKChannelMessageHandler_jcall(const void* this_arg,
        msg_var = ChannelUpdate_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 102, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 111, (int64_t)their_node_id_arr, msg_ref);
 }
 void handle_error_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublicKey their_node_id, const LDKErrorMessage * msg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
@@ -13218,11 +14287,11 @@ void handle_error_LDKChannelMessageHandler_jcall(const void* this_arg, LDKPublic
        msg_var = ErrorMessage_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 103, (int64_t)their_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 112, (int64_t)their_node_id_arr, msg_ref);
 }
 LDKNodeFeatures provided_node_features_LDKChannelMessageHandler_jcall(const void* this_arg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 104);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 113);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -13233,7 +14302,7 @@ LDKInitFeatures provided_init_features_LDKChannelMessageHandler_jcall(const void
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 105, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 114, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -13242,7 +14311,7 @@ LDKInitFeatures provided_init_features_LDKChannelMessageHandler_jcall(const void
 }
 LDKCOption_CVec_ThirtyTwoBytesZZ get_chain_hashes_LDKChannelMessageHandler_jcall(const void* this_arg) {
        LDKChannelMessageHandler_JCalls *j_calls = (LDKChannelMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 106);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 115);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_CVec_ThirtyTwoBytesZZ ret_conv = *(LDKCOption_CVec_ThirtyTwoBytesZZ*)(ret_ptr);
@@ -13270,6 +14339,10 @@ static inline LDKChannelMessageHandler LDKChannelMessageHandler_init (int64_t o,
                .handle_channel_ready = handle_channel_ready_LDKChannelMessageHandler_jcall,
                .handle_shutdown = handle_shutdown_LDKChannelMessageHandler_jcall,
                .handle_closing_signed = handle_closing_signed_LDKChannelMessageHandler_jcall,
+               .handle_stfu = handle_stfu_LDKChannelMessageHandler_jcall,
+               .handle_splice = handle_splice_LDKChannelMessageHandler_jcall,
+               .handle_splice_ack = handle_splice_ack_LDKChannelMessageHandler_jcall,
+               .handle_splice_locked = handle_splice_locked_LDKChannelMessageHandler_jcall,
                .handle_tx_add_input = handle_tx_add_input_LDKChannelMessageHandler_jcall,
                .handle_tx_add_output = handle_tx_add_output_LDKChannelMessageHandler_jcall,
                .handle_tx_remove_input = handle_tx_remove_input_LDKChannelMessageHandler_jcall,
@@ -13441,6 +14514,66 @@ void  CS_LDK_ChannelMessageHandler_handle_closing_signed(int64_t this_arg, int8_
        (this_arg_conv->handle_closing_signed)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
 }
 
+void  CS_LDK_ChannelMessageHandler_handle_stfu(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKStfu msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_stfu)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_splice(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKSplice msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_splice)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_splice_ack(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKSpliceAck msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_splice_ack)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
+void  CS_LDK_ChannelMessageHandler_handle_splice_locked(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKChannelMessageHandler* this_arg_conv = (LDKChannelMessageHandler*)this_arg_ptr;
+       LDKPublicKey their_node_id_ref;
+       CHECK(their_node_id->arr_len == 33);
+       memcpy(their_node_id_ref.compressed_form, their_node_id->elems, 33); FREE(their_node_id);
+       LDKSpliceLocked msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       (this_arg_conv->handle_splice_locked)(this_arg_conv->this_arg, their_node_id_ref, &msg_conv);
+}
+
 void  CS_LDK_ChannelMessageHandler_handle_tx_add_input(int64_t this_arg, int8_tArray their_node_id, int64_t msg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
@@ -13818,7 +14951,7 @@ LDKCOption_OffersMessageZ handle_message_LDKOffersMessageHandler_jcall(const voi
        LDKOffersMessage *message_copy = MALLOC(sizeof(LDKOffersMessage), "LDKOffersMessage");
        *message_copy = message;
        int64_t message_ref = tag_ptr(message_copy, true);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 107, message_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 116, message_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_OffersMessageZ ret_conv = *(LDKCOption_OffersMessageZ*)(ret_ptr);
@@ -13827,7 +14960,7 @@ LDKCOption_OffersMessageZ handle_message_LDKOffersMessageHandler_jcall(const voi
 }
 LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ release_pending_messages_LDKOffersMessageHandler_jcall(const void* this_arg) {
        LDKOffersMessageHandler_JCalls *j_calls = (LDKOffersMessageHandler_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 108);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 117);
        LDKCVec_C3Tuple_OffersMessageDestinationBlindedPathZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -13918,7 +15051,7 @@ LDKCResult_boolLightningErrorZ handle_node_announcement_LDKRoutingMessageHandler
        msg_var = NodeAnnouncement_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 109, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 118, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
@@ -13932,7 +15065,7 @@ LDKCResult_boolLightningErrorZ handle_channel_announcement_LDKRoutingMessageHand
        msg_var = ChannelAnnouncement_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 110, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 119, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
@@ -13946,7 +15079,7 @@ LDKCResult_boolLightningErrorZ handle_channel_update_LDKRoutingMessageHandler_jc
        msg_var = ChannelUpdate_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 111, msg_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 120, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_boolLightningErrorZ ret_conv = *(LDKCResult_boolLightningErrorZ*)(ret_ptr);
@@ -13956,7 +15089,7 @@ LDKCResult_boolLightningErrorZ handle_channel_update_LDKRoutingMessageHandler_jc
 LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ get_next_channel_announcement_LDKRoutingMessageHandler_jcall(const void* this_arg, uint64_t starting_point) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
        int64_t starting_point_conv = starting_point;
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 112, starting_point_conv);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 121, starting_point_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ ret_conv = *(LDKCOption_C3Tuple_ChannelAnnouncementChannelUpdateChannelUpdateZZ*)(ret_ptr);
@@ -13969,7 +15102,7 @@ LDKNodeAnnouncement get_next_node_announcement_LDKRoutingMessageHandler_jcall(co
        int64_t starting_point_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(starting_point_var);
        starting_point_ref = tag_ptr(starting_point_var.inner, starting_point_var.is_owned);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 113, starting_point_ref);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 122, starting_point_ref);
        LDKNodeAnnouncement ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -13986,7 +15119,7 @@ LDKCResult_NoneNoneZ peer_connected_LDKRoutingMessageHandler_jcall(const void* t
        CHECK_INNER_FIELD_ACCESS_OR_NULL(init_var);
        init_ref = tag_ptr(init_var.inner, init_var.is_owned);
        jboolean inbound_conv = inbound;
-       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 114, (int64_t)their_node_id_arr, init_ref, inbound_conv);
+       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 123, (int64_t)their_node_id_arr, init_ref, inbound_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -14001,7 +15134,7 @@ LDKCResult_NoneLightningErrorZ handle_reply_channel_range_LDKRoutingMessageHandl
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 115, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 124, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14016,7 +15149,7 @@ LDKCResult_NoneLightningErrorZ handle_reply_short_channel_ids_end_LDKRoutingMess
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 116, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 125, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14031,7 +15164,7 @@ LDKCResult_NoneLightningErrorZ handle_query_channel_range_LDKRoutingMessageHandl
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 117, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 126, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14046,7 +15179,7 @@ LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_LDKRoutingMessageH
        int64_t msg_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 118, (int64_t)their_node_id_arr, msg_ref);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 127, (int64_t)their_node_id_arr, msg_ref);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14055,11 +15188,11 @@ LDKCResult_NoneLightningErrorZ handle_query_short_channel_ids_LDKRoutingMessageH
 }
 bool processing_queue_high_LDKRoutingMessageHandler_jcall(const void* this_arg) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
-       return js_invoke_function_b_(j_calls->instance_ptr, 119);
+       return js_invoke_function_b_(j_calls->instance_ptr, 128);
 }
 LDKNodeFeatures provided_node_features_LDKRoutingMessageHandler_jcall(const void* this_arg) {
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 120);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 129);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14070,7 +15203,7 @@ LDKInitFeatures provided_init_features_LDKRoutingMessageHandler_jcall(const void
        LDKRoutingMessageHandler_JCalls *j_calls = (LDKRoutingMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 121, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 130, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14309,6 +15442,27 @@ static void LDKOnionMessageHandler_JCalls_free(void* this_arg) {
                FREE(j_calls);
        }
 }
+LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ get_and_clear_connections_needed_LDKOnionMessageHandler_jcall(const void* this_arg) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 131);
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ ret_constr;
+       ret_constr.datalen = ret->arr_len;
+       if (ret_constr.datalen > 0)
+               ret_constr.data = MALLOC(ret_constr.datalen * sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ Elements");
+       else
+               ret_constr.data = NULL;
+       int64_t* ret_vals = ret->elems;
+       for (size_t o = 0; o < ret_constr.datalen; o++) {
+               int64_t ret_conv_40 = ret_vals[o];
+               void* ret_conv_40_ptr = untag_ptr(ret_conv_40);
+               CHECK_ACCESS(ret_conv_40_ptr);
+               LDKC2Tuple_PublicKeyCVec_SocketAddressZZ ret_conv_40_conv = *(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)(ret_conv_40_ptr);
+               FREE(untag_ptr(ret_conv_40));
+               ret_constr.data[o] = ret_conv_40_conv;
+       }
+       FREE(ret);
+       return ret_constr;
+}
 void handle_onion_message_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey peer_node_id, const LDKOnionMessage * msg) {
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray peer_node_id_arr = init_int8_tArray(33, __LINE__);
@@ -14318,13 +15472,13 @@ void handle_onion_message_LDKOnionMessageHandler_jcall(const void* this_arg, LDK
        msg_var = OnionMessage_clone(&msg_var);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_var);
        msg_ref = tag_ptr(msg_var.inner, msg_var.is_owned);
-       js_invoke_function_void_ll(j_calls->instance_ptr, 122, (int64_t)peer_node_id_arr, msg_ref);
+       js_invoke_function_void_ll(j_calls->instance_ptr, 132, (int64_t)peer_node_id_arr, msg_ref);
 }
 LDKOnionMessage next_onion_message_for_peer_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPublicKey peer_node_id) {
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray peer_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(peer_node_id_arr->elems, peer_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 123, (int64_t)peer_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 133, (int64_t)peer_node_id_arr);
        LDKOnionMessage ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14341,7 +15495,7 @@ LDKCResult_NoneNoneZ peer_connected_LDKOnionMessageHandler_jcall(const void* thi
        CHECK_INNER_FIELD_ACCESS_OR_NULL(init_var);
        init_ref = tag_ptr(init_var.inner, init_var.is_owned);
        jboolean inbound_conv = inbound;
-       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 124, (int64_t)their_node_id_arr, init_ref, inbound_conv);
+       uint64_t ret = js_invoke_function_l_llb(j_calls->instance_ptr, 134, (int64_t)their_node_id_arr, init_ref, inbound_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneNoneZ ret_conv = *(LDKCResult_NoneNoneZ*)(ret_ptr);
@@ -14352,11 +15506,15 @@ void peer_disconnected_LDKOnionMessageHandler_jcall(const void* this_arg, LDKPub
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       js_invoke_function_void_l(j_calls->instance_ptr, 125, (int64_t)their_node_id_arr);
+       js_invoke_function_void_l(j_calls->instance_ptr, 135, (int64_t)their_node_id_arr);
+}
+void timer_tick_occurred_LDKOnionMessageHandler_jcall(const void* this_arg) {
+       LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
+       js_invoke_function_void_(j_calls->instance_ptr, 136);
 }
 LDKNodeFeatures provided_node_features_LDKOnionMessageHandler_jcall(const void* this_arg) {
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 126);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 137);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14367,7 +15525,7 @@ LDKInitFeatures provided_init_features_LDKOnionMessageHandler_jcall(const void*
        LDKOnionMessageHandler_JCalls *j_calls = (LDKOnionMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 127, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 138, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14385,10 +15543,12 @@ static inline LDKOnionMessageHandler LDKOnionMessageHandler_init (int64_t o) {
 
        LDKOnionMessageHandler ret = {
                .this_arg = (void*) calls,
+               .get_and_clear_connections_needed = get_and_clear_connections_needed_LDKOnionMessageHandler_jcall,
                .handle_onion_message = handle_onion_message_LDKOnionMessageHandler_jcall,
                .next_onion_message_for_peer = next_onion_message_for_peer_LDKOnionMessageHandler_jcall,
                .peer_connected = peer_connected_LDKOnionMessageHandler_jcall,
                .peer_disconnected = peer_disconnected_LDKOnionMessageHandler_jcall,
+               .timer_tick_occurred = timer_tick_occurred_LDKOnionMessageHandler_jcall,
                .provided_node_features = provided_node_features_LDKOnionMessageHandler_jcall,
                .provided_init_features = provided_init_features_LDKOnionMessageHandler_jcall,
                .free = LDKOnionMessageHandler_JCalls_free,
@@ -14400,6 +15560,24 @@ uint64_t  CS_LDK_LDKOnionMessageHandler_new(int32_t o) {
        *res_ptr = LDKOnionMessageHandler_init(o);
        return tag_ptr(res_ptr, true);
 }
+int64_tArray  CS_LDK_OnionMessageHandler_get_and_clear_connections_needed(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ ret_var = (this_arg_conv->get_and_clear_connections_needed)(this_arg_conv->this_arg);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t o = 0; o < ret_var.datalen; o++) {
+               LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv_40_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+               *ret_conv_40_conv = ret_var.data[o];
+               ret_arr_ptr[o] = tag_ptr(ret_conv_40_conv, true);
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
 void  CS_LDK_OnionMessageHandler_handle_onion_message(int64_t this_arg, int8_tArray peer_node_id, int64_t msg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
@@ -14456,6 +15634,13 @@ void  CS_LDK_OnionMessageHandler_peer_disconnected(int64_t this_arg, int8_tArray
        (this_arg_conv->peer_disconnected)(this_arg_conv->this_arg, their_node_id_ref);
 }
 
+void  CS_LDK_OnionMessageHandler_timer_tick_occurred(int64_t this_arg) {
+       void* this_arg_ptr = untag_ptr(this_arg);
+       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
+       LDKOnionMessageHandler* this_arg_conv = (LDKOnionMessageHandler*)this_arg_ptr;
+       (this_arg_conv->timer_tick_occurred)(this_arg_conv->this_arg);
+}
+
 int64_t  CS_LDK_OnionMessageHandler_provided_node_features(int64_t this_arg) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
@@ -14497,7 +15682,7 @@ LDKCResult_COption_TypeZDecodeErrorZ read_LDKCustomMessageReader_jcall(const voi
        LDKu8slice buffer_var = buffer;
        int8_tArray buffer_arr = init_int8_tArray(buffer_var.datalen, __LINE__);
        memcpy(buffer_arr->elems, buffer_var.data, buffer_var.datalen);
-       uint64_t ret = js_invoke_function_l_sl(j_calls->instance_ptr, 128, message_type_conv, (int64_t)buffer_arr);
+       uint64_t ret = js_invoke_function_l_sl(j_calls->instance_ptr, 139, message_type_conv, (int64_t)buffer_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_COption_TypeZDecodeErrorZ ret_conv = *(LDKCResult_COption_TypeZDecodeErrorZ*)(ret_ptr);
@@ -14555,7 +15740,7 @@ LDKCResult_NoneLightningErrorZ handle_custom_message_LDKCustomMessageHandler_jca
        *msg_ret = msg;
        int8_tArray sender_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(sender_node_id_arr->elems, sender_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 129, tag_ptr(msg_ret, true), (int64_t)sender_node_id_arr);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 140, tag_ptr(msg_ret, true), (int64_t)sender_node_id_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_NoneLightningErrorZ ret_conv = *(LDKCResult_NoneLightningErrorZ*)(ret_ptr);
@@ -14564,7 +15749,7 @@ LDKCResult_NoneLightningErrorZ handle_custom_message_LDKCustomMessageHandler_jca
 }
 LDKCVec_C2Tuple_PublicKeyTypeZZ get_and_clear_pending_msg_LDKCustomMessageHandler_jcall(const void* this_arg) {
        LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 130);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 141);
        LDKCVec_C2Tuple_PublicKeyTypeZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -14585,7 +15770,7 @@ LDKCVec_C2Tuple_PublicKeyTypeZZ get_and_clear_pending_msg_LDKCustomMessageHandle
 }
 LDKNodeFeatures provided_node_features_LDKCustomMessageHandler_jcall(const void* this_arg) {
        LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 131);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 142);
        LDKNodeFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14596,7 +15781,7 @@ LDKInitFeatures provided_init_features_LDKCustomMessageHandler_jcall(const void*
        LDKCustomMessageHandler_JCalls *j_calls = (LDKCustomMessageHandler_JCalls*) this_arg;
        int8_tArray their_node_id_arr = init_int8_tArray(33, __LINE__);
        memcpy(their_node_id_arr->elems, their_node_id.compressed_form, 33);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 132, (int64_t)their_node_id_arr);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 143, (int64_t)their_node_id_arr);
        LDKInitFeatures ret_conv;
        ret_conv.inner = untag_ptr(ret);
        ret_conv.is_owned = ptr_is_owned(ret);
@@ -14706,7 +15891,7 @@ LDKCOption_OnionMessageContentsZ handle_custom_message_LDKCustomOnionMessageHand
        LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
        LDKOnionMessageContents* msg_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
        *msg_ret = msg;
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 133, tag_ptr(msg_ret, true));
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 144, tag_ptr(msg_ret, true));
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCOption_OnionMessageContentsZ ret_conv = *(LDKCOption_OnionMessageContentsZ*)(ret_ptr);
@@ -14719,7 +15904,7 @@ LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_message_LDKCust
        LDKu8slice buffer_var = buffer;
        int8_tArray buffer_arr = init_int8_tArray(buffer_var.datalen, __LINE__);
        memcpy(buffer_arr->elems, buffer_var.data, buffer_var.datalen);
-       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 134, message_type_conv, (int64_t)buffer_arr);
+       uint64_t ret = js_invoke_function_l_ll(j_calls->instance_ptr, 145, message_type_conv, (int64_t)buffer_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_COption_OnionMessageContentsZDecodeErrorZ ret_conv = *(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ*)(ret_ptr);
@@ -14728,7 +15913,7 @@ LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_message_LDKCust
 }
 LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ release_pending_custom_messages_LDKCustomOnionMessageHandler_jcall(const void* this_arg) {
        LDKCustomOnionMessageHandler_JCalls *j_calls = (LDKCustomOnionMessageHandler_JCalls*) this_arg;
-       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 135);
+       int64_tArray ret = (int64_tArray)js_invoke_function_l_(j_calls->instance_ptr, 146);
        LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ ret_constr;
        ret_constr.datalen = ret->arr_len;
        if (ret_constr.datalen > 0)
@@ -14834,21 +16019,21 @@ uintptr_t send_data_LDKSocketDescriptor_jcall(void* this_arg, LDKu8slice data, b
        int8_tArray data_arr = init_int8_tArray(data_var.datalen, __LINE__);
        memcpy(data_arr->elems, data_var.data, data_var.datalen);
        jboolean resume_read_conv = resume_read;
-       return js_invoke_function_l_lb(j_calls->instance_ptr, 136, (int64_t)data_arr, resume_read_conv);
+       return js_invoke_function_l_lb(j_calls->instance_ptr, 147, (int64_t)data_arr, resume_read_conv);
 }
 void disconnect_socket_LDKSocketDescriptor_jcall(void* this_arg) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
-       js_invoke_function_void_(j_calls->instance_ptr, 137);
+       js_invoke_function_void_(j_calls->instance_ptr, 148);
 }
 bool eq_LDKSocketDescriptor_jcall(const void* this_arg, const LDKSocketDescriptor * other_arg) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
        LDKSocketDescriptor *other_arg_clone = MALLOC(sizeof(LDKSocketDescriptor), "LDKSocketDescriptor");
        *other_arg_clone = SocketDescriptor_clone(other_arg);
-       return js_invoke_function_b_l(j_calls->instance_ptr, 138, tag_ptr(other_arg_clone, true));
+       return js_invoke_function_b_l(j_calls->instance_ptr, 149, tag_ptr(other_arg_clone, true));
 }
 uint64_t hash_LDKSocketDescriptor_jcall(const void* this_arg) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) this_arg;
-       return js_invoke_function_l_(j_calls->instance_ptr, 139);
+       return js_invoke_function_l_(j_calls->instance_ptr, 150);
 }
 static void LDKSocketDescriptor_JCalls_cloned(LDKSocketDescriptor* new_obj) {
        LDKSocketDescriptor_JCalls *j_calls = (LDKSocketDescriptor_JCalls*) new_obj->this_arg;
@@ -15030,7 +16215,7 @@ static void LDKScore_JCalls_free(void* this_arg) {
 }
 LDKCVec_u8Z write_LDKScore_jcall(const void* this_arg) {
        LDKScore_JCalls *j_calls = (LDKScore_JCalls*) this_arg;
-       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 140);
+       int8_tArray ret = (int8_tArray)js_invoke_function_l_(j_calls->instance_ptr, 151);
        LDKCVec_u8Z ret_ref;
        ret_ref.datalen = ret->arr_len;
        ret_ref.data = MALLOC(ret_ref.datalen, "LDKCVec_u8Z Bytes");
@@ -15075,93 +16260,6 @@ int8_tArray  CS_LDK_Score_write(int64_t this_arg) {
        return ret_arr;
 }
 
-typedef struct LDKMessageRouter_JCalls {
-       atomic_size_t refcnt;
-       uint32_t instance_ptr;
-} LDKMessageRouter_JCalls;
-static void LDKMessageRouter_JCalls_free(void* this_arg) {
-       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
-       if (atomic_fetch_sub_explicit(&j_calls->refcnt, 1, memory_order_acquire) == 1) {
-               FREE(j_calls);
-       }
-}
-LDKCResult_OnionMessagePathNoneZ find_path_LDKMessageRouter_jcall(const void* this_arg, LDKPublicKey sender, LDKCVec_PublicKeyZ peers, LDKDestination destination) {
-       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) this_arg;
-       int8_tArray sender_arr = init_int8_tArray(33, __LINE__);
-       memcpy(sender_arr->elems, sender.compressed_form, 33);
-       LDKCVec_PublicKeyZ peers_var = peers;
-       ptrArray peers_arr = NULL;
-       peers_arr = init_ptrArray(peers_var.datalen, __LINE__);
-       int8_tArray *peers_arr_ptr = (int8_tArray*)(((uint8_t*)peers_arr) + 8);
-       for (size_t i = 0; i < peers_var.datalen; i++) {
-               int8_tArray peers_conv_8_arr = init_int8_tArray(33, __LINE__);
-               memcpy(peers_conv_8_arr->elems, peers_var.data[i].compressed_form, 33);
-               peers_arr_ptr[i] = peers_conv_8_arr;
-       }
-       
-       FREE(peers_var.data);
-       LDKDestination *destination_copy = MALLOC(sizeof(LDKDestination), "LDKDestination");
-       *destination_copy = destination;
-       int64_t destination_ref = tag_ptr(destination_copy, true);
-       uint64_t ret = js_invoke_function_l_lll(j_calls->instance_ptr, 141, (int64_t)sender_arr, (int64_t)peers_arr, destination_ref);
-       void* ret_ptr = untag_ptr(ret);
-       CHECK_ACCESS(ret_ptr);
-       LDKCResult_OnionMessagePathNoneZ ret_conv = *(LDKCResult_OnionMessagePathNoneZ*)(ret_ptr);
-       FREE(untag_ptr(ret));
-       return ret_conv;
-}
-static void LDKMessageRouter_JCalls_cloned(LDKMessageRouter* new_obj) {
-       LDKMessageRouter_JCalls *j_calls = (LDKMessageRouter_JCalls*) new_obj->this_arg;
-       atomic_fetch_add_explicit(&j_calls->refcnt, 1, memory_order_release);
-}
-static inline LDKMessageRouter LDKMessageRouter_init (int64_t o) {
-       LDKMessageRouter_JCalls *calls = MALLOC(sizeof(LDKMessageRouter_JCalls), "LDKMessageRouter_JCalls");
-       atomic_init(&calls->refcnt, 1);
-       calls->instance_ptr = o;
-
-       LDKMessageRouter ret = {
-               .this_arg = (void*) calls,
-               .find_path = find_path_LDKMessageRouter_jcall,
-               .free = LDKMessageRouter_JCalls_free,
-       };
-       return ret;
-}
-uint64_t  CS_LDK_LDKMessageRouter_new(int32_t o) {
-       LDKMessageRouter *res_ptr = MALLOC(sizeof(LDKMessageRouter), "LDKMessageRouter");
-       *res_ptr = LDKMessageRouter_init(o);
-       return tag_ptr(res_ptr, true);
-}
-int64_t  CS_LDK_MessageRouter_find_path(int64_t this_arg, int8_tArray sender, ptrArray peers, int64_t destination) {
-       void* this_arg_ptr = untag_ptr(this_arg);
-       if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
-       LDKMessageRouter* this_arg_conv = (LDKMessageRouter*)this_arg_ptr;
-       LDKPublicKey sender_ref;
-       CHECK(sender->arr_len == 33);
-       memcpy(sender_ref.compressed_form, sender->elems, 33); FREE(sender);
-       LDKCVec_PublicKeyZ peers_constr;
-       peers_constr.datalen = peers->arr_len;
-       if (peers_constr.datalen > 0)
-               peers_constr.data = MALLOC(peers_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
-       else
-               peers_constr.data = NULL;
-       int8_tArray* peers_vals = (void*) peers->elems;
-       for (size_t i = 0; i < peers_constr.datalen; i++) {
-               int8_tArray peers_conv_8 = peers_vals[i];
-               LDKPublicKey peers_conv_8_ref;
-               CHECK(peers_conv_8->arr_len == 33);
-               memcpy(peers_conv_8_ref.compressed_form, peers_conv_8->elems, 33); FREE(peers_conv_8);
-               peers_constr.data[i] = peers_conv_8_ref;
-       }
-       FREE(peers);
-       void* destination_ptr = untag_ptr(destination);
-       CHECK_ACCESS(destination_ptr);
-       LDKDestination destination_conv = *(LDKDestination*)(destination_ptr);
-       destination_conv = Destination_clone((LDKDestination*)untag_ptr(destination));
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = (this_arg_conv->find_path)(this_arg_conv->this_arg, sender_ref, peers_constr, destination_conv);
-       return tag_ptr(ret_conv, true);
-}
-
 typedef struct LDKCoinSelectionSource_JCalls {
        atomic_size_t refcnt;
        uint32_t instance_ptr;
@@ -15201,20 +16299,20 @@ LDKCResult_CoinSelectionNoneZ select_confirmed_utxos_LDKCoinSelectionSource_jcal
        
        FREE(must_pay_to_var.data);
        int32_t target_feerate_sat_per_1000_weight_conv = target_feerate_sat_per_1000_weight;
-       uint64_t ret = js_invoke_function_l_llli(j_calls->instance_ptr, 142, (int64_t)claim_id_arr, (int64_t)must_spend_arr, (int64_t)must_pay_to_arr, target_feerate_sat_per_1000_weight_conv);
+       uint64_t ret = js_invoke_function_l_llli(j_calls->instance_ptr, 152, (int64_t)claim_id_arr, (int64_t)must_spend_arr, (int64_t)must_pay_to_arr, target_feerate_sat_per_1000_weight_conv);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CoinSelectionNoneZ ret_conv = *(LDKCResult_CoinSelectionNoneZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_TransactionNoneZ sign_tx_LDKCoinSelectionSource_jcall(const void* this_arg, LDKTransaction tx) {
+LDKCResult_TransactionNoneZ sign_psbt_LDKCoinSelectionSource_jcall(const void* this_arg, LDKCVec_u8Z psbt) {
        LDKCoinSelectionSource_JCalls *j_calls = (LDKCoinSelectionSource_JCalls*) this_arg;
-       LDKTransaction tx_var = tx;
-       int8_tArray tx_arr = init_int8_tArray(tx_var.datalen, __LINE__);
-       memcpy(tx_arr->elems, tx_var.data, tx_var.datalen);
-       Transaction_free(tx_var);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 143, (int64_t)tx_arr);
+       LDKCVec_u8Z psbt_var = psbt;
+       int8_tArray psbt_arr = init_int8_tArray(psbt_var.datalen, __LINE__);
+       memcpy(psbt_arr->elems, psbt_var.data, psbt_var.datalen);
+       CVec_u8Z_free(psbt_var);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 153, (int64_t)psbt_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
@@ -15233,7 +16331,7 @@ static inline LDKCoinSelectionSource LDKCoinSelectionSource_init (int64_t o) {
        LDKCoinSelectionSource ret = {
                .this_arg = (void*) calls,
                .select_confirmed_utxos = select_confirmed_utxos_LDKCoinSelectionSource_jcall,
-               .sign_tx = sign_tx_LDKCoinSelectionSource_jcall,
+               .sign_psbt = sign_psbt_LDKCoinSelectionSource_jcall,
                .free = LDKCoinSelectionSource_JCalls_free,
        };
        return ret;
@@ -15288,17 +16386,16 @@ int64_t  CS_LDK_CoinSelectionSource_select_confirmed_utxos(int64_t this_arg, int
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CoinSelectionSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+int64_t  CS_LDK_CoinSelectionSource_sign_psbt(int64_t this_arg, int8_tArray psbt) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKCoinSelectionSource* this_arg_conv = (LDKCoinSelectionSource*)this_arg_ptr;
-       LDKTransaction tx_ref;
-       tx_ref.datalen = tx->arr_len;
-       tx_ref.data = MALLOC(tx_ref.datalen, "LDKTransaction Bytes");
-       memcpy(tx_ref.data, tx->elems, tx_ref.datalen); FREE(tx);
-       tx_ref.data_is_owned = true;
+       LDKCVec_u8Z psbt_ref;
+       psbt_ref.datalen = psbt->arr_len;
+       psbt_ref.data = MALLOC(psbt_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(psbt_ref.data, psbt->elems, psbt_ref.datalen); FREE(psbt);
        LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
-       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       *ret_conv = (this_arg_conv->sign_psbt)(this_arg_conv->this_arg, psbt_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -15314,7 +16411,7 @@ static void LDKWalletSource_JCalls_free(void* this_arg) {
 }
 LDKCResult_CVec_UtxoZNoneZ list_confirmed_utxos_LDKWalletSource_jcall(const void* this_arg) {
        LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 144);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 154);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_UtxoZNoneZ ret_conv = *(LDKCResult_CVec_UtxoZNoneZ*)(ret_ptr);
@@ -15323,20 +16420,20 @@ LDKCResult_CVec_UtxoZNoneZ list_confirmed_utxos_LDKWalletSource_jcall(const void
 }
 LDKCResult_CVec_u8ZNoneZ get_change_script_LDKWalletSource_jcall(const void* this_arg) {
        LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
-       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 145);
+       uint64_t ret = js_invoke_function_l_(j_calls->instance_ptr, 155);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_CVec_u8ZNoneZ ret_conv = *(LDKCResult_CVec_u8ZNoneZ*)(ret_ptr);
        FREE(untag_ptr(ret));
        return ret_conv;
 }
-LDKCResult_TransactionNoneZ sign_tx_LDKWalletSource_jcall(const void* this_arg, LDKTransaction tx) {
+LDKCResult_TransactionNoneZ sign_psbt_LDKWalletSource_jcall(const void* this_arg, LDKCVec_u8Z psbt) {
        LDKWalletSource_JCalls *j_calls = (LDKWalletSource_JCalls*) this_arg;
-       LDKTransaction tx_var = tx;
-       int8_tArray tx_arr = init_int8_tArray(tx_var.datalen, __LINE__);
-       memcpy(tx_arr->elems, tx_var.data, tx_var.datalen);
-       Transaction_free(tx_var);
-       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 146, (int64_t)tx_arr);
+       LDKCVec_u8Z psbt_var = psbt;
+       int8_tArray psbt_arr = init_int8_tArray(psbt_var.datalen, __LINE__);
+       memcpy(psbt_arr->elems, psbt_var.data, psbt_var.datalen);
+       CVec_u8Z_free(psbt_var);
+       uint64_t ret = js_invoke_function_l_l(j_calls->instance_ptr, 156, (int64_t)psbt_arr);
        void* ret_ptr = untag_ptr(ret);
        CHECK_ACCESS(ret_ptr);
        LDKCResult_TransactionNoneZ ret_conv = *(LDKCResult_TransactionNoneZ*)(ret_ptr);
@@ -15356,7 +16453,7 @@ static inline LDKWalletSource LDKWalletSource_init (int64_t o) {
                .this_arg = (void*) calls,
                .list_confirmed_utxos = list_confirmed_utxos_LDKWalletSource_jcall,
                .get_change_script = get_change_script_LDKWalletSource_jcall,
-               .sign_tx = sign_tx_LDKWalletSource_jcall,
+               .sign_psbt = sign_psbt_LDKWalletSource_jcall,
                .free = LDKWalletSource_JCalls_free,
        };
        return ret;
@@ -15384,17 +16481,16 @@ int64_t  CS_LDK_WalletSource_get_change_script(int64_t this_arg) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_WalletSource_sign_tx(int64_t this_arg, int8_tArray tx) {
+int64_t  CS_LDK_WalletSource_sign_psbt(int64_t this_arg, int8_tArray psbt) {
        void* this_arg_ptr = untag_ptr(this_arg);
        if (ptr_is_owned(this_arg)) { CHECK_ACCESS(this_arg_ptr); }
        LDKWalletSource* this_arg_conv = (LDKWalletSource*)this_arg_ptr;
-       LDKTransaction tx_ref;
-       tx_ref.datalen = tx->arr_len;
-       tx_ref.data = MALLOC(tx_ref.datalen, "LDKTransaction Bytes");
-       memcpy(tx_ref.data, tx->elems, tx_ref.datalen); FREE(tx);
-       tx_ref.data_is_owned = true;
+       LDKCVec_u8Z psbt_ref;
+       psbt_ref.datalen = psbt->arr_len;
+       psbt_ref.data = MALLOC(psbt_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(psbt_ref.data, psbt->elems, psbt_ref.datalen); FREE(psbt);
        LDKCResult_TransactionNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_TransactionNoneZ), "LDKCResult_TransactionNoneZ");
-       *ret_conv = (this_arg_conv->sign_tx)(this_arg_conv->this_arg, tx_ref);
+       *ret_conv = (this_arg_conv->sign_psbt)(this_arg_conv->this_arg, psbt_ref);
        return tag_ptr(ret_conv, true);
 }
 
@@ -15494,6 +16590,58 @@ int8_tArray  CS_LDK_U128_new(int8_tArray le_bytes) {
        return ret_arr;
 }
 
+int64_t  CS_LDK_WitnessProgram_new(int8_t version, int8_tArray program) {
+       
+       LDKCVec_u8Z program_ref;
+       program_ref.datalen = program->arr_len;
+       program_ref.data = MALLOC(program_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(program_ref.data, program->elems, program_ref.datalen); FREE(program);
+       LDKWitnessProgram* ret_ref = MALLOC(sizeof(LDKWitnessProgram), "LDKWitnessProgram");
+       *ret_ref = WitnessProgram_new((LDKWitnessVersion){ ._0 = version }, program_ref);
+       return tag_ptr(ret_ref, true);
+}
+
+int8_t  CS_LDK_WitnessProgram_get_version(int64_t prog) {
+       LDKWitnessProgram* prog_conv = (LDKWitnessProgram*)untag_ptr(prog);
+       uint8_t ret_val = WitnessProgram_get_version(prog_conv)._0;
+       return ret_val;
+}
+
+int8_tArray  CS_LDK_WitnessProgram_get_program(int64_t prog) {
+       LDKWitnessProgram* prog_conv = (LDKWitnessProgram*)untag_ptr(prog);
+       LDKu8slice ret_var = WitnessProgram_get_program(prog_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       return ret_arr;
+}
+
+static inline uint64_t WitnessProgram_clone_ptr(LDKWitnessProgram *NONNULL_PTR arg) {
+       LDKWitnessProgram* ret_ref = MALLOC(sizeof(LDKWitnessProgram), "LDKWitnessProgram");
+       *ret_ref = WitnessProgram_clone(arg);
+       return tag_ptr(ret_ref, true);
+}
+int64_t  CS_LDK_WitnessProgram_clone_ptr(int64_t arg) {
+       LDKWitnessProgram* arg_conv = (LDKWitnessProgram*)untag_ptr(arg);
+       int64_t ret_conv = WitnessProgram_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WitnessProgram_clone(int64_t orig) {
+       LDKWitnessProgram* orig_conv = (LDKWitnessProgram*)untag_ptr(orig);
+       LDKWitnessProgram* ret_ref = MALLOC(sizeof(LDKWitnessProgram), "LDKWitnessProgram");
+       *ret_ref = WitnessProgram_clone(orig_conv);
+       return tag_ptr(ret_ref, true);
+}
+
+void  CS_LDK_WitnessProgram_free(int64_t o) {
+       if (!ptr_is_owned(o)) return;
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKWitnessProgram o_conv = *(LDKWitnessProgram*)(o_ptr);
+       FREE(untag_ptr(o));
+       WitnessProgram_free(o_conv);
+}
+
 int64_t  CS_LDK_BigEndianScalar_new(int8_tArray big_endian_bytes) {
        LDKThirtyTwoBytes big_endian_bytes_ref;
        CHECK(big_endian_bytes->arr_len == 32);
@@ -15550,15 +16698,6 @@ void  CS_LDK_Witness_free(int8_tArray _res) {
        Witness_free(_res_ref);
 }
 
-void  CS_LDK_TxIn_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKTxIn _res_conv = *(LDKTxIn*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       TxIn_free(_res_conv);
-}
-
 int64_t  CS_LDK_TxIn_new(int8_tArray witness, int8_tArray script_sig, int32_t sequence, int8_tArray previous_txid, int32_t previous_vout) {
        LDKWitness witness_ref;
        witness_ref.datalen = witness->arr_len;
@@ -15577,6 +16716,51 @@ int64_t  CS_LDK_TxIn_new(int8_tArray witness, int8_tArray script_sig, int32_t se
        return tag_ptr(ret_ref, true);
 }
 
+int8_tArray  CS_LDK_TxIn_get_witness(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       LDKWitness ret_var = TxIn_get_witness(txin_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       Witness_free(ret_var);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_TxIn_get_script_sig(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       LDKu8slice ret_var = TxIn_get_script_sig(txin_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_TxIn_get_sequence(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       int32_t ret_conv = TxIn_get_sequence(txin_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_TxIn_get_previous_txid(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, TxIn_get_previous_txid(txin_conv).data, 32);
+       return ret_arr;
+}
+
+int32_t  CS_LDK_TxIn_get_previous_vout(int64_t txin) {
+       LDKTxIn* txin_conv = (LDKTxIn*)untag_ptr(txin);
+       int32_t ret_conv = TxIn_get_previous_vout(txin_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_TxIn_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKTxIn _res_conv = *(LDKTxIn*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       TxIn_free(_res_conv);
+}
+
 int64_t  CS_LDK_TxOut_new(int8_tArray script_pubkey, int64_t value) {
        LDKCVec_u8Z script_pubkey_ref;
        script_pubkey_ref.datalen = script_pubkey->arr_len;
@@ -15587,6 +16771,20 @@ int64_t  CS_LDK_TxOut_new(int8_tArray script_pubkey, int64_t value) {
        return tag_ptr(ret_ref, true);
 }
 
+int8_tArray  CS_LDK_TxOut_get_script_pubkey(int64_t txout) {
+       LDKTxOut* txout_conv = (LDKTxOut*)untag_ptr(txout);
+       LDKu8slice ret_var = TxOut_get_script_pubkey(txout_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_TxOut_get_value(int64_t txout) {
+       LDKTxOut* txout_conv = (LDKTxOut*)untag_ptr(txout);
+       int64_t ret_conv = TxOut_get_value(txout_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_TxOut_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
@@ -16564,89 +17762,89 @@ int64_t  CS_LDK_COption_u32Z_clone(int64_t orig) {
        return ret_ref;
 }
 
-static inline uint64_t C2Tuple_CVec_u8ZusizeZ_clone_ptr(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR arg) {
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = C2Tuple_CVec_u8ZusizeZ_clone(arg);
+static inline uint64_t C2Tuple_CVec_u8Zu64Z_clone_ptr(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR arg) {
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = C2Tuple_CVec_u8Zu64Z_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_CVec_u8ZusizeZ* arg_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_CVec_u8ZusizeZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple_CVec_u8Zu64Z* arg_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_CVec_u8Zu64Z_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_clone(int64_t orig) {
-       LDKC2Tuple_CVec_u8ZusizeZ* orig_conv = (LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(orig);
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = C2Tuple_CVec_u8ZusizeZ_clone(orig_conv);
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_clone(int64_t orig) {
+       LDKC2Tuple_CVec_u8Zu64Z* orig_conv = (LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(orig);
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = C2Tuple_CVec_u8Zu64Z_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_C2Tuple_CVec_u8ZusizeZ_new(int8_tArray a, int64_t b) {
+int64_t  CS_LDK_C2Tuple_CVec_u8Zu64Z_new(int8_tArray a, int64_t b) {
        LDKCVec_u8Z a_ref;
        a_ref.datalen = a->arr_len;
        a_ref.data = MALLOC(a_ref.datalen, "LDKCVec_u8Z Bytes");
        memcpy(a_ref.data, a->elems, a_ref.datalen); FREE(a);
-       LDKC2Tuple_CVec_u8ZusizeZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8ZusizeZ), "LDKC2Tuple_CVec_u8ZusizeZ");
-       *ret_conv = C2Tuple_CVec_u8ZusizeZ_new(a_ref, b);
+       LDKC2Tuple_CVec_u8Zu64Z* ret_conv = MALLOC(sizeof(LDKC2Tuple_CVec_u8Zu64Z), "LDKC2Tuple_CVec_u8Zu64Z");
+       *ret_conv = C2Tuple_CVec_u8Zu64Z_new(a_ref, b);
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_C2Tuple_CVec_u8ZusizeZ_free(int64_t _res) {
+void  CS_LDK_C2Tuple_CVec_u8Zu64Z_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_CVec_u8ZusizeZ _res_conv = *(LDKC2Tuple_CVec_u8ZusizeZ*)(_res_ptr);
+       LDKC2Tuple_CVec_u8Zu64Z _res_conv = *(LDKC2Tuple_CVec_u8Zu64Z*)(_res_ptr);
        FREE(untag_ptr(_res));
-       C2Tuple_CVec_u8ZusizeZ_free(_res_conv);
+       C2Tuple_CVec_u8Zu64Z_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok(int64_t o) {
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
-       LDKC2Tuple_CVec_u8ZusizeZ o_conv = *(LDKC2Tuple_CVec_u8ZusizeZ*)(o_ptr);
-       o_conv = C2Tuple_CVec_u8ZusizeZ_clone((LDKC2Tuple_CVec_u8ZusizeZ*)untag_ptr(o));
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok(o_conv);
+       LDKC2Tuple_CVec_u8Zu64Z o_conv = *(LDKC2Tuple_CVec_u8Zu64Z*)(o_ptr);
+       o_conv = C2Tuple_CVec_u8Zu64Z_clone((LDKC2Tuple_CVec_u8Zu64Z*)untag_ptr(o));
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err() {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err();
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err() {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err();
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(int64_t o) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* o_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* o_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free(int64_t _res) {
+void  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ _res_conv = *(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)(_res_ptr);
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ _res_conv = *(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free(_res_conv);
+       CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free(_res_conv);
 }
 
-static inline uint64_t CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR arg) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(arg);
+static inline uint64_t CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* arg_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* arg_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(int64_t orig) {
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* orig_conv = (LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ*)untag_ptr(orig);
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
-       *ret_conv = CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(orig_conv);
+int64_t  CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* orig_conv = (LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
+       *ret_conv = CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -16803,173 +18001,6 @@ int64_t  CS_LDK_CResult_NoneNoneZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_CVec_ECDSASignatureZ_free(ptrArray _res) {
-       LDKCVec_ECDSASignatureZ _res_constr;
-       _res_constr.datalen = _res->arr_len;
-       if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
-       else
-               _res_constr.data = NULL;
-       int8_tArray* _res_vals = (void*) _res->elems;
-       for (size_t i = 0; i < _res_constr.datalen; i++) {
-               int8_tArray _res_conv_8 = _res_vals[i];
-               LDKECDSASignature _res_conv_8_ref;
-               CHECK(_res_conv_8->arr_len == 64);
-               memcpy(_res_conv_8_ref.compact_form, _res_conv_8->elems, 64); FREE(_res_conv_8);
-               _res_constr.data[i] = _res_conv_8_ref;
-       }
-       FREE(_res);
-       CVec_ECDSASignatureZ_free(_res_constr);
-}
-
-static inline uint64_t C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR arg) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* arg_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(int64_t orig) {
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* orig_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(orig);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(int8_tArray a, ptrArray b) {
-       LDKECDSASignature a_ref;
-       CHECK(a->arr_len == 64);
-       memcpy(a_ref.compact_form, a->elems, 64); FREE(a);
-       LDKCVec_ECDSASignatureZ b_constr;
-       b_constr.datalen = b->arr_len;
-       if (b_constr.datalen > 0)
-               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
-       else
-               b_constr.data = NULL;
-       int8_tArray* b_vals = (void*) b->elems;
-       for (size_t i = 0; i < b_constr.datalen; i++) {
-               int8_tArray b_conv_8 = b_vals[i];
-               LDKECDSASignature b_conv_8_ref;
-               CHECK(b_conv_8->arr_len == 64);
-               memcpy(b_conv_8_ref.compact_form, b_conv_8->elems, 64); FREE(b_conv_8);
-               b_constr.data[i] = b_conv_8_ref;
-       }
-       FREE(b);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
-       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(a_ref, b_constr);
-       return tag_ptr(ret_conv, true);
-}
-
-void  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ _res_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(_res_conv);
-}
-
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(int64_t o) {
-       void* o_ptr = untag_ptr(o);
-       CHECK_ACCESS(o_ptr);
-       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ o_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(o_ptr);
-       o_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone((LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(o));
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(o_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err() {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err();
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(int64_t o) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* o_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR arg) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* arg_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(int64_t orig) {
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(orig);
-       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
-       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_ok(int8_tArray o) {
-       LDKECDSASignature o_ref;
-       CHECK(o->arr_len == 64);
-       memcpy(o_ref.compact_form, o->elems, 64); FREE(o);
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_ok(o_ref);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_err() {
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_err();
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_ECDSASignatureNoneZ_is_ok(int64_t o) {
-       LDKCResult_ECDSASignatureNoneZ* o_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_ECDSASignatureNoneZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_ECDSASignatureNoneZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_ECDSASignatureNoneZ _res_conv = *(LDKCResult_ECDSASignatureNoneZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_ECDSASignatureNoneZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_ECDSASignatureNoneZ_clone_ptr(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR arg) {
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_ECDSASignatureNoneZ* arg_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_ECDSASignatureNoneZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone(int64_t orig) {
-       LDKCResult_ECDSASignatureNoneZ* orig_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(orig);
-       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
-       *ret_conv = CResult_ECDSASignatureNoneZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
 int64_t  CS_LDK_CResult_PublicKeyNoneZ_ok(int8_tArray o) {
        LDKPublicKey o_ref;
        CHECK(o->arr_len == 33);
@@ -17178,6 +18209,54 @@ int64_t  CS_LDK_CResult_SchnorrSignatureNoneZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_ok(int8_tArray o) {
+       LDKECDSASignature o_ref;
+       CHECK(o->arr_len == 64);
+       memcpy(o_ref.compact_form, o->elems, 64); FREE(o);
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_err() {
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_ECDSASignatureNoneZ_is_ok(int64_t o) {
+       LDKCResult_ECDSASignatureNoneZ* o_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_ECDSASignatureNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_ECDSASignatureNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_ECDSASignatureNoneZ _res_conv = *(LDKCResult_ECDSASignatureNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_ECDSASignatureNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_ECDSASignatureNoneZ_clone_ptr(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR arg) {
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_ECDSASignatureNoneZ* arg_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_ECDSASignatureNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_ECDSASignatureNoneZ_clone(int64_t orig) {
+       LDKCResult_ECDSASignatureNoneZ* orig_conv = (LDKCResult_ECDSASignatureNoneZ*)untag_ptr(orig);
+       LDKCResult_ECDSASignatureNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_ECDSASignatureNoneZ), "LDKCResult_ECDSASignatureNoneZ");
+       *ret_conv = CResult_ECDSASignatureNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_ok(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
@@ -17419,84 +18498,172 @@ int64_t  CS_LDK_COption_boolZ_clone(int64_t orig) {
        return ret_ref;
 }
 
-void  CS_LDK_CVec_CVec_u8ZZ_free(ptrArray _res) {
-       LDKCVec_CVec_u8ZZ _res_constr;
+int64_t  CS_LDK_CResult_WitnessNoneZ_ok(int8_tArray o) {
+       LDKWitness o_ref;
+       o_ref.datalen = o->arr_len;
+       o_ref.data = MALLOC(o_ref.datalen, "LDKWitness Bytes");
+       memcpy(o_ref.data, o->elems, o_ref.datalen); FREE(o);
+       o_ref.data_is_owned = true;
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_ok(o_ref);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_WitnessNoneZ_err() {
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_WitnessNoneZ_is_ok(int64_t o) {
+       LDKCResult_WitnessNoneZ* o_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_WitnessNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_WitnessNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_WitnessNoneZ _res_conv = *(LDKCResult_WitnessNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_WitnessNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_WitnessNoneZ_clone_ptr(LDKCResult_WitnessNoneZ *NONNULL_PTR arg) {
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_WitnessNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_WitnessNoneZ* arg_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_WitnessNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_WitnessNoneZ_clone(int64_t orig) {
+       LDKCResult_WitnessNoneZ* orig_conv = (LDKCResult_WitnessNoneZ*)untag_ptr(orig);
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
+       *ret_conv = CResult_WitnessNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_ECDSASignatureZ_free(ptrArray _res) {
+       LDKCVec_ECDSASignatureZ _res_constr;
        _res_constr.datalen = _res->arr_len;
        if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKCVec_u8Z), "LDKCVec_CVec_u8ZZ Elements");
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
        else
                _res_constr.data = NULL;
        int8_tArray* _res_vals = (void*) _res->elems;
        for (size_t i = 0; i < _res_constr.datalen; i++) {
                int8_tArray _res_conv_8 = _res_vals[i];
-               LDKCVec_u8Z _res_conv_8_ref;
-               _res_conv_8_ref.datalen = _res_conv_8->arr_len;
-               _res_conv_8_ref.data = MALLOC(_res_conv_8_ref.datalen, "LDKCVec_u8Z Bytes");
-               memcpy(_res_conv_8_ref.data, _res_conv_8->elems, _res_conv_8_ref.datalen); FREE(_res_conv_8);
+               LDKECDSASignature _res_conv_8_ref;
+               CHECK(_res_conv_8->arr_len == 64);
+               memcpy(_res_conv_8_ref.compact_form, _res_conv_8->elems, 64); FREE(_res_conv_8);
                _res_constr.data[i] = _res_conv_8_ref;
        }
        FREE(_res);
-       CVec_CVec_u8ZZ_free(_res_constr);
+       CVec_ECDSASignatureZ_free(_res_constr);
 }
 
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_ok(ptrArray o) {
-       LDKCVec_CVec_u8ZZ o_constr;
-       o_constr.datalen = o->arr_len;
-       if (o_constr.datalen > 0)
-               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKCVec_u8Z), "LDKCVec_CVec_u8ZZ Elements");
+static inline uint64_t C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* arg_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(int64_t orig) {
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* orig_conv = (LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(orig);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(int8_tArray a, ptrArray b) {
+       LDKECDSASignature a_ref;
+       CHECK(a->arr_len == 64);
+       memcpy(a_ref.compact_form, a->elems, 64); FREE(a);
+       LDKCVec_ECDSASignatureZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKECDSASignature), "LDKCVec_ECDSASignatureZ Elements");
        else
-               o_constr.data = NULL;
-       int8_tArray* o_vals = (void*) o->elems;
-       for (size_t i = 0; i < o_constr.datalen; i++) {
-               int8_tArray o_conv_8 = o_vals[i];
-               LDKCVec_u8Z o_conv_8_ref;
-               o_conv_8_ref.datalen = o_conv_8->arr_len;
-               o_conv_8_ref.data = MALLOC(o_conv_8_ref.datalen, "LDKCVec_u8Z Bytes");
-               memcpy(o_conv_8_ref.data, o_conv_8->elems, o_conv_8_ref.datalen); FREE(o_conv_8);
-               o_constr.data[i] = o_conv_8_ref;
+               b_constr.data = NULL;
+       int8_tArray* b_vals = (void*) b->elems;
+       for (size_t i = 0; i < b_constr.datalen; i++) {
+               int8_tArray b_conv_8 = b_vals[i];
+               LDKECDSASignature b_conv_8_ref;
+               CHECK(b_conv_8->arr_len == 64);
+               memcpy(b_conv_8_ref.compact_form, b_conv_8->elems, 64); FREE(b_conv_8);
+               b_constr.data[i] = b_conv_8_ref;
        }
-       FREE(o);
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_ok(o_constr);
+       FREE(b);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ), "LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ");
+       *ret_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(a_ref, b_constr);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_err() {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_err();
+void  CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ _res_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(_res_conv);
+}
+
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ o_conv = *(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)(o_ptr);
+       o_conv = C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone((LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ*)untag_ptr(o));
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_is_ok(int64_t o) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* o_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_CVec_CVec_u8ZZNoneZ_is_ok(o_conv);
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err() {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* o_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_free(int64_t _res) {
+void  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_CVec_CVec_u8ZZNoneZ _res_conv = *(LDKCResult_CVec_CVec_u8ZZNoneZ*)(_res_ptr);
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ _res_conv = *(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_CVec_CVec_u8ZZNoneZ_free(_res_conv);
+       CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(_res_conv);
 }
 
-static inline uint64_t CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR arg) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_clone(arg);
+static inline uint64_t CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* arg_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* arg_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_clone(int64_t orig) {
-       LDKCResult_CVec_CVec_u8ZZNoneZ* orig_conv = (LDKCResult_CVec_CVec_u8ZZNoneZ*)untag_ptr(orig);
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
-       *ret_conv = CResult_CVec_CVec_u8ZZNoneZ_clone(orig_conv);
+int64_t  CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(int64_t orig) {
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* orig_conv = (LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ*)untag_ptr(orig);
+       LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ), "LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ");
+       *ret_conv = CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -17755,6 +18922,261 @@ int64_t  CS_LDK_CResult_RouteLightningErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+static inline uint64_t C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR arg) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* arg_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone(int64_t orig) {
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* orig_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(orig);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_new(int64_t a, int64_t b) {
+       LDKBlindedPayInfo a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = BlindedPayInfo_clone(&a_conv);
+       LDKBlindedPath b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv = BlindedPath_clone(&b_conv);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
+       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_new(a_conv, b_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_BlindedPayInfoBlindedPathZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t l = 0; l < _res_constr.datalen; l++) {
+               int64_t _res_conv_37 = _res_vals[l];
+               void* _res_conv_37_ptr = untag_ptr(_res_conv_37);
+               CHECK_ACCESS(_res_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_conv_37_ptr);
+               FREE(untag_ptr(_res_conv_37));
+               _res_constr.data[l] = _res_conv_37_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok(int64_tArray o) {
+       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t l = 0; l < o_constr.datalen; l++) {
+               int64_t o_conv_37 = o_vals[l];
+               void* o_conv_37_ptr = untag_ptr(o_conv_37);
+               CHECK_ACCESS(o_conv_37_ptr);
+               LDKC2Tuple_BlindedPayInfoBlindedPathZ o_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(o_conv_37_ptr);
+               o_conv_37_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone((LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(o_conv_37));
+               o_constr.data[l] = o_conv_37_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err() {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* o_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ _res_conv = *(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* arg_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* orig_conv = (LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ), "LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ");
+       *ret_conv = CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_CVec_PublicKeyZ_free(ptrArray _res) {
+       LDKCVec_PublicKeyZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
+       else
+               _res_constr.data = NULL;
+       int8_tArray* _res_vals = (void*) _res->elems;
+       for (size_t i = 0; i < _res_constr.datalen; i++) {
+               int8_tArray _res_conv_8 = _res_vals[i];
+               LDKPublicKey _res_conv_8_ref;
+               CHECK(_res_conv_8->arr_len == 33);
+               memcpy(_res_conv_8_ref.compressed_form, _res_conv_8->elems, 33); FREE(_res_conv_8);
+               _res_constr.data[i] = _res_conv_8_ref;
+       }
+       FREE(_res);
+       CVec_PublicKeyZ_free(_res_constr);
+}
+
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_ok(int64_t o) {
+       LDKOnionMessagePath o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = OnionMessagePath_clone(&o_conv);
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_err() {
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OnionMessagePathNoneZ_is_ok(int64_t o) {
+       LDKCResult_OnionMessagePathNoneZ* o_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OnionMessagePathNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OnionMessagePathNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OnionMessagePathNoneZ _res_conv = *(LDKCResult_OnionMessagePathNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OnionMessagePathNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OnionMessagePathNoneZ_clone_ptr(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR arg) {
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_OnionMessagePathNoneZ* arg_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OnionMessagePathNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone(int64_t orig) {
+       LDKCResult_OnionMessagePathNoneZ* orig_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(orig);
+       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
+       *ret_conv = CResult_OnionMessagePathNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_ok(int64_tArray o) {
+       LDKCVec_BlindedPathZ o_constr;
+       o_constr.datalen = o->arr_len;
+       if (o_constr.datalen > 0)
+               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKBlindedPath), "LDKCVec_BlindedPathZ Elements");
+       else
+               o_constr.data = NULL;
+       int64_t* o_vals = o->elems;
+       for (size_t n = 0; n < o_constr.datalen; n++) {
+               int64_t o_conv_13 = o_vals[n];
+               LDKBlindedPath o_conv_13_conv;
+               o_conv_13_conv.inner = untag_ptr(o_conv_13);
+               o_conv_13_conv.is_owned = ptr_is_owned(o_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv_13_conv);
+               o_conv_13_conv = BlindedPath_clone(&o_conv_13_conv);
+               o_constr.data[n] = o_conv_13_conv;
+       }
+       FREE(o);
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_ok(o_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_err() {
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_err();
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_CVec_BlindedPathZNoneZ_is_ok(int64_t o) {
+       LDKCResult_CVec_BlindedPathZNoneZ* o_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_CVec_BlindedPathZNoneZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_CVec_BlindedPathZNoneZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_CVec_BlindedPathZNoneZ _res_conv = *(LDKCResult_CVec_BlindedPathZNoneZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_CVec_BlindedPathZNoneZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_CVec_BlindedPathZNoneZ_clone_ptr(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_CVec_BlindedPathZNoneZ* arg_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_CVec_BlindedPathZNoneZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_CVec_BlindedPathZNoneZ_clone(int64_t orig) {
+       LDKCResult_CVec_BlindedPathZNoneZ* orig_conv = (LDKCResult_CVec_BlindedPathZNoneZ*)untag_ptr(orig);
+       LDKCResult_CVec_BlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_BlindedPathZNoneZ), "LDKCResult_CVec_BlindedPathZNoneZ");
+       *ret_conv = CResult_CVec_BlindedPathZNoneZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_ok(int64_t o) {
        LDKInFlightHtlcs o_conv;
        o_conv.inner = untag_ptr(o);
@@ -18155,69 +19577,6 @@ int64_t  CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-static inline uint64_t C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR arg) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
-       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* arg_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone(int64_t orig) {
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* orig_conv = (LDKC2Tuple_BlindedPayInfoBlindedPathZ*)untag_ptr(orig);
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
-       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_new(int64_t a, int64_t b) {
-       LDKBlindedPayInfo a_conv;
-       a_conv.inner = untag_ptr(a);
-       a_conv.is_owned = ptr_is_owned(a);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
-       a_conv = BlindedPayInfo_clone(&a_conv);
-       LDKBlindedPath b_conv;
-       b_conv.inner = untag_ptr(b);
-       b_conv.is_owned = ptr_is_owned(b);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
-       b_conv = BlindedPath_clone(&b_conv);
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKC2Tuple_BlindedPayInfoBlindedPathZ");
-       *ret_conv = C2Tuple_BlindedPayInfoBlindedPathZ_new(a_conv, b_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-void  CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       C2Tuple_BlindedPayInfoBlindedPathZ_free(_res_conv);
-}
-
-void  CS_LDK_CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(int64_tArray _res) {
-       LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ _res_constr;
-       _res_constr.datalen = _res->arr_len;
-       if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_BlindedPayInfoBlindedPathZ), "LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ Elements");
-       else
-               _res_constr.data = NULL;
-       int64_t* _res_vals = _res->elems;
-       for (size_t l = 0; l < _res_constr.datalen; l++) {
-               int64_t _res_conv_37 = _res_vals[l];
-               void* _res_conv_37_ptr = untag_ptr(_res_conv_37);
-               CHECK_ACCESS(_res_conv_37_ptr);
-               LDKC2Tuple_BlindedPayInfoBlindedPathZ _res_conv_37_conv = *(LDKC2Tuple_BlindedPayInfoBlindedPathZ*)(_res_conv_37_ptr);
-               FREE(untag_ptr(_res_conv_37));
-               _res_constr.data[l] = _res_conv_37_conv;
-       }
-       FREE(_res);
-       CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(_res_constr);
-}
-
 void  CS_LDK_CVec_RouteHintZ_free(int64_tArray _res) {
        LDKCVec_RouteHintZ _res_constr;
        _res_constr.datalen = _res->arr_len;
@@ -18366,25 +19725,6 @@ int64_t  CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_CVec_PublicKeyZ_free(ptrArray _res) {
-       LDKCVec_PublicKeyZ _res_constr;
-       _res_constr.datalen = _res->arr_len;
-       if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKPublicKey), "LDKCVec_PublicKeyZ Elements");
-       else
-               _res_constr.data = NULL;
-       int8_tArray* _res_vals = (void*) _res->elems;
-       for (size_t i = 0; i < _res_constr.datalen; i++) {
-               int8_tArray _res_conv_8 = _res_vals[i];
-               LDKPublicKey _res_conv_8_ref;
-               CHECK(_res_conv_8->arr_len == 33);
-               memcpy(_res_conv_8_ref.compressed_form, _res_conv_8->elems, 33); FREE(_res_conv_8);
-               _res_constr.data[i] = _res_conv_8_ref;
-       }
-       FREE(_res);
-       CVec_PublicKeyZ_free(_res_constr);
-}
-
 int64_t  CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_ok(int64_t o) {
        LDKFixedPenaltyScorer o_conv;
        o_conv.inner = untag_ptr(o);
@@ -18746,64 +20086,64 @@ void  CS_LDK_CVec_C2Tuple_usizeTransactionZZ_free(int64_tArray _res) {
        CVec_C2Tuple_usizeTransactionZZ_free(_res_constr);
 }
 
-static inline uint64_t C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR arg) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-       *ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(arg);
+static inline uint64_t C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR arg) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* arg_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* arg_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(int64_t orig) {
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* orig_conv = (LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)untag_ptr(orig);
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-       *ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(orig_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(int64_t orig) {
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* orig_conv = (LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)untag_ptr(orig);
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(int8_tArray a, int64_t b) {
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new(int8_tArray a, int32_t b, int64_t c) {
        LDKThirtyTwoBytes a_ref;
        CHECK(a->arr_len == 32);
        memcpy(a_ref.data, a->elems, 32); FREE(a);
-       void* b_ptr = untag_ptr(b);
-       CHECK_ACCESS(b_ptr);
-       LDKCOption_ThirtyTwoBytesZ b_conv = *(LDKCOption_ThirtyTwoBytesZ*)(b_ptr);
-       b_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(b));
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-       *ret_conv = C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(a_ref, b_conv);
+       void* c_ptr = untag_ptr(c);
+       CHECK_ACCESS(c_ptr);
+       LDKCOption_ThirtyTwoBytesZ c_conv = *(LDKCOption_ThirtyTwoBytesZ*)(c_ptr);
+       c_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(c));
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new(a_ref, b, c_conv);
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(int64_t _res) {
+void  CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ _res_conv = *(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)(_res_ptr);
+       LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ _res_conv = *(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(_res_conv);
+       C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free(_res_conv);
 }
 
-void  CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(int64_tArray _res) {
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ _res_constr;
+void  CS_LDK_CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_free(int64_tArray _res) {
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ _res_constr;
        _res_constr.datalen = _res->arr_len;
        if (_res_constr.datalen > 0)
-               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ Elements");
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ Elements");
        else
                _res_constr.data = NULL;
        int64_t* _res_vals = _res->elems;
-       for (size_t x = 0; x < _res_constr.datalen; x++) {
-               int64_t _res_conv_49 = _res_vals[x];
-               void* _res_conv_49_ptr = untag_ptr(_res_conv_49);
-               CHECK_ACCESS(_res_conv_49_ptr);
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ _res_conv_49_conv = *(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ*)(_res_conv_49_ptr);
-               FREE(untag_ptr(_res_conv_49));
-               _res_constr.data[x] = _res_conv_49_conv;
+       for (size_t c = 0; c < _res_constr.datalen; c++) {
+               int64_t _res_conv_54 = _res_vals[c];
+               void* _res_conv_54_ptr = untag_ptr(_res_conv_54);
+               CHECK_ACCESS(_res_conv_54_ptr);
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ _res_conv_54_conv = *(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ*)(_res_conv_54_ptr);
+               FREE(untag_ptr(_res_conv_54));
+               _res_constr.data[c] = _res_conv_54_conv;
        }
        FREE(_res);
-       CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(_res_constr);
+       CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_free(_res_constr);
 }
 
 int64_t  CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_ok(int32_t o) {
@@ -20270,6 +21610,44 @@ int64_t  CS_LDK_COption_CVec_SocketAddressZZ_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_ok(int64_t o) {
+       LDKPendingHTLCInfo o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = PendingHTLCInfo_clone(&o_conv);
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoInboundHTLCErrZ), "LDKCResult_PendingHTLCInfoInboundHTLCErrZ");
+       *ret_conv = CResult_PendingHTLCInfoInboundHTLCErrZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_err(int64_t e) {
+       LDKInboundHTLCErr e_conv;
+       e_conv.inner = untag_ptr(e);
+       e_conv.is_owned = ptr_is_owned(e);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(e_conv);
+       // WARNING: we need a move here but no clone is available for LDKInboundHTLCErr
+       
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoInboundHTLCErrZ), "LDKCResult_PendingHTLCInfoInboundHTLCErrZ");
+       *ret_conv = CResult_PendingHTLCInfoInboundHTLCErrZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(int64_t o) {
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* o_conv = (LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ _res_conv = *(LDKCResult_PendingHTLCInfoInboundHTLCErrZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PendingHTLCInfoInboundHTLCErrZ_free(_res_conv);
+}
+
 void  CS_LDK_CVec_HTLCOutputInCommitmentZ_free(int64_tArray _res) {
        LDKCVec_HTLCOutputInCommitmentZ _res_constr;
        _res_constr.datalen = _res->arr_len;
@@ -21605,6 +22983,217 @@ int64_t  CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_ok(int64_t o) {
+       LDKBlindedForward o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = BlindedForward_clone(&o_conv);
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedForwardDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedForwardDecodeErrorZ* o_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedForwardDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedForwardDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedForwardDecodeErrorZ _res_conv = *(LDKCResult_BlindedForwardDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedForwardDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedForwardDecodeErrorZ_clone_ptr(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedForwardDecodeErrorZ* arg_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedForwardDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedForwardDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedForwardDecodeErrorZ* orig_conv = (LDKCResult_BlindedForwardDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = CResult_BlindedForwardDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKPendingHTLCRouting o_conv = *(LDKPendingHTLCRouting*)(o_ptr);
+       o_conv = PendingHTLCRouting_clone((LDKPendingHTLCRouting*)untag_ptr(o));
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* o_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ _res_conv = *(LDKCResult_PendingHTLCRoutingDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PendingHTLCRoutingDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* arg_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* orig_conv = (LDKCResult_PendingHTLCRoutingDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCRoutingDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_ok(int64_t o) {
+       LDKPendingHTLCInfo o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = PendingHTLCInfo_clone(&o_conv);
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* o_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_PendingHTLCInfoDecodeErrorZ _res_conv = *(LDKCResult_PendingHTLCInfoDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_PendingHTLCInfoDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* arg_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* orig_conv = (LDKCResult_PendingHTLCInfoDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = CResult_PendingHTLCInfoDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_ok(int32_t o) {
+       LDKBlindedFailure o_conv = LDKBlindedFailure_from_cs(o);
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_BlindedFailureDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_BlindedFailureDecodeErrorZ* o_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_BlindedFailureDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_BlindedFailureDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_BlindedFailureDecodeErrorZ _res_conv = *(LDKCResult_BlindedFailureDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_BlindedFailureDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_BlindedFailureDecodeErrorZ_clone_ptr(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_BlindedFailureDecodeErrorZ* arg_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_BlindedFailureDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_BlindedFailureDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_BlindedFailureDecodeErrorZ* orig_conv = (LDKCResult_BlindedFailureDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = CResult_BlindedFailureDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_ok(int32_t o) {
        LDKChannelShutdownState o_conv = LDKChannelShutdownState_from_cs(o);
        LDKCResult_ChannelShutdownStateDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ChannelShutdownStateDecodeErrorZ), "LDKCResult_ChannelShutdownStateDecodeErrorZ");
@@ -22714,6 +24303,78 @@ void  CS_LDK_CVec_C2Tuple_PublicKeyTypeZZ_free(int64_tArray _res) {
        CVec_C2Tuple_PublicKeyTypeZZ_free(_res_constr);
 }
 
+static inline uint64_t C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR arg) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(int64_t arg) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* arg_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(int64_t orig) {
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* orig_conv = (LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)untag_ptr(orig);
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_new(int8_tArray a, int64_tArray b) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKCVec_SocketAddressZ b_constr;
+       b_constr.datalen = b->arr_len;
+       if (b_constr.datalen > 0)
+               b_constr.data = MALLOC(b_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               b_constr.data = NULL;
+       int64_t* b_vals = b->elems;
+       for (size_t p = 0; p < b_constr.datalen; p++) {
+               int64_t b_conv_15 = b_vals[p];
+               void* b_conv_15_ptr = untag_ptr(b_conv_15);
+               CHECK_ACCESS(b_conv_15_ptr);
+               LDKSocketAddress b_conv_15_conv = *(LDKSocketAddress*)(b_conv_15_ptr);
+               b_conv_15_conv = SocketAddress_clone((LDKSocketAddress*)untag_ptr(b_conv_15));
+               b_constr.data[p] = b_conv_15_conv;
+       }
+       FREE(b);
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKC2Tuple_PublicKeyCVec_SocketAddressZZ");
+       *ret_conv = C2Tuple_PublicKeyCVec_SocketAddressZZ_new(a_ref, b_constr);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKC2Tuple_PublicKeyCVec_SocketAddressZZ _res_conv = *(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       C2Tuple_PublicKeyCVec_SocketAddressZZ_free(_res_conv);
+}
+
+void  CS_LDK_CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_free(int64_tArray _res) {
+       LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ), "LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t o = 0; o < _res_constr.datalen; o++) {
+               int64_t _res_conv_40 = _res_vals[o];
+               void* _res_conv_40_ptr = untag_ptr(_res_conv_40);
+               CHECK_ACCESS(_res_conv_40_ptr);
+               LDKC2Tuple_PublicKeyCVec_SocketAddressZZ _res_conv_40_conv = *(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ*)(_res_conv_40_ptr);
+               FREE(untag_ptr(_res_conv_40));
+               _res_constr.data[o] = _res_conv_40_conv;
+       }
+       FREE(_res);
+       CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_free(_res_constr);
+}
+
 int64_t  CS_LDK_COption_OnionMessageContentsZ_some(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
@@ -24005,6 +25666,222 @@ int64_t  CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_ok(int64_t o) {
+       LDKStfu o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = Stfu_clone(&o_conv);
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_StfuDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_StfuDecodeErrorZ* o_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_StfuDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_StfuDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_StfuDecodeErrorZ _res_conv = *(LDKCResult_StfuDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_StfuDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_StfuDecodeErrorZ_clone_ptr(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_StfuDecodeErrorZ* arg_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_StfuDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_StfuDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_StfuDecodeErrorZ* orig_conv = (LDKCResult_StfuDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = CResult_StfuDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_ok(int64_t o) {
+       LDKSplice o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = Splice_clone(&o_conv);
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpliceDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpliceDecodeErrorZ* o_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpliceDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpliceDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpliceDecodeErrorZ _res_conv = *(LDKCResult_SpliceDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpliceDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpliceDecodeErrorZ_clone_ptr(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpliceDecodeErrorZ* arg_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpliceDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpliceDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpliceDecodeErrorZ* orig_conv = (LDKCResult_SpliceDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = CResult_SpliceDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_ok(int64_t o) {
+       LDKSpliceAck o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = SpliceAck_clone(&o_conv);
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpliceAckDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpliceAckDecodeErrorZ* o_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpliceAckDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpliceAckDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpliceAckDecodeErrorZ _res_conv = *(LDKCResult_SpliceAckDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpliceAckDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpliceAckDecodeErrorZ_clone_ptr(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpliceAckDecodeErrorZ* arg_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpliceAckDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpliceAckDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpliceAckDecodeErrorZ* orig_conv = (LDKCResult_SpliceAckDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = CResult_SpliceAckDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_ok(int64_t o) {
+       LDKSpliceLocked o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = SpliceLocked_clone(&o_conv);
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_SpliceLockedDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_SpliceLockedDecodeErrorZ* o_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SpliceLockedDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_SpliceLockedDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_SpliceLockedDecodeErrorZ _res_conv = *(LDKCResult_SpliceLockedDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_SpliceLockedDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_SpliceLockedDecodeErrorZ_clone_ptr(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_SpliceLockedDecodeErrorZ* arg_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_SpliceLockedDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_SpliceLockedDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_SpliceLockedDecodeErrorZ* orig_conv = (LDKCResult_SpliceLockedDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = CResult_SpliceLockedDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_TxAddInputDecodeErrorZ_ok(int64_t o) {
        LDKTxAddInput o_conv;
        o_conv.inner = untag_ptr(o);
@@ -25409,6 +27286,60 @@ int64_t  CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_ok(int64_t o) {
+       LDKOnionPacket o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = OnionPacket_clone(&o_conv);
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_OnionPacketDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_OnionPacketDecodeErrorZ* o_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_OnionPacketDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_OnionPacketDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_OnionPacketDecodeErrorZ _res_conv = *(LDKCResult_OnionPacketDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_OnionPacketDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_OnionPacketDecodeErrorZ_clone_ptr(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_OnionPacketDecodeErrorZ* arg_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_OnionPacketDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_OnionPacketDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_OnionPacketDecodeErrorZ* orig_conv = (LDKCResult_OnionPacketDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = CResult_OnionPacketDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_ok(int64_t o) {
        LDKUpdateAddHTLC o_conv;
        o_conv.inner = untag_ptr(o);
@@ -25517,6 +27448,60 @@ int64_t  CS_LDK_CResult_OnionMessageDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_ok(int64_t o) {
+       LDKFinalOnionHopData o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = FinalOnionHopData_clone(&o_conv);
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* o_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_FinalOnionHopDataDecodeErrorZ _res_conv = *(LDKCResult_FinalOnionHopDataDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_FinalOnionHopDataDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* arg_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* orig_conv = (LDKCResult_FinalOnionHopDataDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = CResult_FinalOnionHopDataDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_CResult_PingDecodeErrorZ_ok(int64_t o) {
        LDKPing o_conv;
        o_conv.inner = untag_ptr(o);
@@ -28774,58 +30759,40 @@ int64_t  CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_ok(int64_t o) {
-       LDKReceiveTlvs o_conv;
-       o_conv.inner = untag_ptr(o);
-       o_conv.is_owned = ptr_is_owned(o);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
-       o_conv = ReceiveTlvs_clone(&o_conv);
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_ok(o_conv);
+static inline uint64_t C2Tuple__u832u16Z_clone_ptr(LDKC2Tuple__u832u16Z *NONNULL_PTR arg) {
+       LDKC2Tuple__u832u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u832u16Z), "LDKC2Tuple__u832u16Z");
+       *ret_conv = C2Tuple__u832u16Z_clone(arg);
        return tag_ptr(ret_conv, true);
 }
+int64_t  CS_LDK_C2Tuple__u832u16Z_clone_ptr(int64_t arg) {
+       LDKC2Tuple__u832u16Z* arg_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(arg);
+       int64_t ret_conv = C2Tuple__u832u16Z_clone_ptr(arg_conv);
+       return ret_conv;
+}
 
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
-       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_err(e_conv);
+int64_t  CS_LDK_C2Tuple__u832u16Z_clone(int64_t orig) {
+       LDKC2Tuple__u832u16Z* orig_conv = (LDKC2Tuple__u832u16Z*)untag_ptr(orig);
+       LDKC2Tuple__u832u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u832u16Z), "LDKC2Tuple__u832u16Z");
+       *ret_conv = C2Tuple__u832u16Z_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_is_ok(int64_t o) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* o_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_ReceiveTlvsDecodeErrorZ_is_ok(o_conv);
-       return ret_conv;
+int64_t  CS_LDK_C2Tuple__u832u16Z_new(int8_tArray a, int16_t b) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKC2Tuple__u832u16Z* ret_conv = MALLOC(sizeof(LDKC2Tuple__u832u16Z), "LDKC2Tuple__u832u16Z");
+       *ret_conv = C2Tuple__u832u16Z_new(a_ref, b);
+       return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_free(int64_t _res) {
+void  CS_LDK_C2Tuple__u832u16Z_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_ReceiveTlvsDecodeErrorZ _res_conv = *(LDKCResult_ReceiveTlvsDecodeErrorZ*)(_res_ptr);
+       LDKC2Tuple__u832u16Z _res_conv = *(LDKC2Tuple__u832u16Z*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_ReceiveTlvsDecodeErrorZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR arg) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* arg_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_clone(int64_t orig) {
-       LDKCResult_ReceiveTlvsDecodeErrorZ* orig_conv = (LDKCResult_ReceiveTlvsDecodeErrorZ*)untag_ptr(orig);
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = CResult_ReceiveTlvsDecodeErrorZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
+       C2Tuple__u832u16Z_free(_res_conv);
 }
 
 int64_t  CS_LDK_CResult_PaymentRelayDecodeErrorZ_ok(int64_t o) {
@@ -28936,169 +30903,98 @@ int64_t  CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_ok(int8_tArray o) {
-       LDKThirtyTwoBytes o_ref;
-       CHECK(o->arr_len == 32);
-       memcpy(o_ref.data, o->elems, 32); FREE(o);
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_ok(o_ref);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKPaymentError e_conv = *(LDKPaymentError*)(e_ptr);
-       e_conv = PaymentError_clone((LDKPaymentError*)untag_ptr(e));
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_err(e_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(int64_t o) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* o_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ _res_conv = *(LDKCResult_ThirtyTwoBytesPaymentErrorZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_ThirtyTwoBytesPaymentErrorZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR arg) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_clone(arg);
+static inline uint64_t C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR arg) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* arg_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* arg_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_clone(int64_t orig) {
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* orig_conv = (LDKCResult_ThirtyTwoBytesPaymentErrorZ*)untag_ptr(orig);
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = CResult_ThirtyTwoBytesPaymentErrorZ_clone(orig_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(int64_t orig) {
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* orig_conv = (LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(orig);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_ok() {
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_ok();
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKPaymentError e_conv = *(LDKPaymentError*)(e_ptr);
-       e_conv = PaymentError_clone((LDKPaymentError*)untag_ptr(e));
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_err(e_conv);
+int64_t  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new(int8_tArray a, int64_t b, int64_t c) {
+       LDKThirtyTwoBytes a_ref;
+       CHECK(a->arr_len == 32);
+       memcpy(a_ref.data, a->elems, 32); FREE(a);
+       LDKRecipientOnionFields b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv = RecipientOnionFields_clone(&b_conv);
+       LDKRouteParameters c_conv;
+       c_conv.inner = untag_ptr(c);
+       c_conv.is_owned = ptr_is_owned(c);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(c_conv);
+       c_conv = RouteParameters_clone(&c_conv);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ), "LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ");
+       *ret_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new(a_ref, b_conv, c_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_NonePaymentErrorZ_is_ok(int64_t o) {
-       LDKCResult_NonePaymentErrorZ* o_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_NonePaymentErrorZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_NonePaymentErrorZ_free(int64_t _res) {
+void  CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_NonePaymentErrorZ _res_conv = *(LDKCResult_NonePaymentErrorZ*)(_res_ptr);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ _res_conv = *(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_NonePaymentErrorZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_NonePaymentErrorZ_clone_ptr(LDKCResult_NonePaymentErrorZ *NONNULL_PTR arg) {
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_NonePaymentErrorZ* arg_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_NonePaymentErrorZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_NonePaymentErrorZ_clone(int64_t orig) {
-       LDKCResult_NonePaymentErrorZ* orig_conv = (LDKCResult_NonePaymentErrorZ*)untag_ptr(orig);
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = CResult_NonePaymentErrorZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
+       C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok(int64_tArray o) {
-       LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ o_constr;
-       o_constr.datalen = o->arr_len;
-       if (o_constr.datalen > 0)
-               o_constr.data = MALLOC(o_constr.datalen * sizeof(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ), "LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ Elements");
-       else
-               o_constr.data = NULL;
-       int64_t* o_vals = o->elems;
-       for (size_t o = 0; o < o_constr.datalen; o++) {
-               int64_t o_conv_40 = o_vals[o];
-               void* o_conv_40_ptr = untag_ptr(o_conv_40);
-               CHECK_ACCESS(o_conv_40_ptr);
-               LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ o_conv_40_conv = *(LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)(o_conv_40_ptr);
-               o_conv_40_conv = C2Tuple_ThirtyTwoBytesThirtyTwoBytesZ_clone((LDKC2Tuple_ThirtyTwoBytesThirtyTwoBytesZ*)untag_ptr(o_conv_40));
-               o_constr.data[o] = o_conv_40_conv;
-       }
-       FREE(o);
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok(o_constr);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ o_conv = *(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)(o_ptr);
+       o_conv = C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone((LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ*)untag_ptr(o));
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err(int64_t e) {
-       void* e_ptr = untag_ptr(e);
-       CHECK_ACCESS(e_ptr);
-       LDKProbingError e_conv = *(LDKProbingError*)(e_ptr);
-       e_conv = ProbingError_clone((LDKProbingError*)untag_ptr(e));
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err(e_conv);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err() {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err();
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(int64_t o) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* o_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(int64_t o) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* o_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free(int64_t _res) {
+void  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ _res_conv = *(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)(_res_ptr);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ _res_conv = *(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free(_res_conv);
+       CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free(_res_conv);
 }
 
-static inline uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR arg) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(arg);
+static inline uint64_t CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR arg) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(int64_t arg) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* arg_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(int64_t arg) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* arg_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(int64_t orig) {
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* orig_conv = (LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ*)untag_ptr(orig);
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(orig_conv);
+int64_t  CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(int64_t orig) {
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* orig_conv = (LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ*)untag_ptr(orig);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -29199,75 +31095,25 @@ int64_t  CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_ok(int64_t o) {
-       LDKOnionMessagePath o_conv;
-       o_conv.inner = untag_ptr(o);
-       o_conv.is_owned = ptr_is_owned(o);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
-       o_conv = OnionMessagePath_clone(&o_conv);
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_ok(o_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_err() {
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_err();
-       return tag_ptr(ret_conv, true);
-}
-
-jboolean  CS_LDK_CResult_OnionMessagePathNoneZ_is_ok(int64_t o) {
-       LDKCResult_OnionMessagePathNoneZ* o_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_OnionMessagePathNoneZ_is_ok(o_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_CResult_OnionMessagePathNoneZ_free(int64_t _res) {
-       if (!ptr_is_owned(_res)) return;
-       void* _res_ptr = untag_ptr(_res);
-       CHECK_ACCESS(_res_ptr);
-       LDKCResult_OnionMessagePathNoneZ _res_conv = *(LDKCResult_OnionMessagePathNoneZ*)(_res_ptr);
-       FREE(untag_ptr(_res));
-       CResult_OnionMessagePathNoneZ_free(_res_conv);
-}
-
-static inline uint64_t CResult_OnionMessagePathNoneZ_clone_ptr(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR arg) {
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_clone(arg);
-       return tag_ptr(ret_conv, true);
-}
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone_ptr(int64_t arg) {
-       LDKCResult_OnionMessagePathNoneZ* arg_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(arg);
-       int64_t ret_conv = CResult_OnionMessagePathNoneZ_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_CResult_OnionMessagePathNoneZ_clone(int64_t orig) {
-       LDKCResult_OnionMessagePathNoneZ* orig_conv = (LDKCResult_OnionMessagePathNoneZ*)untag_ptr(orig);
-       LDKCResult_OnionMessagePathNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionMessagePathNoneZ), "LDKCResult_OnionMessagePathNoneZ");
-       *ret_conv = CResult_OnionMessagePathNoneZ_clone(orig_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-static inline uint64_t C2Tuple_PublicKeyOnionMessageZ_clone_ptr(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR arg) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_clone(arg);
+static inline uint64_t C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR arg) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(arg);
        return tag_ptr(ret_conv, true);
 }
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_clone_ptr(int64_t arg) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* arg_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(arg);
-       int64_t ret_conv = C2Tuple_PublicKeyOnionMessageZ_clone_ptr(arg_conv);
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(int64_t arg) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* arg_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(arg);
+       int64_t ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(arg_conv);
        return ret_conv;
 }
 
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_clone(int64_t orig) {
-       LDKC2Tuple_PublicKeyOnionMessageZ* orig_conv = (LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(orig);
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_clone(orig_conv);
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(int64_t orig) {
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* orig_conv = (LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(orig);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(orig_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_new(int8_tArray a, int64_t b) {
+int64_t  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new(int8_tArray a, int64_t b, int64_t c) {
        LDKPublicKey a_ref;
        CHECK(a->arr_len == 33);
        memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
@@ -29276,53 +31122,57 @@ int64_t  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_new(int8_tArray a, int64_t b) {
        b_conv.is_owned = ptr_is_owned(b);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
        b_conv = OnionMessage_clone(&b_conv);
-       LDKC2Tuple_PublicKeyOnionMessageZ* ret_conv = MALLOC(sizeof(LDKC2Tuple_PublicKeyOnionMessageZ), "LDKC2Tuple_PublicKeyOnionMessageZ");
-       *ret_conv = C2Tuple_PublicKeyOnionMessageZ_new(a_ref, b_conv);
+       void* c_ptr = untag_ptr(c);
+       CHECK_ACCESS(c_ptr);
+       LDKCOption_CVec_SocketAddressZZ c_conv = *(LDKCOption_CVec_SocketAddressZZ*)(c_ptr);
+       c_conv = COption_CVec_SocketAddressZZ_clone((LDKCOption_CVec_SocketAddressZZ*)untag_ptr(c));
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ* ret_conv = MALLOC(sizeof(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ), "LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ");
+       *ret_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new(a_ref, b_conv, c_conv);
        return tag_ptr(ret_conv, true);
 }
 
-void  CS_LDK_C2Tuple_PublicKeyOnionMessageZ_free(int64_t _res) {
+void  CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKC2Tuple_PublicKeyOnionMessageZ _res_conv = *(LDKC2Tuple_PublicKeyOnionMessageZ*)(_res_ptr);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ _res_conv = *(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       C2Tuple_PublicKeyOnionMessageZ_free(_res_conv);
+       C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok(int64_t o) {
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
-       LDKC2Tuple_PublicKeyOnionMessageZ o_conv = *(LDKC2Tuple_PublicKeyOnionMessageZ*)(o_ptr);
-       o_conv = C2Tuple_PublicKeyOnionMessageZ_clone((LDKC2Tuple_PublicKeyOnionMessageZ*)untag_ptr(o));
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
-       *ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok(o_conv);
+       LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ o_conv = *(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)(o_ptr);
+       o_conv = C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone((LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ*)untag_ptr(o));
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ), "LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ");
+       *ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err(int64_t e) {
+int64_t  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err(int64_t e) {
        void* e_ptr = untag_ptr(e);
        CHECK_ACCESS(e_ptr);
        LDKSendError e_conv = *(LDKSendError*)(e_ptr);
        e_conv = SendError_clone((LDKSendError*)untag_ptr(e));
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
-       *ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err(e_conv);
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ), "LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ");
+       *ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err(e_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(int64_t o) {
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* o_conv = (LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(int64_t o) {
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* o_conv = (LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(int64_t _res) {
+void  CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ _res_conv = *(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ*)(_res_ptr);
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ _res_conv = *(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(_res_conv);
+       CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free(_res_conv);
 }
 
 int64_t  CS_LDK_CResult_PeeledOnionNoneZ_ok(int64_t o) {
@@ -29356,35 +31206,39 @@ void  CS_LDK_CResult_PeeledOnionNoneZ_free(int64_t _res) {
        CResult_PeeledOnionNoneZ_free(_res_conv);
 }
 
-int64_t  CS_LDK_CResult_NoneSendErrorZ_ok() {
-       LDKCResult_NoneSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneSendErrorZ), "LDKCResult_NoneSendErrorZ");
-       *ret_conv = CResult_NoneSendErrorZ_ok();
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_ok(int64_t o) {
+       void* o_ptr = untag_ptr(o);
+       CHECK_ACCESS(o_ptr);
+       LDKSendSuccess o_conv = *(LDKSendSuccess*)(o_ptr);
+       o_conv = SendSuccess_clone((LDKSendSuccess*)untag_ptr(o));
+       LDKCResult_SendSuccessSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SendSuccessSendErrorZ), "LDKCResult_SendSuccessSendErrorZ");
+       *ret_conv = CResult_SendSuccessSendErrorZ_ok(o_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_CResult_NoneSendErrorZ_err(int64_t e) {
+int64_t  CS_LDK_CResult_SendSuccessSendErrorZ_err(int64_t e) {
        void* e_ptr = untag_ptr(e);
        CHECK_ACCESS(e_ptr);
        LDKSendError e_conv = *(LDKSendError*)(e_ptr);
        e_conv = SendError_clone((LDKSendError*)untag_ptr(e));
-       LDKCResult_NoneSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneSendErrorZ), "LDKCResult_NoneSendErrorZ");
-       *ret_conv = CResult_NoneSendErrorZ_err(e_conv);
+       LDKCResult_SendSuccessSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SendSuccessSendErrorZ), "LDKCResult_SendSuccessSendErrorZ");
+       *ret_conv = CResult_SendSuccessSendErrorZ_err(e_conv);
        return tag_ptr(ret_conv, true);
 }
 
-jboolean  CS_LDK_CResult_NoneSendErrorZ_is_ok(int64_t o) {
-       LDKCResult_NoneSendErrorZ* o_conv = (LDKCResult_NoneSendErrorZ*)untag_ptr(o);
-       jboolean ret_conv = CResult_NoneSendErrorZ_is_ok(o_conv);
+jboolean  CS_LDK_CResult_SendSuccessSendErrorZ_is_ok(int64_t o) {
+       LDKCResult_SendSuccessSendErrorZ* o_conv = (LDKCResult_SendSuccessSendErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_SendSuccessSendErrorZ_is_ok(o_conv);
        return ret_conv;
 }
 
-void  CS_LDK_CResult_NoneSendErrorZ_free(int64_t _res) {
+void  CS_LDK_CResult_SendSuccessSendErrorZ_free(int64_t _res) {
        if (!ptr_is_owned(_res)) return;
        void* _res_ptr = untag_ptr(_res);
        CHECK_ACCESS(_res_ptr);
-       LDKCResult_NoneSendErrorZ _res_conv = *(LDKCResult_NoneSendErrorZ*)(_res_ptr);
+       LDKCResult_SendSuccessSendErrorZ _res_conv = *(LDKCResult_SendSuccessSendErrorZ*)(_res_ptr);
        FREE(untag_ptr(_res));
-       CResult_NoneSendErrorZ_free(_res_conv);
+       CResult_SendSuccessSendErrorZ_free(_res_conv);
 }
 
 int64_t  CS_LDK_CResult_BlindedPathNoneZ_ok(int64_t o) {
@@ -29486,6 +31340,26 @@ int64_t  CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(int64_t or
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_CVec_ForwardNodeZ_free(int64_tArray _res) {
+       LDKCVec_ForwardNodeZ _res_constr;
+       _res_constr.datalen = _res->arr_len;
+       if (_res_constr.datalen > 0)
+               _res_constr.data = MALLOC(_res_constr.datalen * sizeof(LDKForwardNode), "LDKCVec_ForwardNodeZ Elements");
+       else
+               _res_constr.data = NULL;
+       int64_t* _res_vals = _res->elems;
+       for (size_t n = 0; n < _res_constr.datalen; n++) {
+               int64_t _res_conv_13 = _res_vals[n];
+               LDKForwardNode _res_conv_13_conv;
+               _res_conv_13_conv.inner = untag_ptr(_res_conv_13);
+               _res_conv_13_conv.is_owned = ptr_is_owned(_res_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(_res_conv_13_conv);
+               _res_constr.data[n] = _res_conv_13_conv;
+       }
+       FREE(_res);
+       CVec_ForwardNodeZ_free(_res_constr);
+}
+
 int64_t  CS_LDK_CResult_BlindedPathDecodeErrorZ_ok(int64_t o) {
        LDKBlindedPath o_conv;
        o_conv.inner = untag_ptr(o);
@@ -29648,6 +31522,330 @@ int64_t  CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone(int64_t orig) {
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_ok(int64_t o) {
+       LDKDelayedPaymentBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = DelayedPaymentBasepoint_clone(&o_conv);
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* o_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ _res_conv = *(LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DelayedPaymentBasepointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* arg_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* orig_conv = (LDKCResult_DelayedPaymentBasepointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentBasepointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_ok(int64_t o) {
+       LDKDelayedPaymentKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = DelayedPaymentKey_clone(&o_conv);
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* o_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ _res_conv = *(LDKCResult_DelayedPaymentKeyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_DelayedPaymentKeyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* arg_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* orig_conv = (LDKCResult_DelayedPaymentKeyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = CResult_DelayedPaymentKeyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_ok(int64_t o) {
+       LDKHtlcBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = HtlcBasepoint_clone(&o_conv);
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* o_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HtlcBasepointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HtlcBasepointDecodeErrorZ _res_conv = *(LDKCResult_HtlcBasepointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HtlcBasepointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HtlcBasepointDecodeErrorZ_clone_ptr(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* arg_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HtlcBasepointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HtlcBasepointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HtlcBasepointDecodeErrorZ* orig_conv = (LDKCResult_HtlcBasepointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = CResult_HtlcBasepointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_ok(int64_t o) {
+       LDKHtlcKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = HtlcKey_clone(&o_conv);
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_HtlcKeyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_HtlcKeyDecodeErrorZ* o_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_HtlcKeyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_HtlcKeyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_HtlcKeyDecodeErrorZ _res_conv = *(LDKCResult_HtlcKeyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_HtlcKeyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_HtlcKeyDecodeErrorZ_clone_ptr(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_HtlcKeyDecodeErrorZ* arg_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_HtlcKeyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_HtlcKeyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_HtlcKeyDecodeErrorZ* orig_conv = (LDKCResult_HtlcKeyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = CResult_HtlcKeyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_ok(int64_t o) {
+       LDKRevocationBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = RevocationBasepoint_clone(&o_conv);
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* o_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RevocationBasepointDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RevocationBasepointDecodeErrorZ _res_conv = *(LDKCResult_RevocationBasepointDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RevocationBasepointDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RevocationBasepointDecodeErrorZ_clone_ptr(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* arg_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RevocationBasepointDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RevocationBasepointDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RevocationBasepointDecodeErrorZ* orig_conv = (LDKCResult_RevocationBasepointDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = CResult_RevocationBasepointDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_ok(int64_t o) {
+       LDKRevocationKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv = RevocationKey_clone(&o_conv);
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_ok(o_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_err(int64_t e) {
+       void* e_ptr = untag_ptr(e);
+       CHECK_ACCESS(e_ptr);
+       LDKDecodeError e_conv = *(LDKDecodeError*)(e_ptr);
+       e_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(e));
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_err(e_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+jboolean  CS_LDK_CResult_RevocationKeyDecodeErrorZ_is_ok(int64_t o) {
+       LDKCResult_RevocationKeyDecodeErrorZ* o_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(o);
+       jboolean ret_conv = CResult_RevocationKeyDecodeErrorZ_is_ok(o_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_CResult_RevocationKeyDecodeErrorZ_free(int64_t _res) {
+       if (!ptr_is_owned(_res)) return;
+       void* _res_ptr = untag_ptr(_res);
+       CHECK_ACCESS(_res_ptr);
+       LDKCResult_RevocationKeyDecodeErrorZ _res_conv = *(LDKCResult_RevocationKeyDecodeErrorZ*)(_res_ptr);
+       FREE(untag_ptr(_res));
+       CResult_RevocationKeyDecodeErrorZ_free(_res_conv);
+}
+
+static inline uint64_t CResult_RevocationKeyDecodeErrorZ_clone_ptr(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR arg) {
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_clone(arg);
+       return tag_ptr(ret_conv, true);
+}
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_clone_ptr(int64_t arg) {
+       LDKCResult_RevocationKeyDecodeErrorZ* arg_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(arg);
+       int64_t ret_conv = CResult_RevocationKeyDecodeErrorZ_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CResult_RevocationKeyDecodeErrorZ_clone(int64_t orig) {
+       LDKCResult_RevocationKeyDecodeErrorZ* orig_conv = (LDKCResult_RevocationKeyDecodeErrorZ*)untag_ptr(orig);
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = CResult_RevocationKeyDecodeErrorZ_clone(orig_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int64_t  CS_LDK_COption_FilterZ_some(int64_t o) {
        void* o_ptr = untag_ptr(o);
        CHECK_ACCESS(o_ptr);
@@ -30083,6 +32281,16 @@ int64_t  CS_LDK_Hostname_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Hostname_hash(int64_t o) {
+       LDKHostname o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Hostname_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Hostname_eq(int64_t a, int64_t b) {
        LDKHostname a_conv;
        a_conv.inner = untag_ptr(a);
@@ -30169,6 +32377,16 @@ int64_t  CS_LDK_TransactionU16LenLimited_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TransactionU16LenLimited_hash(int64_t o) {
+       LDKTransactionU16LenLimited o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TransactionU16LenLimited_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TransactionU16LenLimited_eq(int64_t a, int64_t b) {
        LDKTransactionU16LenLimited a_conv;
        a_conv.inner = untag_ptr(a);
@@ -30524,6 +32742,16 @@ jboolean  CS_LDK_UntrustedString_eq(int64_t a, int64_t b) {
        return ret_conv;
 }
 
+int64_t  CS_LDK_UntrustedString_hash(int64_t o) {
+       LDKUntrustedString o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UntrustedString_hash(&o_conv);
+       return ret_conv;
+}
+
 int8_tArray  CS_LDK_UntrustedString_write(int64_t obj) {
        LDKUntrustedString obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -30833,6 +33061,54 @@ void  CS_LDK_Record_set_level(int64_t this_ptr, int32_t val) {
        Record_set_level(&this_ptr_conv, val_conv);
 }
 
+int8_tArray  CS_LDK_Record_get_peer_id(int64_t this_ptr) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Record_get_peer_id(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_Record_set_peer_id(int64_t this_ptr, int8_tArray val) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       Record_set_peer_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Record_get_channel_id(int64_t this_ptr) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = Record_get_channel_id(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_Record_set_channel_id(int64_t this_ptr, int64_t val) {
+       LDKRecord this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_ThirtyTwoBytesZ val_conv = *(LDKCOption_ThirtyTwoBytesZ*)(val_ptr);
+       val_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(val));
+       Record_set_channel_id(&this_ptr_conv, val_conv);
+}
+
 jstring  CS_LDK_Record_get_args(int64_t this_ptr) {
        LDKRecord this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
@@ -30918,6 +33194,25 @@ void  CS_LDK_Record_set_line(int64_t this_ptr, int32_t val) {
        Record_set_line(&this_ptr_conv, val);
 }
 
+int64_t  CS_LDK_Record_new(int32_t level_arg, int8_tArray peer_id_arg, int64_t channel_id_arg, jstring args_arg, jstring module_path_arg, jstring file_arg, int32_t line_arg) {
+       LDKLevel level_arg_conv = LDKLevel_from_cs(level_arg);
+       LDKPublicKey peer_id_arg_ref;
+       CHECK(peer_id_arg->arr_len == 33);
+       memcpy(peer_id_arg_ref.compressed_form, peer_id_arg->elems, 33); FREE(peer_id_arg);
+       void* channel_id_arg_ptr = untag_ptr(channel_id_arg);
+       CHECK_ACCESS(channel_id_arg_ptr);
+       LDKCOption_ThirtyTwoBytesZ channel_id_arg_conv = *(LDKCOption_ThirtyTwoBytesZ*)(channel_id_arg_ptr);
+       channel_id_arg_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(channel_id_arg));
+       LDKStr args_arg_conv = str_ref_to_owned_c(args_arg);
+       LDKStr module_path_arg_conv = str_ref_to_owned_c(module_path_arg);
+       LDKStr file_arg_conv = str_ref_to_owned_c(file_arg);
+       LDKRecord ret_var = Record_new(level_arg_conv, peer_id_arg_ref, channel_id_arg_conv, args_arg_conv, module_path_arg_conv, file_arg_conv, line_arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 static inline uint64_t Record_clone_ptr(LDKRecord *NONNULL_PTR arg) {
        LDKRecord ret_var = Record_clone(arg);
        int64_t ret_ref = 0;
@@ -32382,9 +34677,10 @@ int8_tArray  CS_LDK_WatchedOutput_get_script_pubkey(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = WatchedOutput_get_script_pubkey(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = WatchedOutput_get_script_pubkey(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -32497,11 +34793,6 @@ int32_t  CS_LDK_ConfirmationTarget_on_chain_sweep() {
        return ret_conv;
 }
 
-int32_t  CS_LDK_ConfirmationTarget_max_allowed_non_anchor_channel_remote_fee() {
-       int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_max_allowed_non_anchor_channel_remote_fee());
-       return ret_conv;
-}
-
 int32_t  CS_LDK_ConfirmationTarget_min_allowed_anchor_channel_remote_fee() {
        int32_t ret_conv = LDKConfirmationTarget_to_cs(ConfirmationTarget_min_allowed_anchor_channel_remote_fee());
        return ret_conv;
@@ -33342,7 +35633,7 @@ int64_tArray  CS_LDK_ChannelMonitor_get_outputs_to_watch(int64_t this_arg) {
        return ret_arr;
 }
 
-void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filter) {
+void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filter, int64_t logger) {
        LDKChannelMonitor this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
@@ -33351,7 +35642,10 @@ void  CS_LDK_ChannelMonitor_load_outputs_to_watch(int64_t this_arg, int64_t filt
        void* filter_ptr = untag_ptr(filter);
        if (ptr_is_owned(filter)) { CHECK_ACCESS(filter_ptr); }
        LDKFilter* filter_conv = (LDKFilter*)filter_ptr;
-       ChannelMonitor_load_outputs_to_watch(&this_arg_conv, filter_conv);
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       ChannelMonitor_load_outputs_to_watch(&this_arg_conv, filter_conv, logger_conv);
 }
 
 int64_tArray  CS_LDK_ChannelMonitor_get_and_clear_pending_monitor_events(int64_t this_arg) {
@@ -33520,12 +35814,8 @@ int64_tArray  CS_LDK_ChannelMonitor_block_connected(int64_t this_arg, int8_tArra
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret_var = ChannelMonitor_block_connected(&this_arg_conv, header_ref, txdata_constr, height, broadcaster_conv, fee_estimator_conv, logger_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
@@ -33565,12 +35855,8 @@ void  CS_LDK_ChannelMonitor_block_disconnected(int64_t this_arg, int8_tArray hea
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        ChannelMonitor_block_disconnected(&this_arg_conv, header_ref, height, broadcaster_conv, fee_estimator_conv, logger_conv);
 }
 
@@ -33615,12 +35901,8 @@ int64_tArray  CS_LDK_ChannelMonitor_transactions_confirmed(int64_t this_arg, int
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret_var = ChannelMonitor_transactions_confirmed(&this_arg_conv, header_ref, txdata_constr, height, broadcaster_conv, fee_estimator_conv, logger_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
@@ -33660,12 +35942,8 @@ void  CS_LDK_ChannelMonitor_transaction_unconfirmed(int64_t this_arg, int8_tArra
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        ChannelMonitor_transaction_unconfirmed(&this_arg_conv, txid_ref, broadcaster_conv, fee_estimator_conv, logger_conv);
 }
 
@@ -33694,12 +35972,8 @@ int64_tArray  CS_LDK_ChannelMonitor_best_block_updated(int64_t this_arg, int8_tA
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ret_var = ChannelMonitor_best_block_updated(&this_arg_conv, header_ref, height, broadcaster_conv, fee_estimator_conv, logger_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
@@ -33720,14 +35994,14 @@ int64_tArray  CS_LDK_ChannelMonitor_get_relevant_txids(int64_t this_arg) {
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
        this_arg_conv.is_owned = false;
-       LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ret_var = ChannelMonitor_get_relevant_txids(&this_arg_conv);
+       LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ret_var = ChannelMonitor_get_relevant_txids(&this_arg_conv);
        int64_tArray ret_arr = NULL;
        ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
        int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
-       for (size_t x = 0; x < ret_var.datalen; x++) {
-               LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ* ret_conv_49_conv = MALLOC(sizeof(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ), "LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ");
-               *ret_conv_49_conv = ret_var.data[x];
-               ret_arr_ptr[x] = tag_ptr(ret_conv_49_conv, true);
+       for (size_t c = 0; c < ret_var.datalen; c++) {
+               LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ* ret_conv_54_conv = MALLOC(sizeof(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ), "LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ");
+               *ret_conv_54_conv = ret_var.data[c];
+               ret_arr_ptr[c] = tag_ptr(ret_conv_54_conv, true);
        }
        
        FREE(ret_var.data);
@@ -33768,12 +36042,8 @@ void  CS_LDK_ChannelMonitor_rebroadcast_pending_claims(int64_t this_arg, int64_t
                LDKFeeEstimator_JCalls_cloned(&fee_estimator_conv);
        }
        void* logger_ptr = untag_ptr(logger);
-       CHECK_ACCESS(logger_ptr);
-       LDKLogger logger_conv = *(LDKLogger*)(logger_ptr);
-       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_cloned(&logger_conv);
-       }
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
        ChannelMonitor_rebroadcast_pending_claims(&this_arg_conv, broadcaster_conv, fee_estimator_conv, logger_conv);
 }
 
@@ -33990,6 +36260,597 @@ int64_t  CS_LDK_OutPoint_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_InboundHTLCErr_free(int64_t this_obj) {
+       LDKInboundHTLCErr this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       InboundHTLCErr_free(this_obj_conv);
+}
+
+int16_t  CS_LDK_InboundHTLCErr_get_err_code(int64_t this_ptr) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int16_t ret_conv = InboundHTLCErr_get_err_code(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_InboundHTLCErr_set_err_code(int64_t this_ptr, int16_t val) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       InboundHTLCErr_set_err_code(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_InboundHTLCErr_get_err_data(int64_t this_ptr) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = InboundHTLCErr_get_err_data(&this_ptr_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+void  CS_LDK_InboundHTLCErr_set_err_data(int64_t this_ptr, int8_tArray val) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u8Z val_ref;
+       val_ref.datalen = val->arr_len;
+       val_ref.data = MALLOC(val_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(val_ref.data, val->elems, val_ref.datalen); FREE(val);
+       InboundHTLCErr_set_err_data(&this_ptr_conv, val_ref);
+}
+
+jstring  CS_LDK_InboundHTLCErr_get_msg(int64_t this_ptr) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKStr ret_str = InboundHTLCErr_get_msg(&this_ptr_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+void  CS_LDK_InboundHTLCErr_set_msg(int64_t this_ptr, jstring val) {
+       LDKInboundHTLCErr this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKStr val_conv = str_ref_to_owned_c(val);
+       InboundHTLCErr_set_msg(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_InboundHTLCErr_new(int16_t err_code_arg, int8_tArray err_data_arg, jstring msg_arg) {
+       LDKCVec_u8Z err_data_arg_ref;
+       err_data_arg_ref.datalen = err_data_arg->arr_len;
+       err_data_arg_ref.data = MALLOC(err_data_arg_ref.datalen, "LDKCVec_u8Z Bytes");
+       memcpy(err_data_arg_ref.data, err_data_arg->elems, err_data_arg_ref.datalen); FREE(err_data_arg);
+       LDKStr msg_arg_conv = str_ref_to_owned_c(msg_arg);
+       LDKInboundHTLCErr ret_var = InboundHTLCErr_new(err_code_arg, err_data_arg_ref, msg_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_peel_payment_onion(int64_t msg, int64_t node_signer, int64_t logger, int32_t cur_height, jboolean accept_mpp_keysend, jboolean allow_skimmed_fees) {
+       LDKUpdateAddHTLC msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv.is_owned = false;
+       void* node_signer_ptr = untag_ptr(node_signer);
+       if (ptr_is_owned(node_signer)) { CHECK_ACCESS(node_signer_ptr); }
+       LDKNodeSigner* node_signer_conv = (LDKNodeSigner*)node_signer_ptr;
+       void* logger_ptr = untag_ptr(logger);
+       if (ptr_is_owned(logger)) { CHECK_ACCESS(logger_ptr); }
+       LDKLogger* logger_conv = (LDKLogger*)logger_ptr;
+       LDKCResult_PendingHTLCInfoInboundHTLCErrZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoInboundHTLCErrZ), "LDKCResult_PendingHTLCInfoInboundHTLCErrZ");
+       *ret_conv = peel_payment_onion(&msg_conv, node_signer_conv, logger_conv, cur_height, accept_mpp_keysend, allow_skimmed_fees);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_PendingHTLCRouting_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKPendingHTLCRouting this_ptr_conv = *(LDKPendingHTLCRouting*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       PendingHTLCRouting_free(this_ptr_conv);
+}
+
+static inline uint64_t PendingHTLCRouting_clone_ptr(LDKPendingHTLCRouting *NONNULL_PTR arg) {
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_PendingHTLCRouting_clone_ptr(int64_t arg) {
+       LDKPendingHTLCRouting* arg_conv = (LDKPendingHTLCRouting*)untag_ptr(arg);
+       int64_t ret_conv = PendingHTLCRouting_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_clone(int64_t orig) {
+       LDKPendingHTLCRouting* orig_conv = (LDKPendingHTLCRouting*)untag_ptr(orig);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_forward(int64_t onion_packet, int64_t short_channel_id, int64_t blinded) {
+       LDKOnionPacket onion_packet_conv;
+       onion_packet_conv.inner = untag_ptr(onion_packet);
+       onion_packet_conv.is_owned = ptr_is_owned(onion_packet);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_packet_conv);
+       onion_packet_conv = OnionPacket_clone(&onion_packet_conv);
+       LDKBlindedForward blinded_conv;
+       blinded_conv.inner = untag_ptr(blinded);
+       blinded_conv.is_owned = ptr_is_owned(blinded);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(blinded_conv);
+       blinded_conv = BlindedForward_clone(&blinded_conv);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_forward(onion_packet_conv, short_channel_id, blinded_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_receive(int64_t payment_data, int64_t payment_metadata, int32_t incoming_cltv_expiry, int8_tArray phantom_shared_secret, int64_tArray custom_tlvs, jboolean requires_blinded_error) {
+       LDKFinalOnionHopData payment_data_conv;
+       payment_data_conv.inner = untag_ptr(payment_data);
+       payment_data_conv.is_owned = ptr_is_owned(payment_data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_conv);
+       payment_data_conv = FinalOnionHopData_clone(&payment_data_conv);
+       void* payment_metadata_ptr = untag_ptr(payment_metadata);
+       CHECK_ACCESS(payment_metadata_ptr);
+       LDKCOption_CVec_u8ZZ payment_metadata_conv = *(LDKCOption_CVec_u8ZZ*)(payment_metadata_ptr);
+       payment_metadata_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(payment_metadata));
+       LDKThirtyTwoBytes phantom_shared_secret_ref;
+       CHECK(phantom_shared_secret->arr_len == 32);
+       memcpy(phantom_shared_secret_ref.data, phantom_shared_secret->elems, 32); FREE(phantom_shared_secret);
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_constr;
+       custom_tlvs_constr.datalen = custom_tlvs->arr_len;
+       if (custom_tlvs_constr.datalen > 0)
+               custom_tlvs_constr.data = MALLOC(custom_tlvs_constr.datalen * sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKCVec_C2Tuple_u64CVec_u8ZZZ Elements");
+       else
+               custom_tlvs_constr.data = NULL;
+       int64_t* custom_tlvs_vals = custom_tlvs->elems;
+       for (size_t x = 0; x < custom_tlvs_constr.datalen; x++) {
+               int64_t custom_tlvs_conv_23 = custom_tlvs_vals[x];
+               void* custom_tlvs_conv_23_ptr = untag_ptr(custom_tlvs_conv_23);
+               CHECK_ACCESS(custom_tlvs_conv_23_ptr);
+               LDKC2Tuple_u64CVec_u8ZZ custom_tlvs_conv_23_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(custom_tlvs_conv_23_ptr);
+               custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone((LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(custom_tlvs_conv_23));
+               custom_tlvs_constr.data[x] = custom_tlvs_conv_23_conv;
+       }
+       FREE(custom_tlvs);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_receive(payment_data_conv, payment_metadata_conv, incoming_cltv_expiry, phantom_shared_secret_ref, custom_tlvs_constr, requires_blinded_error);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_receive_keysend(int64_t payment_data, int8_tArray payment_preimage, int64_t payment_metadata, int32_t incoming_cltv_expiry, int64_tArray custom_tlvs) {
+       LDKFinalOnionHopData payment_data_conv;
+       payment_data_conv.inner = untag_ptr(payment_data);
+       payment_data_conv.is_owned = ptr_is_owned(payment_data);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payment_data_conv);
+       payment_data_conv = FinalOnionHopData_clone(&payment_data_conv);
+       LDKThirtyTwoBytes payment_preimage_ref;
+       CHECK(payment_preimage->arr_len == 32);
+       memcpy(payment_preimage_ref.data, payment_preimage->elems, 32); FREE(payment_preimage);
+       void* payment_metadata_ptr = untag_ptr(payment_metadata);
+       CHECK_ACCESS(payment_metadata_ptr);
+       LDKCOption_CVec_u8ZZ payment_metadata_conv = *(LDKCOption_CVec_u8ZZ*)(payment_metadata_ptr);
+       payment_metadata_conv = COption_CVec_u8ZZ_clone((LDKCOption_CVec_u8ZZ*)untag_ptr(payment_metadata));
+       LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs_constr;
+       custom_tlvs_constr.datalen = custom_tlvs->arr_len;
+       if (custom_tlvs_constr.datalen > 0)
+               custom_tlvs_constr.data = MALLOC(custom_tlvs_constr.datalen * sizeof(LDKC2Tuple_u64CVec_u8ZZ), "LDKCVec_C2Tuple_u64CVec_u8ZZZ Elements");
+       else
+               custom_tlvs_constr.data = NULL;
+       int64_t* custom_tlvs_vals = custom_tlvs->elems;
+       for (size_t x = 0; x < custom_tlvs_constr.datalen; x++) {
+               int64_t custom_tlvs_conv_23 = custom_tlvs_vals[x];
+               void* custom_tlvs_conv_23_ptr = untag_ptr(custom_tlvs_conv_23);
+               CHECK_ACCESS(custom_tlvs_conv_23_ptr);
+               LDKC2Tuple_u64CVec_u8ZZ custom_tlvs_conv_23_conv = *(LDKC2Tuple_u64CVec_u8ZZ*)(custom_tlvs_conv_23_ptr);
+               custom_tlvs_conv_23_conv = C2Tuple_u64CVec_u8ZZ_clone((LDKC2Tuple_u64CVec_u8ZZ*)untag_ptr(custom_tlvs_conv_23));
+               custom_tlvs_constr.data[x] = custom_tlvs_conv_23_conv;
+       }
+       FREE(custom_tlvs);
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCRouting_receive_keysend(payment_data_conv, payment_preimage_ref, payment_metadata_conv, incoming_cltv_expiry, custom_tlvs_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_BlindedForward_free(int64_t this_obj) {
+       LDKBlindedForward this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       BlindedForward_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_BlindedForward_get_inbound_blinding_point(int64_t this_ptr) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, BlindedForward_get_inbound_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_BlindedForward_set_inbound_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       BlindedForward_set_inbound_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int32_t  CS_LDK_BlindedForward_get_failure(int64_t this_ptr) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedForward_get_failure(&this_ptr_conv));
+       return ret_conv;
+}
+
+void  CS_LDK_BlindedForward_set_failure(int64_t this_ptr, int32_t val) {
+       LDKBlindedForward this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKBlindedFailure val_conv = LDKBlindedFailure_from_cs(val);
+       BlindedForward_set_failure(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_BlindedForward_new(int8_tArray inbound_blinding_point_arg, int32_t failure_arg) {
+       LDKPublicKey inbound_blinding_point_arg_ref;
+       CHECK(inbound_blinding_point_arg->arr_len == 33);
+       memcpy(inbound_blinding_point_arg_ref.compressed_form, inbound_blinding_point_arg->elems, 33); FREE(inbound_blinding_point_arg);
+       LDKBlindedFailure failure_arg_conv = LDKBlindedFailure_from_cs(failure_arg);
+       LDKBlindedForward ret_var = BlindedForward_new(inbound_blinding_point_arg_ref, failure_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t BlindedForward_clone_ptr(LDKBlindedForward *NONNULL_PTR arg) {
+       LDKBlindedForward ret_var = BlindedForward_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_BlindedForward_clone_ptr(int64_t arg) {
+       LDKBlindedForward arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = BlindedForward_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedForward_clone(int64_t orig) {
+       LDKBlindedForward orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKBlindedForward ret_var = BlindedForward_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_BlindedForward_hash(int64_t o) {
+       LDKBlindedForward o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = BlindedForward_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedForward_eq(int64_t a, int64_t b) {
+       LDKBlindedForward a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKBlindedForward b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = BlindedForward_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PendingHTLCInfo_free(int64_t this_obj) {
+       LDKPendingHTLCInfo this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       PendingHTLCInfo_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_routing(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPendingHTLCRouting *ret_copy = MALLOC(sizeof(LDKPendingHTLCRouting), "LDKPendingHTLCRouting");
+       *ret_copy = PendingHTLCInfo_get_routing(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_routing(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKPendingHTLCRouting val_conv = *(LDKPendingHTLCRouting*)(val_ptr);
+       val_conv = PendingHTLCRouting_clone((LDKPendingHTLCRouting*)untag_ptr(val));
+       PendingHTLCInfo_set_routing(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_PendingHTLCInfo_get_incoming_shared_secret(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *PendingHTLCInfo_get_incoming_shared_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_incoming_shared_secret(int64_t this_ptr, int8_tArray val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       PendingHTLCInfo_set_incoming_shared_secret(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_PendingHTLCInfo_get_payment_hash(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *PendingHTLCInfo_get_payment_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_payment_hash(int64_t this_ptr, int8_tArray val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       PendingHTLCInfo_set_payment_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_incoming_amt_msat(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = PendingHTLCInfo_get_incoming_amt_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_incoming_amt_msat(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_u64Z val_conv = *(LDKCOption_u64Z*)(val_ptr);
+       val_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(val));
+       PendingHTLCInfo_set_incoming_amt_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_outgoing_amt_msat(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = PendingHTLCInfo_get_outgoing_amt_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_outgoing_amt_msat(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       PendingHTLCInfo_set_outgoing_amt_msat(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_PendingHTLCInfo_get_outgoing_cltv_value(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = PendingHTLCInfo_get_outgoing_cltv_value(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_outgoing_cltv_value(int64_t this_ptr, int32_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       PendingHTLCInfo_set_outgoing_cltv_value(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_get_skimmed_fee_msat(int64_t this_ptr) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = PendingHTLCInfo_get_skimmed_fee_msat(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_PendingHTLCInfo_set_skimmed_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKPendingHTLCInfo this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_u64Z val_conv = *(LDKCOption_u64Z*)(val_ptr);
+       val_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(val));
+       PendingHTLCInfo_set_skimmed_fee_msat(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_new(int64_t routing_arg, int8_tArray incoming_shared_secret_arg, int8_tArray payment_hash_arg, int64_t incoming_amt_msat_arg, int64_t outgoing_amt_msat_arg, int32_t outgoing_cltv_value_arg, int64_t skimmed_fee_msat_arg) {
+       void* routing_arg_ptr = untag_ptr(routing_arg);
+       CHECK_ACCESS(routing_arg_ptr);
+       LDKPendingHTLCRouting routing_arg_conv = *(LDKPendingHTLCRouting*)(routing_arg_ptr);
+       routing_arg_conv = PendingHTLCRouting_clone((LDKPendingHTLCRouting*)untag_ptr(routing_arg));
+       LDKThirtyTwoBytes incoming_shared_secret_arg_ref;
+       CHECK(incoming_shared_secret_arg->arr_len == 32);
+       memcpy(incoming_shared_secret_arg_ref.data, incoming_shared_secret_arg->elems, 32); FREE(incoming_shared_secret_arg);
+       LDKThirtyTwoBytes payment_hash_arg_ref;
+       CHECK(payment_hash_arg->arr_len == 32);
+       memcpy(payment_hash_arg_ref.data, payment_hash_arg->elems, 32); FREE(payment_hash_arg);
+       void* incoming_amt_msat_arg_ptr = untag_ptr(incoming_amt_msat_arg);
+       CHECK_ACCESS(incoming_amt_msat_arg_ptr);
+       LDKCOption_u64Z incoming_amt_msat_arg_conv = *(LDKCOption_u64Z*)(incoming_amt_msat_arg_ptr);
+       incoming_amt_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(incoming_amt_msat_arg));
+       void* skimmed_fee_msat_arg_ptr = untag_ptr(skimmed_fee_msat_arg);
+       CHECK_ACCESS(skimmed_fee_msat_arg_ptr);
+       LDKCOption_u64Z skimmed_fee_msat_arg_conv = *(LDKCOption_u64Z*)(skimmed_fee_msat_arg_ptr);
+       skimmed_fee_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(skimmed_fee_msat_arg));
+       LDKPendingHTLCInfo ret_var = PendingHTLCInfo_new(routing_arg_conv, incoming_shared_secret_arg_ref, payment_hash_arg_ref, incoming_amt_msat_arg_conv, outgoing_amt_msat_arg, outgoing_cltv_value_arg, skimmed_fee_msat_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t PendingHTLCInfo_clone_ptr(LDKPendingHTLCInfo *NONNULL_PTR arg) {
+       LDKPendingHTLCInfo ret_var = PendingHTLCInfo_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_PendingHTLCInfo_clone_ptr(int64_t arg) {
+       LDKPendingHTLCInfo arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = PendingHTLCInfo_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_clone(int64_t orig) {
+       LDKPendingHTLCInfo orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKPendingHTLCInfo ret_var = PendingHTLCInfo_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_BlindedFailure_clone(int64_t orig) {
+       LDKBlindedFailure* orig_conv = (LDKBlindedFailure*)untag_ptr(orig);
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedFailure_clone(orig_conv));
+       return ret_conv;
+}
+
+int32_t  CS_LDK_BlindedFailure_from_introduction_node() {
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedFailure_from_introduction_node());
+       return ret_conv;
+}
+
+int32_t  CS_LDK_BlindedFailure_from_blinded_node() {
+       int32_t ret_conv = LDKBlindedFailure_to_cs(BlindedFailure_from_blinded_node());
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedFailure_hash(int64_t o) {
+       LDKBlindedFailure* o_conv = (LDKBlindedFailure*)untag_ptr(o);
+       int64_t ret_conv = BlindedFailure_hash(o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_BlindedFailure_eq(int64_t a, int64_t b) {
+       LDKBlindedFailure* a_conv = (LDKBlindedFailure*)untag_ptr(a);
+       LDKBlindedFailure* b_conv = (LDKBlindedFailure*)untag_ptr(b);
+       jboolean ret_conv = BlindedFailure_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_FailureCode_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -35592,7 +38453,7 @@ int64_t  CS_LDK_ChannelManager_get_current_default_configuration(int64_t this_ar
        return ret_ref;
 }
 
-int64_t  CS_LDK_ChannelManager_create_channel(int64_t this_arg, int8_tArray their_network_key, int64_t channel_value_satoshis, int64_t push_msat, int8_tArray user_channel_id, int64_t override_config) {
+int64_t  CS_LDK_ChannelManager_create_channel(int64_t this_arg, int8_tArray their_network_key, int64_t channel_value_satoshis, int64_t push_msat, int8_tArray user_channel_id, int64_t temporary_channel_id, int64_t override_config) {
        LDKChannelManager this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
@@ -35604,13 +38465,17 @@ int64_t  CS_LDK_ChannelManager_create_channel(int64_t this_arg, int8_tArray thei
        LDKU128 user_channel_id_ref;
        CHECK(user_channel_id->arr_len == 16);
        memcpy(user_channel_id_ref.le_bytes, user_channel_id->elems, 16); FREE(user_channel_id);
+       void* temporary_channel_id_ptr = untag_ptr(temporary_channel_id);
+       CHECK_ACCESS(temporary_channel_id_ptr);
+       LDKCOption_ThirtyTwoBytesZ temporary_channel_id_conv = *(LDKCOption_ThirtyTwoBytesZ*)(temporary_channel_id_ptr);
+       temporary_channel_id_conv = COption_ThirtyTwoBytesZ_clone((LDKCOption_ThirtyTwoBytesZ*)untag_ptr(temporary_channel_id));
        LDKUserConfig override_config_conv;
        override_config_conv.inner = untag_ptr(override_config);
        override_config_conv.is_owned = ptr_is_owned(override_config);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(override_config_conv);
        override_config_conv = UserConfig_clone(&override_config_conv);
        LDKCResult_ThirtyTwoBytesAPIErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesAPIErrorZ), "LDKCResult_ThirtyTwoBytesAPIErrorZ");
-       *ret_conv = ChannelManager_create_channel(&this_arg_conv, their_network_key_ref, channel_value_satoshis, push_msat, user_channel_id_ref, override_config_conv);
+       *ret_conv = ChannelManager_create_channel(&this_arg_conv, their_network_key_ref, channel_value_satoshis, push_msat, user_channel_id_ref, temporary_channel_id_conv, override_config_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -36688,6 +39553,90 @@ int64_t  CS_LDK_PhantomRouteHints_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+int8_tArray  CS_LDK_BlindedForward_write(int64_t obj) {
+       LDKBlindedForward obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = BlindedForward_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_BlindedForward_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedForwardDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedForwardDecodeErrorZ), "LDKCResult_BlindedForwardDecodeErrorZ");
+       *ret_conv = BlindedForward_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PendingHTLCRouting_write(int64_t obj) {
+       LDKPendingHTLCRouting* obj_conv = (LDKPendingHTLCRouting*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = PendingHTLCRouting_write(obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_PendingHTLCRouting_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PendingHTLCRoutingDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCRoutingDecodeErrorZ), "LDKCResult_PendingHTLCRoutingDecodeErrorZ");
+       *ret_conv = PendingHTLCRouting_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_PendingHTLCInfo_write(int64_t obj) {
+       LDKPendingHTLCInfo obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = PendingHTLCInfo_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_PendingHTLCInfo_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_PendingHTLCInfoDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PendingHTLCInfoDecodeErrorZ), "LDKCResult_PendingHTLCInfoDecodeErrorZ");
+       *ret_conv = PendingHTLCInfo_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_BlindedFailure_write(int64_t obj) {
+       LDKBlindedFailure* obj_conv = (LDKBlindedFailure*)untag_ptr(obj);
+       LDKCVec_u8Z ret_var = BlindedFailure_write(obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_BlindedFailure_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_BlindedFailureDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_BlindedFailureDecodeErrorZ), "LDKCResult_BlindedFailureDecodeErrorZ");
+       *ret_conv = BlindedFailure_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_ChannelManager_write(int64_t obj) {
        LDKChannelManager obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -37073,6 +40022,844 @@ int64_t  CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_read(int8_tArray ser, int6
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_DelayedPaymentBasepoint_free(int64_t this_obj) {
+       LDKDelayedPaymentBasepoint this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       DelayedPaymentBasepoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentBasepoint_get_a(int64_t this_ptr) {
+       LDKDelayedPaymentBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentBasepoint_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentBasepoint_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKDelayedPaymentBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       DelayedPaymentBasepoint_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKDelayedPaymentBasepoint ret_var = DelayedPaymentBasepoint_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_DelayedPaymentBasepoint_eq(int64_t a, int64_t b) {
+       LDKDelayedPaymentBasepoint a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKDelayedPaymentBasepoint b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = DelayedPaymentBasepoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t DelayedPaymentBasepoint_clone_ptr(LDKDelayedPaymentBasepoint *NONNULL_PTR arg) {
+       LDKDelayedPaymentBasepoint ret_var = DelayedPaymentBasepoint_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_DelayedPaymentBasepoint_clone_ptr(int64_t arg) {
+       LDKDelayedPaymentBasepoint arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = DelayedPaymentBasepoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_clone(int64_t orig) {
+       LDKDelayedPaymentBasepoint orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKDelayedPaymentBasepoint ret_var = DelayedPaymentBasepoint_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_hash(int64_t o) {
+       LDKDelayedPaymentBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = DelayedPaymentBasepoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentBasepoint_to_public_key(int64_t this_arg) {
+       LDKDelayedPaymentBasepoint this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentBasepoint_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentBasepoint_write(int64_t obj) {
+       LDKDelayedPaymentBasepoint obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = DelayedPaymentBasepoint_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_DelayedPaymentBasepoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_DelayedPaymentBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentBasepointDecodeErrorZ), "LDKCResult_DelayedPaymentBasepointDecodeErrorZ");
+       *ret_conv = DelayedPaymentBasepoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_DelayedPaymentKey_free(int64_t this_obj) {
+       LDKDelayedPaymentKey this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       DelayedPaymentKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_DelayedPaymentKey_get_a(int64_t this_ptr) {
+       LDKDelayedPaymentKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_DelayedPaymentKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKDelayedPaymentKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       DelayedPaymentKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_DelayedPaymentKey_eq(int64_t a, int64_t b) {
+       LDKDelayedPaymentKey a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKDelayedPaymentKey b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = DelayedPaymentKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t DelayedPaymentKey_clone_ptr(LDKDelayedPaymentKey *NONNULL_PTR arg) {
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_DelayedPaymentKey_clone_ptr(int64_t arg) {
+       LDKDelayedPaymentKey arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = DelayedPaymentKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_clone(int64_t orig) {
+       LDKDelayedPaymentKey orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_from_basepoint(int64_t countersignatory_basepoint, int8_tArray per_commitment_point) {
+       LDKDelayedPaymentBasepoint countersignatory_basepoint_conv;
+       countersignatory_basepoint_conv.inner = untag_ptr(countersignatory_basepoint);
+       countersignatory_basepoint_conv.is_owned = ptr_is_owned(countersignatory_basepoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_basepoint_conv);
+       countersignatory_basepoint_conv.is_owned = false;
+       LDKPublicKey per_commitment_point_ref;
+       CHECK(per_commitment_point->arr_len == 33);
+       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_from_basepoint(&countersignatory_basepoint_conv, per_commitment_point_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_from_secret_key(int8_tArray sk) {
+       uint8_t sk_arr[32];
+       CHECK(sk->arr_len == 32);
+       memcpy(sk_arr, sk->elems, 32); FREE(sk);
+       uint8_t (*sk_ref)[32] = &sk_arr;
+       LDKDelayedPaymentKey ret_var = DelayedPaymentKey_from_secret_key(sk_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentKey_to_public_key(int64_t this_arg) {
+       LDKDelayedPaymentKey this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, DelayedPaymentKey_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_DelayedPaymentKey_write(int64_t obj) {
+       LDKDelayedPaymentKey obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = DelayedPaymentKey_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_DelayedPaymentKey_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_DelayedPaymentKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_DelayedPaymentKeyDecodeErrorZ), "LDKCResult_DelayedPaymentKeyDecodeErrorZ");
+       *ret_conv = DelayedPaymentKey_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HtlcBasepoint_free(int64_t this_obj) {
+       LDKHtlcBasepoint this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       HtlcBasepoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_HtlcBasepoint_get_a(int64_t this_ptr) {
+       LDKHtlcBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcBasepoint_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_HtlcBasepoint_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKHtlcBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       HtlcBasepoint_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_HtlcBasepoint_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKHtlcBasepoint ret_var = HtlcBasepoint_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_HtlcBasepoint_eq(int64_t a, int64_t b) {
+       LDKHtlcBasepoint a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKHtlcBasepoint b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = HtlcBasepoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t HtlcBasepoint_clone_ptr(LDKHtlcBasepoint *NONNULL_PTR arg) {
+       LDKHtlcBasepoint ret_var = HtlcBasepoint_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_HtlcBasepoint_clone_ptr(int64_t arg) {
+       LDKHtlcBasepoint arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = HtlcBasepoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HtlcBasepoint_clone(int64_t orig) {
+       LDKHtlcBasepoint orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKHtlcBasepoint ret_var = HtlcBasepoint_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HtlcBasepoint_hash(int64_t o) {
+       LDKHtlcBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = HtlcBasepoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_HtlcBasepoint_to_public_key(int64_t this_arg) {
+       LDKHtlcBasepoint this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcBasepoint_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_HtlcBasepoint_write(int64_t obj) {
+       LDKHtlcBasepoint obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = HtlcBasepoint_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_HtlcBasepoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HtlcBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcBasepointDecodeErrorZ), "LDKCResult_HtlcBasepointDecodeErrorZ");
+       *ret_conv = HtlcBasepoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_HtlcKey_free(int64_t this_obj) {
+       LDKHtlcKey this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       HtlcKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_HtlcKey_get_a(int64_t this_ptr) {
+       LDKHtlcKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_HtlcKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKHtlcKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       HtlcKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_HtlcKey_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKHtlcKey ret_var = HtlcKey_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_HtlcKey_eq(int64_t a, int64_t b) {
+       LDKHtlcKey a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKHtlcKey b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = HtlcKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t HtlcKey_clone_ptr(LDKHtlcKey *NONNULL_PTR arg) {
+       LDKHtlcKey ret_var = HtlcKey_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_HtlcKey_clone_ptr(int64_t arg) {
+       LDKHtlcKey arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = HtlcKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_HtlcKey_clone(int64_t orig) {
+       LDKHtlcKey orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKHtlcKey ret_var = HtlcKey_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HtlcKey_from_basepoint(int64_t countersignatory_basepoint, int8_tArray per_commitment_point) {
+       LDKHtlcBasepoint countersignatory_basepoint_conv;
+       countersignatory_basepoint_conv.inner = untag_ptr(countersignatory_basepoint);
+       countersignatory_basepoint_conv.is_owned = ptr_is_owned(countersignatory_basepoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_basepoint_conv);
+       countersignatory_basepoint_conv.is_owned = false;
+       LDKPublicKey per_commitment_point_ref;
+       CHECK(per_commitment_point->arr_len == 33);
+       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
+       LDKHtlcKey ret_var = HtlcKey_from_basepoint(&countersignatory_basepoint_conv, per_commitment_point_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_HtlcKey_from_secret_key(int8_tArray sk) {
+       uint8_t sk_arr[32];
+       CHECK(sk->arr_len == 32);
+       memcpy(sk_arr, sk->elems, 32); FREE(sk);
+       uint8_t (*sk_ref)[32] = &sk_arr;
+       LDKHtlcKey ret_var = HtlcKey_from_secret_key(sk_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_HtlcKey_to_public_key(int64_t this_arg) {
+       LDKHtlcKey this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, HtlcKey_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_HtlcKey_write(int64_t obj) {
+       LDKHtlcKey obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = HtlcKey_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_HtlcKey_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_HtlcKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_HtlcKeyDecodeErrorZ), "LDKCResult_HtlcKeyDecodeErrorZ");
+       *ret_conv = HtlcKey_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RevocationBasepoint_free(int64_t this_obj) {
+       LDKRevocationBasepoint this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       RevocationBasepoint_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RevocationBasepoint_get_a(int64_t this_ptr) {
+       LDKRevocationBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationBasepoint_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RevocationBasepoint_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKRevocationBasepoint this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       RevocationBasepoint_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RevocationBasepoint_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKRevocationBasepoint ret_var = RevocationBasepoint_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_RevocationBasepoint_eq(int64_t a, int64_t b) {
+       LDKRevocationBasepoint a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKRevocationBasepoint b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = RevocationBasepoint_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RevocationBasepoint_clone_ptr(LDKRevocationBasepoint *NONNULL_PTR arg) {
+       LDKRevocationBasepoint ret_var = RevocationBasepoint_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_RevocationBasepoint_clone_ptr(int64_t arg) {
+       LDKRevocationBasepoint arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = RevocationBasepoint_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevocationBasepoint_clone(int64_t orig) {
+       LDKRevocationBasepoint orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKRevocationBasepoint ret_var = RevocationBasepoint_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RevocationBasepoint_hash(int64_t o) {
+       LDKRevocationBasepoint o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = RevocationBasepoint_hash(&o_conv);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_RevocationBasepoint_to_public_key(int64_t this_arg) {
+       LDKRevocationBasepoint this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationBasepoint_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_RevocationBasepoint_write(int64_t obj) {
+       LDKRevocationBasepoint obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = RevocationBasepoint_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RevocationBasepoint_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RevocationBasepointDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationBasepointDecodeErrorZ), "LDKCResult_RevocationBasepointDecodeErrorZ");
+       *ret_conv = RevocationBasepoint_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_RevocationKey_free(int64_t this_obj) {
+       LDKRevocationKey this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       RevocationKey_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_RevocationKey_get_a(int64_t this_ptr) {
+       LDKRevocationKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationKey_get_a(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_RevocationKey_set_a(int64_t this_ptr, int8_tArray val) {
+       LDKRevocationKey this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       RevocationKey_set_a(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_RevocationKey_new(int8_tArray a_arg) {
+       LDKPublicKey a_arg_ref;
+       CHECK(a_arg->arr_len == 33);
+       memcpy(a_arg_ref.compressed_form, a_arg->elems, 33); FREE(a_arg);
+       LDKRevocationKey ret_var = RevocationKey_new(a_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_RevocationKey_eq(int64_t a, int64_t b) {
+       LDKRevocationKey a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKRevocationKey b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = RevocationKey_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+static inline uint64_t RevocationKey_clone_ptr(LDKRevocationKey *NONNULL_PTR arg) {
+       LDKRevocationKey ret_var = RevocationKey_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_RevocationKey_clone_ptr(int64_t arg) {
+       LDKRevocationKey arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = RevocationKey_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevocationKey_clone(int64_t orig) {
+       LDKRevocationKey orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKRevocationKey ret_var = RevocationKey_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_RevocationKey_hash(int64_t o) {
+       LDKRevocationKey o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = RevocationKey_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_RevocationKey_from_basepoint(int64_t countersignatory_basepoint, int8_tArray per_commitment_point) {
+       LDKRevocationBasepoint countersignatory_basepoint_conv;
+       countersignatory_basepoint_conv.inner = untag_ptr(countersignatory_basepoint);
+       countersignatory_basepoint_conv.is_owned = ptr_is_owned(countersignatory_basepoint);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_basepoint_conv);
+       countersignatory_basepoint_conv.is_owned = false;
+       LDKPublicKey per_commitment_point_ref;
+       CHECK(per_commitment_point->arr_len == 33);
+       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
+       LDKRevocationKey ret_var = RevocationKey_from_basepoint(&countersignatory_basepoint_conv, per_commitment_point_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_RevocationKey_to_public_key(int64_t this_arg) {
+       LDKRevocationKey this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, RevocationKey_to_public_key(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+int8_tArray  CS_LDK_RevocationKey_write(int64_t obj) {
+       LDKRevocationKey obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = RevocationKey_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_RevocationKey_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_RevocationKeyDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_RevocationKeyDecodeErrorZ), "LDKCResult_RevocationKeyDecodeErrorZ");
+       *ret_conv = RevocationKey_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 void  CS_LDK_ExpandedKey_free(int64_t this_obj) {
        LDKExpandedKey this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -37216,6 +41003,12 @@ int64_t  CS_LDK_DecodeError_unsupported_compression() {
        return ret_ref;
 }
 
+int64_t  CS_LDK_DecodeError_hash(int64_t o) {
+       LDKDecodeError* o_conv = (LDKDecodeError*)untag_ptr(o);
+       int64_t ret_conv = DecodeError_hash(o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_DecodeError_eq(int64_t a, int64_t b) {
        LDKDecodeError* a_conv = (LDKDecodeError*)untag_ptr(a);
        LDKDecodeError* b_conv = (LDKDecodeError*)untag_ptr(b);
@@ -37358,6 +41151,16 @@ int64_t  CS_LDK_Init_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Init_hash(int64_t o) {
+       LDKInit o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Init_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Init_eq(int64_t a, int64_t b) {
        LDKInit a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37468,6 +41271,16 @@ int64_t  CS_LDK_ErrorMessage_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ErrorMessage_hash(int64_t o) {
+       LDKErrorMessage o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ErrorMessage_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ErrorMessage_eq(int64_t a, int64_t b) {
        LDKErrorMessage a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37578,6 +41391,16 @@ int64_t  CS_LDK_WarningMessage_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_WarningMessage_hash(int64_t o) {
+       LDKWarningMessage o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = WarningMessage_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_WarningMessage_eq(int64_t a, int64_t b) {
        LDKWarningMessage a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37677,6 +41500,16 @@ int64_t  CS_LDK_Ping_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Ping_hash(int64_t o) {
+       LDKPing o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Ping_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Ping_eq(int64_t a, int64_t b) {
        LDKPing a_conv;
        a_conv.inner = untag_ptr(a);
@@ -37757,6 +41590,16 @@ int64_t  CS_LDK_Pong_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Pong_hash(int64_t o) {
+       LDKPong o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Pong_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Pong_eq(int64_t a, int64_t b) {
        LDKPong a_conv;
        a_conv.inner = untag_ptr(a);
@@ -38277,6 +42120,16 @@ int64_t  CS_LDK_OpenChannel_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_OpenChannel_hash(int64_t o) {
+       LDKOpenChannel o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OpenChannel_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_OpenChannel_eq(int64_t a, int64_t b) {
        LDKOpenChannel a_conv;
        a_conv.inner = untag_ptr(a);
@@ -38844,6 +42697,16 @@ int64_t  CS_LDK_OpenChannelV2_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_OpenChannelV2_hash(int64_t o) {
+       LDKOpenChannelV2 o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OpenChannelV2_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_OpenChannelV2_eq(int64_t a, int64_t b) {
        LDKOpenChannelV2 a_conv;
        a_conv.inner = untag_ptr(a);
@@ -39281,6 +43144,16 @@ int64_t  CS_LDK_AcceptChannel_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_AcceptChannel_hash(int64_t o) {
+       LDKAcceptChannel o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = AcceptChannel_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_AcceptChannel_eq(int64_t a, int64_t b) {
        LDKAcceptChannel a_conv;
        a_conv.inner = untag_ptr(a);
@@ -39765,6 +43638,16 @@ int64_t  CS_LDK_AcceptChannelV2_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_AcceptChannelV2_hash(int64_t o) {
+       LDKAcceptChannelV2 o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = AcceptChannelV2_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_AcceptChannelV2_eq(int64_t a, int64_t b) {
        LDKAcceptChannelV2 a_conv;
        a_conv.inner = untag_ptr(a);
@@ -39923,6 +43806,16 @@ int64_t  CS_LDK_FundingCreated_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_FundingCreated_hash(int64_t o) {
+       LDKFundingCreated o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = FundingCreated_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_FundingCreated_eq(int64_t a, int64_t b) {
        LDKFundingCreated a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40036,6 +43929,16 @@ int64_t  CS_LDK_FundingSigned_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_FundingSigned_hash(int64_t o) {
+       LDKFundingSigned o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = FundingSigned_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_FundingSigned_eq(int64_t a, int64_t b) {
        LDKFundingSigned a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40178,6 +44081,16 @@ int64_t  CS_LDK_ChannelReady_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelReady_hash(int64_t o) {
+       LDKChannelReady o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelReady_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelReady_eq(int64_t a, int64_t b) {
        LDKChannelReady a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40193,6 +44106,553 @@ jboolean  CS_LDK_ChannelReady_eq(int64_t a, int64_t b) {
        return ret_conv;
 }
 
+void  CS_LDK_Stfu_free(int64_t this_obj) {
+       LDKStfu this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       Stfu_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_Stfu_get_channel_id(int64_t this_ptr) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *Stfu_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Stfu_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       Stfu_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_t  CS_LDK_Stfu_get_initiator(int64_t this_ptr) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_t ret_conv = Stfu_get_initiator(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Stfu_set_initiator(int64_t this_ptr, int8_t val) {
+       LDKStfu this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Stfu_set_initiator(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_Stfu_new(int8_tArray channel_id_arg, int8_t initiator_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKStfu ret_var = Stfu_new(channel_id_arg_ref, initiator_arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t Stfu_clone_ptr(LDKStfu *NONNULL_PTR arg) {
+       LDKStfu ret_var = Stfu_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_Stfu_clone_ptr(int64_t arg) {
+       LDKStfu arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = Stfu_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Stfu_clone(int64_t orig) {
+       LDKStfu orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKStfu ret_var = Stfu_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Stfu_eq(int64_t a, int64_t b) {
+       LDKStfu a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKStfu b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = Stfu_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_free(int64_t this_obj) {
+       LDKSplice this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       Splice_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_Splice_get_channel_id(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *Splice_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Splice_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       Splice_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_Splice_get_chain_hash(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *Splice_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_Splice_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       Splice_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Splice_get_relative_satoshis(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = Splice_get_relative_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_set_relative_satoshis(int64_t this_ptr, int64_t val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Splice_set_relative_satoshis(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_Splice_get_funding_feerate_perkw(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = Splice_get_funding_feerate_perkw(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_set_funding_feerate_perkw(int64_t this_ptr, int32_t val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Splice_set_funding_feerate_perkw(&this_ptr_conv, val);
+}
+
+int32_t  CS_LDK_Splice_get_locktime(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int32_t ret_conv = Splice_get_locktime(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_Splice_set_locktime(int64_t this_ptr, int32_t val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       Splice_set_locktime(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_Splice_get_funding_pubkey(int64_t this_ptr) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, Splice_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_Splice_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKSplice this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       Splice_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_Splice_new(int8_tArray channel_id_arg, int8_tArray chain_hash_arg, int64_t relative_satoshis_arg, int32_t funding_feerate_perkw_arg, int32_t locktime_arg, int8_tArray funding_pubkey_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKThirtyTwoBytes chain_hash_arg_ref;
+       CHECK(chain_hash_arg->arr_len == 32);
+       memcpy(chain_hash_arg_ref.data, chain_hash_arg->elems, 32); FREE(chain_hash_arg);
+       LDKPublicKey funding_pubkey_arg_ref;
+       CHECK(funding_pubkey_arg->arr_len == 33);
+       memcpy(funding_pubkey_arg_ref.compressed_form, funding_pubkey_arg->elems, 33); FREE(funding_pubkey_arg);
+       LDKSplice ret_var = Splice_new(channel_id_arg_ref, chain_hash_arg_ref, relative_satoshis_arg, funding_feerate_perkw_arg, locktime_arg, funding_pubkey_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t Splice_clone_ptr(LDKSplice *NONNULL_PTR arg) {
+       LDKSplice ret_var = Splice_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_Splice_clone_ptr(int64_t arg) {
+       LDKSplice arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = Splice_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Splice_clone(int64_t orig) {
+       LDKSplice orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKSplice ret_var = Splice_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_Splice_eq(int64_t a, int64_t b) {
+       LDKSplice a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKSplice b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = Splice_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SpliceAck_free(int64_t this_obj) {
+       LDKSpliceAck this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       SpliceAck_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_SpliceAck_get_channel_id(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *SpliceAck_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceAck_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       SpliceAck_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int8_tArray  CS_LDK_SpliceAck_get_chain_hash(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *SpliceAck_get_chain_hash(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceAck_set_chain_hash(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       SpliceAck_set_chain_hash(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_SpliceAck_get_relative_satoshis(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = SpliceAck_get_relative_satoshis(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SpliceAck_set_relative_satoshis(int64_t this_ptr, int64_t val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       SpliceAck_set_relative_satoshis(&this_ptr_conv, val);
+}
+
+int8_tArray  CS_LDK_SpliceAck_get_funding_pubkey(int64_t this_ptr) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, SpliceAck_get_funding_pubkey(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceAck_set_funding_pubkey(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceAck this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       SpliceAck_set_funding_pubkey(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_SpliceAck_new(int8_tArray channel_id_arg, int8_tArray chain_hash_arg, int64_t relative_satoshis_arg, int8_tArray funding_pubkey_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKThirtyTwoBytes chain_hash_arg_ref;
+       CHECK(chain_hash_arg->arr_len == 32);
+       memcpy(chain_hash_arg_ref.data, chain_hash_arg->elems, 32); FREE(chain_hash_arg);
+       LDKPublicKey funding_pubkey_arg_ref;
+       CHECK(funding_pubkey_arg->arr_len == 33);
+       memcpy(funding_pubkey_arg_ref.compressed_form, funding_pubkey_arg->elems, 33); FREE(funding_pubkey_arg);
+       LDKSpliceAck ret_var = SpliceAck_new(channel_id_arg_ref, chain_hash_arg_ref, relative_satoshis_arg, funding_pubkey_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t SpliceAck_clone_ptr(LDKSpliceAck *NONNULL_PTR arg) {
+       LDKSpliceAck ret_var = SpliceAck_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_SpliceAck_clone_ptr(int64_t arg) {
+       LDKSpliceAck arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = SpliceAck_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SpliceAck_clone(int64_t orig) {
+       LDKSpliceAck orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKSpliceAck ret_var = SpliceAck_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SpliceAck_eq(int64_t a, int64_t b) {
+       LDKSpliceAck a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKSpliceAck b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = SpliceAck_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_SpliceLocked_free(int64_t this_obj) {
+       LDKSpliceLocked this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       SpliceLocked_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_SpliceLocked_get_channel_id(int64_t this_ptr) {
+       LDKSpliceLocked this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *SpliceLocked_get_channel_id(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_SpliceLocked_set_channel_id(int64_t this_ptr, int8_tArray val) {
+       LDKSpliceLocked this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       SpliceLocked_set_channel_id(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_SpliceLocked_new(int8_tArray channel_id_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKSpliceLocked ret_var = SpliceLocked_new(channel_id_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t SpliceLocked_clone_ptr(LDKSpliceLocked *NONNULL_PTR arg) {
+       LDKSpliceLocked ret_var = SpliceLocked_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_SpliceLocked_clone_ptr(int64_t arg) {
+       LDKSpliceLocked arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = SpliceLocked_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SpliceLocked_clone(int64_t orig) {
+       LDKSpliceLocked orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKSpliceLocked ret_var = SpliceLocked_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SpliceLocked_eq(int64_t a, int64_t b) {
+       LDKSpliceLocked a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKSpliceLocked b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = SpliceLocked_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_TxAddInput_free(int64_t this_obj) {
        LDKTxAddInput this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -40354,6 +44814,16 @@ int64_t  CS_LDK_TxAddInput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAddInput_hash(int64_t o) {
+       LDKTxAddInput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAddInput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAddInput_eq(int64_t a, int64_t b) {
        LDKTxAddInput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40444,9 +44914,10 @@ int8_tArray  CS_LDK_TxAddOutput_get_script(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = TxAddOutput_get_script(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = TxAddOutput_get_script(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -40508,6 +44979,16 @@ int64_t  CS_LDK_TxAddOutput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAddOutput_hash(int64_t o) {
+       LDKTxAddOutput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAddOutput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAddOutput_eq(int64_t a, int64_t b) {
        LDKTxAddOutput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40614,6 +45095,16 @@ int64_t  CS_LDK_TxRemoveInput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxRemoveInput_hash(int64_t o) {
+       LDKTxRemoveInput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxRemoveInput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxRemoveInput_eq(int64_t a, int64_t b) {
        LDKTxRemoveInput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40720,6 +45211,16 @@ int64_t  CS_LDK_TxRemoveOutput_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxRemoveOutput_hash(int64_t o) {
+       LDKTxRemoveOutput o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxRemoveOutput_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxRemoveOutput_eq(int64_t a, int64_t b) {
        LDKTxRemoveOutput a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40807,6 +45308,16 @@ int64_t  CS_LDK_TxComplete_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxComplete_hash(int64_t o) {
+       LDKTxComplete o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxComplete_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxComplete_eq(int64_t a, int64_t b) {
        LDKTxComplete a_conv;
        a_conv.inner = untag_ptr(a);
@@ -40985,6 +45496,16 @@ int64_t  CS_LDK_TxSignatures_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxSignatures_hash(int64_t o) {
+       LDKTxSignatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxSignatures_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxSignatures_eq(int64_t a, int64_t b) {
        LDKTxSignatures a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41139,6 +45660,16 @@ int64_t  CS_LDK_TxInitRbf_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxInitRbf_hash(int64_t o) {
+       LDKTxInitRbf o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxInitRbf_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxInitRbf_eq(int64_t a, int64_t b) {
        LDKTxInitRbf a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41255,6 +45786,16 @@ int64_t  CS_LDK_TxAckRbf_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAckRbf_hash(int64_t o) {
+       LDKTxAckRbf o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAckRbf_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAckRbf_eq(int64_t a, int64_t b) {
        LDKTxAckRbf a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41372,6 +45913,16 @@ int64_t  CS_LDK_TxAbort_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_TxAbort_hash(int64_t o) {
+       LDKTxAbort o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = TxAbort_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_TxAbort_eq(int64_t a, int64_t b) {
        LDKTxAbort a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41424,9 +45975,10 @@ int8_tArray  CS_LDK_Shutdown_get_scriptpubkey(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = Shutdown_get_scriptpubkey(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = Shutdown_get_scriptpubkey(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -41488,6 +46040,16 @@ int64_t  CS_LDK_Shutdown_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Shutdown_hash(int64_t o) {
+       LDKShutdown o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Shutdown_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Shutdown_eq(int64_t a, int64_t b) {
        LDKShutdown a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41587,6 +46149,16 @@ int64_t  CS_LDK_ClosingSignedFeeRange_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ClosingSignedFeeRange_hash(int64_t o) {
+       LDKClosingSignedFeeRange o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ClosingSignedFeeRange_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ClosingSignedFeeRange_eq(int64_t a, int64_t b) {
        LDKClosingSignedFeeRange a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41751,6 +46323,16 @@ int64_t  CS_LDK_ClosingSigned_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ClosingSigned_hash(int64_t o) {
+       LDKClosingSigned o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ClosingSigned_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ClosingSigned_eq(int64_t a, int64_t b) {
        LDKClosingSigned a_conv;
        a_conv.inner = untag_ptr(a);
@@ -41902,6 +46484,82 @@ void  CS_LDK_UpdateAddHTLC_set_skimmed_fee_msat(int64_t this_ptr, int64_t val) {
        UpdateAddHTLC_set_skimmed_fee_msat(&this_ptr_conv, val_conv);
 }
 
+int64_t  CS_LDK_UpdateAddHTLC_get_onion_routing_packet(int64_t this_ptr) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKOnionPacket ret_var = UpdateAddHTLC_get_onion_routing_packet(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_onion_routing_packet(int64_t this_ptr, int64_t val) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKOnionPacket val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = OnionPacket_clone(&val_conv);
+       UpdateAddHTLC_set_onion_routing_packet(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_UpdateAddHTLC_get_blinding_point(int64_t this_ptr) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, UpdateAddHTLC_get_blinding_point(&this_ptr_conv).compressed_form, 33);
+       return ret_arr;
+}
+
+void  CS_LDK_UpdateAddHTLC_set_blinding_point(int64_t this_ptr, int8_tArray val) {
+       LDKUpdateAddHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKPublicKey val_ref;
+       CHECK(val->arr_len == 33);
+       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
+       UpdateAddHTLC_set_blinding_point(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_UpdateAddHTLC_new(int8_tArray channel_id_arg, int64_t htlc_id_arg, int64_t amount_msat_arg, int8_tArray payment_hash_arg, int32_t cltv_expiry_arg, int64_t skimmed_fee_msat_arg, int64_t onion_routing_packet_arg, int8_tArray blinding_point_arg) {
+       LDKThirtyTwoBytes channel_id_arg_ref;
+       CHECK(channel_id_arg->arr_len == 32);
+       memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
+       LDKThirtyTwoBytes payment_hash_arg_ref;
+       CHECK(payment_hash_arg->arr_len == 32);
+       memcpy(payment_hash_arg_ref.data, payment_hash_arg->elems, 32); FREE(payment_hash_arg);
+       void* skimmed_fee_msat_arg_ptr = untag_ptr(skimmed_fee_msat_arg);
+       CHECK_ACCESS(skimmed_fee_msat_arg_ptr);
+       LDKCOption_u64Z skimmed_fee_msat_arg_conv = *(LDKCOption_u64Z*)(skimmed_fee_msat_arg_ptr);
+       skimmed_fee_msat_arg_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(skimmed_fee_msat_arg));
+       LDKOnionPacket onion_routing_packet_arg_conv;
+       onion_routing_packet_arg_conv.inner = untag_ptr(onion_routing_packet_arg);
+       onion_routing_packet_arg_conv.is_owned = ptr_is_owned(onion_routing_packet_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(onion_routing_packet_arg_conv);
+       onion_routing_packet_arg_conv = OnionPacket_clone(&onion_routing_packet_arg_conv);
+       LDKPublicKey blinding_point_arg_ref;
+       CHECK(blinding_point_arg->arr_len == 33);
+       memcpy(blinding_point_arg_ref.compressed_form, blinding_point_arg->elems, 33); FREE(blinding_point_arg);
+       LDKUpdateAddHTLC ret_var = UpdateAddHTLC_new(channel_id_arg_ref, htlc_id_arg, amount_msat_arg, payment_hash_arg_ref, cltv_expiry_arg, skimmed_fee_msat_arg_conv, onion_routing_packet_arg_conv, blinding_point_arg_ref);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 static inline uint64_t UpdateAddHTLC_clone_ptr(LDKUpdateAddHTLC *NONNULL_PTR arg) {
        LDKUpdateAddHTLC ret_var = UpdateAddHTLC_clone(arg);
        int64_t ret_ref = 0;
@@ -41932,6 +46590,16 @@ int64_t  CS_LDK_UpdateAddHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateAddHTLC_hash(int64_t o) {
+       LDKUpdateAddHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateAddHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateAddHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateAddHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42051,6 +46719,16 @@ int64_t  CS_LDK_OnionMessage_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_OnionMessage_hash(int64_t o) {
+       LDKOnionMessage o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OnionMessage_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_OnionMessage_eq(int64_t a, int64_t b) {
        LDKOnionMessage a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42183,6 +46861,16 @@ int64_t  CS_LDK_UpdateFulfillHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFulfillHTLC_hash(int64_t o) {
+       LDKUpdateFulfillHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFulfillHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFulfillHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateFulfillHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42278,6 +46966,16 @@ int64_t  CS_LDK_UpdateFailHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFailHTLC_hash(int64_t o) {
+       LDKUpdateFailHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFailHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFailHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateFailHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42392,6 +47090,16 @@ int64_t  CS_LDK_UpdateFailMalformedHTLC_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFailMalformedHTLC_hash(int64_t o) {
+       LDKUpdateFailMalformedHTLC o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFailMalformedHTLC_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFailMalformedHTLC_eq(int64_t a, int64_t b) {
        LDKUpdateFailMalformedHTLC a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42564,6 +47272,16 @@ int64_t  CS_LDK_CommitmentSigned_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_CommitmentSigned_hash(int64_t o) {
+       LDKCommitmentSigned o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = CommitmentSigned_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_CommitmentSigned_eq(int64_t a, int64_t b) {
        LDKCommitmentSigned a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42703,6 +47421,16 @@ int64_t  CS_LDK_RevokeAndACK_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_RevokeAndACK_hash(int64_t o) {
+       LDKRevokeAndACK o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = RevokeAndACK_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_RevokeAndACK_eq(int64_t a, int64_t b) {
        LDKRevokeAndACK a_conv;
        a_conv.inner = untag_ptr(a);
@@ -42809,6 +47537,16 @@ int64_t  CS_LDK_UpdateFee_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UpdateFee_hash(int64_t o) {
+       LDKUpdateFee o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UpdateFee_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UpdateFee_eq(int64_t a, int64_t b) {
        LDKUpdateFee a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43015,6 +47753,16 @@ int64_t  CS_LDK_ChannelReestablish_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelReestablish_hash(int64_t o) {
+       LDKChannelReestablish o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelReestablish_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelReestablish_eq(int64_t a, int64_t b) {
        LDKChannelReestablish a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43173,6 +47921,16 @@ int64_t  CS_LDK_AnnouncementSignatures_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_AnnouncementSignatures_hash(int64_t o) {
+       LDKAnnouncementSignatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = AnnouncementSignatures_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_AnnouncementSignatures_eq(int64_t a, int64_t b) {
        LDKAnnouncementSignatures a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43269,6 +48027,12 @@ int64_t  CS_LDK_SocketAddress_hostname(int64_t hostname, int16_t port) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_SocketAddress_hash(int64_t o) {
+       LDKSocketAddress* o_conv = (LDKSocketAddress*)untag_ptr(o);
+       int64_t ret_conv = SocketAddress_hash(o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_SocketAddress_eq(int64_t a, int64_t b) {
        LDKSocketAddress* a_conv = (LDKSocketAddress*)untag_ptr(a);
        LDKSocketAddress* b_conv = (LDKSocketAddress*)untag_ptr(b);
@@ -43321,6 +48085,12 @@ int32_t  CS_LDK_SocketAddressParseError_invalid_onion_v3() {
        return ret_conv;
 }
 
+int64_t  CS_LDK_SocketAddressParseError_hash(int64_t o) {
+       LDKSocketAddressParseError* o_conv = (LDKSocketAddressParseError*)untag_ptr(o);
+       int64_t ret_conv = SocketAddressParseError_hash(o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_SocketAddressParseError_eq(int64_t a, int64_t b) {
        LDKSocketAddressParseError* a_conv = (LDKSocketAddressParseError*)untag_ptr(a);
        LDKSocketAddressParseError* b_conv = (LDKSocketAddressParseError*)untag_ptr(b);
@@ -43631,6 +48401,16 @@ int64_t  CS_LDK_UnsignedNodeAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UnsignedNodeAnnouncement_hash(int64_t o) {
+       LDKUnsignedNodeAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UnsignedNodeAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UnsignedNodeAnnouncement_eq(int64_t a, int64_t b) {
        LDKUnsignedNodeAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -43750,6 +48530,16 @@ int64_t  CS_LDK_NodeAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_NodeAnnouncement_hash(int64_t o) {
+       LDKNodeAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = NodeAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_NodeAnnouncement_eq(int64_t a, int64_t b) {
        LDKNodeAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44046,6 +48836,16 @@ int64_t  CS_LDK_UnsignedChannelAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UnsignedChannelAnnouncement_hash(int64_t o) {
+       LDKUnsignedChannelAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UnsignedChannelAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UnsignedChannelAnnouncement_eq(int64_t a, int64_t b) {
        LDKUnsignedChannelAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44243,6 +49043,16 @@ int64_t  CS_LDK_ChannelAnnouncement_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelAnnouncement_hash(int64_t o) {
+       LDKChannelAnnouncement o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelAnnouncement_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelAnnouncement_eq(int64_t a, int64_t b) {
        LDKChannelAnnouncement a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44512,6 +49322,16 @@ int64_t  CS_LDK_UnsignedChannelUpdate_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_UnsignedChannelUpdate_hash(int64_t o) {
+       LDKUnsignedChannelUpdate o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = UnsignedChannelUpdate_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_UnsignedChannelUpdate_eq(int64_t a, int64_t b) {
        LDKUnsignedChannelUpdate a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44631,6 +49451,16 @@ int64_t  CS_LDK_ChannelUpdate_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ChannelUpdate_hash(int64_t o) {
+       LDKChannelUpdate o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelUpdate_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ChannelUpdate_eq(int64_t a, int64_t b) {
        LDKChannelUpdate a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44756,6 +49586,16 @@ int64_t  CS_LDK_QueryChannelRange_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_QueryChannelRange_hash(int64_t o) {
+       LDKQueryChannelRange o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = QueryChannelRange_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_QueryChannelRange_eq(int64_t a, int64_t b) {
        LDKQueryChannelRange a_conv;
        a_conv.inner = untag_ptr(a);
@@ -44952,6 +49792,16 @@ int64_t  CS_LDK_ReplyChannelRange_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ReplyChannelRange_hash(int64_t o) {
+       LDKReplyChannelRange o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ReplyChannelRange_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ReplyChannelRange_eq(int64_t a, int64_t b) {
        LDKReplyChannelRange a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45091,6 +49941,16 @@ int64_t  CS_LDK_QueryShortChannelIds_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_QueryShortChannelIds_hash(int64_t o) {
+       LDKQueryShortChannelIds o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = QueryShortChannelIds_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_QueryShortChannelIds_eq(int64_t a, int64_t b) {
        LDKQueryShortChannelIds a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45197,6 +50057,16 @@ int64_t  CS_LDK_ReplyShortChannelIdsEnd_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_ReplyShortChannelIdsEnd_hash(int64_t o) {
+       LDKReplyShortChannelIdsEnd o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ReplyShortChannelIdsEnd_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_ReplyShortChannelIdsEnd_eq(int64_t a, int64_t b) {
        LDKReplyShortChannelIdsEnd a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45322,6 +50192,16 @@ int64_t  CS_LDK_GossipTimestampFilter_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_GossipTimestampFilter_hash(int64_t o) {
+       LDKGossipTimestampFilter o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = GossipTimestampFilter_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_GossipTimestampFilter_eq(int64_t a, int64_t b) {
        LDKGossipTimestampFilter a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45437,6 +50317,12 @@ int64_t  CS_LDK_ErrorAction_send_warning_message(int64_t msg, int32_t log_level)
        return ret_ref;
 }
 
+int64_t  CS_LDK_ErrorAction_hash(int64_t o) {
+       LDKErrorAction* o_conv = (LDKErrorAction*)untag_ptr(o);
+       int64_t ret_conv = ErrorAction_hash(o_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_LightningError_free(int64_t this_obj) {
        LDKLightningError this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -45905,6 +50791,16 @@ int64_t  CS_LDK_CommitmentUpdate_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_CommitmentUpdate_hash(int64_t o) {
+       LDKCommitmentUpdate o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = CommitmentUpdate_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_CommitmentUpdate_eq(int64_t a, int64_t b) {
        LDKCommitmentUpdate a_conv;
        a_conv.inner = untag_ptr(a);
@@ -45947,6 +50843,226 @@ void  CS_LDK_OnionMessageHandler_free(int64_t this_ptr) {
        OnionMessageHandler_free(this_ptr_conv);
 }
 
+void  CS_LDK_FinalOnionHopData_free(int64_t this_obj) {
+       LDKFinalOnionHopData this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       FinalOnionHopData_free(this_obj_conv);
+}
+
+int8_tArray  CS_LDK_FinalOnionHopData_get_payment_secret(int64_t this_ptr) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *FinalOnionHopData_get_payment_secret(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_FinalOnionHopData_set_payment_secret(int64_t this_ptr, int8_tArray val) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       FinalOnionHopData_set_payment_secret(&this_ptr_conv, val_ref);
+}
+
+int64_t  CS_LDK_FinalOnionHopData_get_total_msat(int64_t this_ptr) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = FinalOnionHopData_get_total_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_FinalOnionHopData_set_total_msat(int64_t this_ptr, int64_t val) {
+       LDKFinalOnionHopData this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       FinalOnionHopData_set_total_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_FinalOnionHopData_new(int8_tArray payment_secret_arg, int64_t total_msat_arg) {
+       LDKThirtyTwoBytes payment_secret_arg_ref;
+       CHECK(payment_secret_arg->arr_len == 32);
+       memcpy(payment_secret_arg_ref.data, payment_secret_arg->elems, 32); FREE(payment_secret_arg);
+       LDKFinalOnionHopData ret_var = FinalOnionHopData_new(payment_secret_arg_ref, total_msat_arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+static inline uint64_t FinalOnionHopData_clone_ptr(LDKFinalOnionHopData *NONNULL_PTR arg) {
+       LDKFinalOnionHopData ret_var = FinalOnionHopData_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_FinalOnionHopData_clone_ptr(int64_t arg) {
+       LDKFinalOnionHopData arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = FinalOnionHopData_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FinalOnionHopData_clone(int64_t orig) {
+       LDKFinalOnionHopData orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKFinalOnionHopData ret_var = FinalOnionHopData_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_OnionPacket_free(int64_t this_obj) {
+       LDKOnionPacket this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       OnionPacket_free(this_obj_conv);
+}
+
+int8_t  CS_LDK_OnionPacket_get_version(int64_t this_ptr) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_t ret_conv = OnionPacket_get_version(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_OnionPacket_set_version(int64_t this_ptr, int8_t val) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       OnionPacket_set_version(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_OnionPacket_get_public_key(int64_t this_ptr) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCResult_PublicKeySecp256k1ErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_PublicKeySecp256k1ErrorZ), "LDKCResult_PublicKeySecp256k1ErrorZ");
+       *ret_conv = OnionPacket_get_public_key(&this_ptr_conv);
+       return tag_ptr(ret_conv, true);
+}
+
+void  CS_LDK_OnionPacket_set_public_key(int64_t this_ptr, int64_t val) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCResult_PublicKeySecp256k1ErrorZ val_conv = *(LDKCResult_PublicKeySecp256k1ErrorZ*)(val_ptr);
+       val_conv = CResult_PublicKeySecp256k1ErrorZ_clone((LDKCResult_PublicKeySecp256k1ErrorZ*)untag_ptr(val));
+       OnionPacket_set_public_key(&this_ptr_conv, val_conv);
+}
+
+int8_tArray  CS_LDK_OnionPacket_get_hmac(int64_t this_ptr) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *OnionPacket_get_hmac(&this_ptr_conv), 32);
+       return ret_arr;
+}
+
+void  CS_LDK_OnionPacket_set_hmac(int64_t this_ptr, int8_tArray val) {
+       LDKOnionPacket this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKThirtyTwoBytes val_ref;
+       CHECK(val->arr_len == 32);
+       memcpy(val_ref.data, val->elems, 32); FREE(val);
+       OnionPacket_set_hmac(&this_ptr_conv, val_ref);
+}
+
+static inline uint64_t OnionPacket_clone_ptr(LDKOnionPacket *NONNULL_PTR arg) {
+       LDKOnionPacket ret_var = OnionPacket_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_OnionPacket_clone_ptr(int64_t arg) {
+       LDKOnionPacket arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = OnionPacket_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OnionPacket_clone(int64_t orig) {
+       LDKOnionPacket orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKOnionPacket ret_var = OnionPacket_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_OnionPacket_hash(int64_t o) {
+       LDKOnionPacket o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OnionPacket_hash(&o_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_OnionPacket_eq(int64_t a, int64_t b) {
+       LDKOnionPacket a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv.is_owned = false;
+       LDKOnionPacket b_conv;
+       b_conv.inner = untag_ptr(b);
+       b_conv.is_owned = ptr_is_owned(b);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(b_conv);
+       b_conv.is_owned = false;
+       jboolean ret_conv = OnionPacket_eq(&a_conv, &b_conv);
+       return ret_conv;
+}
+
 int8_tArray  CS_LDK_AcceptChannel_write(int64_t obj) {
        LDKAcceptChannel obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -45993,6 +51109,98 @@ int64_t  CS_LDK_AcceptChannelV2_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+int8_tArray  CS_LDK_Stfu_write(int64_t obj) {
+       LDKStfu obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = Stfu_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Stfu_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_StfuDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_StfuDecodeErrorZ), "LDKCResult_StfuDecodeErrorZ");
+       *ret_conv = Stfu_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_Splice_write(int64_t obj) {
+       LDKSplice obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = Splice_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_Splice_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpliceDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceDecodeErrorZ), "LDKCResult_SpliceDecodeErrorZ");
+       *ret_conv = Splice_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_SpliceAck_write(int64_t obj) {
+       LDKSpliceAck obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = SpliceAck_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SpliceAck_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpliceAckDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceAckDecodeErrorZ), "LDKCResult_SpliceAckDecodeErrorZ");
+       *ret_conv = SpliceAck_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
+int8_tArray  CS_LDK_SpliceLocked_write(int64_t obj) {
+       LDKSpliceLocked obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = SpliceLocked_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_SpliceLocked_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_SpliceLockedDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SpliceLockedDecodeErrorZ), "LDKCResult_SpliceLockedDecodeErrorZ");
+       *ret_conv = SpliceLocked_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_TxAddInput_write(int64_t obj) {
        LDKTxAddInput obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -46591,6 +51799,29 @@ int64_t  CS_LDK_UpdateFulfillHTLC_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+int8_tArray  CS_LDK_OnionPacket_write(int64_t obj) {
+       LDKOnionPacket obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = OnionPacket_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_OnionPacket_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_OnionPacketDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_OnionPacketDecodeErrorZ), "LDKCResult_OnionPacketDecodeErrorZ");
+       *ret_conv = OnionPacket_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_UpdateAddHTLC_write(int64_t obj) {
        LDKUpdateAddHTLC obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -46637,6 +51868,29 @@ int8_tArray  CS_LDK_OnionMessage_write(int64_t obj) {
        return ret_arr;
 }
 
+int8_tArray  CS_LDK_FinalOnionHopData_write(int64_t obj) {
+       LDKFinalOnionHopData obj_conv;
+       obj_conv.inner = untag_ptr(obj);
+       obj_conv.is_owned = ptr_is_owned(obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(obj_conv);
+       obj_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = FinalOnionHopData_write(&obj_conv);
+       int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
+       memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
+       return ret_arr;
+}
+
+int64_t  CS_LDK_FinalOnionHopData_read(int8_tArray ser) {
+       LDKu8slice ser_ref;
+       ser_ref.datalen = ser->arr_len;
+       ser_ref.data = ser->elems;
+       LDKCResult_FinalOnionHopDataDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_FinalOnionHopDataDecodeErrorZ), "LDKCResult_FinalOnionHopDataDecodeErrorZ");
+       *ret_conv = FinalOnionHopData_read(ser_ref);
+       FREE(ser);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_Ping_write(int64_t obj) {
        LDKPing obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -47017,6 +52271,17 @@ int64_t  CS_LDK_IgnoringMessageHandler_new() {
        return ret_ref;
 }
 
+int64_t  CS_LDK_IgnoringMessageHandler_as_EventsProvider(int64_t this_arg) {
+       LDKIgnoringMessageHandler this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKEventsProvider* ret_ret = MALLOC(sizeof(LDKEventsProvider), "LDKEventsProvider");
+       *ret_ret = IgnoringMessageHandler_as_EventsProvider(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
 int64_t  CS_LDK_IgnoringMessageHandler_as_MessageSendEventsProvider(int64_t this_arg) {
        LDKIgnoringMessageHandler this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -47797,18 +53062,6 @@ int8_tArray  CS_LDK_derive_private_key(int8_tArray per_commitment_point, int8_tA
        return ret_arr;
 }
 
-int8_tArray  CS_LDK_derive_public_key(int8_tArray per_commitment_point, int8_tArray base_point) {
-       LDKPublicKey per_commitment_point_ref;
-       CHECK(per_commitment_point->arr_len == 33);
-       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
-       LDKPublicKey base_point_ref;
-       CHECK(base_point->arr_len == 33);
-       memcpy(base_point_ref.compressed_form, base_point->elems, 33); FREE(base_point);
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, derive_public_key(per_commitment_point_ref, base_point_ref).compressed_form, 33);
-       return ret_arr;
-}
-
 int8_tArray  CS_LDK_derive_private_revocation_key(int8_tArray per_commitment_secret, int8_tArray countersignatory_revocation_base_secret) {
        uint8_t per_commitment_secret_arr[32];
        CHECK(per_commitment_secret->arr_len == 32);
@@ -47823,18 +53076,6 @@ int8_tArray  CS_LDK_derive_private_revocation_key(int8_tArray per_commitment_sec
        return ret_arr;
 }
 
-int8_tArray  CS_LDK_derive_public_revocation_key(int8_tArray per_commitment_point, int8_tArray countersignatory_revocation_base_point) {
-       LDKPublicKey per_commitment_point_ref;
-       CHECK(per_commitment_point->arr_len == 33);
-       memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
-       LDKPublicKey countersignatory_revocation_base_point_ref;
-       CHECK(countersignatory_revocation_base_point->arr_len == 33);
-       memcpy(countersignatory_revocation_base_point_ref.compressed_form, countersignatory_revocation_base_point->elems, 33); FREE(countersignatory_revocation_base_point);
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, derive_public_revocation_key(per_commitment_point_ref, countersignatory_revocation_base_point_ref).compressed_form, 33);
-       return ret_arr;
-}
-
 void  CS_LDK_TxCreationKeys_free(int64_t this_obj) {
        LDKTxCreationKeys this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -47866,115 +53107,139 @@ void  CS_LDK_TxCreationKeys_set_per_commitment_point(int64_t this_ptr, int8_tArr
        TxCreationKeys_set_per_commitment_point(&this_ptr_conv, val_ref);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_revocation_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_revocation_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_revocation_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKRevocationKey ret_var = TxCreationKeys_get_revocation_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_revocation_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_revocation_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_revocation_key(&this_ptr_conv, val_ref);
+       LDKRevocationKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = RevocationKey_clone(&val_conv);
+       TxCreationKeys_set_revocation_key(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_broadcaster_htlc_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_broadcaster_htlc_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_broadcaster_htlc_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKHtlcKey ret_var = TxCreationKeys_get_broadcaster_htlc_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_broadcaster_htlc_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_broadcaster_htlc_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_broadcaster_htlc_key(&this_ptr_conv, val_ref);
+       LDKHtlcKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = HtlcKey_clone(&val_conv);
+       TxCreationKeys_set_broadcaster_htlc_key(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_countersignatory_htlc_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_countersignatory_htlc_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_countersignatory_htlc_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKHtlcKey ret_var = TxCreationKeys_get_countersignatory_htlc_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_countersignatory_htlc_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_countersignatory_htlc_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_countersignatory_htlc_key(&this_ptr_conv, val_ref);
+       LDKHtlcKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = HtlcKey_clone(&val_conv);
+       TxCreationKeys_set_countersignatory_htlc_key(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_TxCreationKeys_get_broadcaster_delayed_payment_key(int64_t this_ptr) {
+int64_t  CS_LDK_TxCreationKeys_get_broadcaster_delayed_payment_key(int64_t this_ptr) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, TxCreationKeys_get_broadcaster_delayed_payment_key(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKDelayedPaymentKey ret_var = TxCreationKeys_get_broadcaster_delayed_payment_key(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key(int64_t this_ptr, int64_t val) {
        LDKTxCreationKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       TxCreationKeys_set_broadcaster_delayed_payment_key(&this_ptr_conv, val_ref);
+       LDKDelayedPaymentKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = DelayedPaymentKey_clone(&val_conv);
+       TxCreationKeys_set_broadcaster_delayed_payment_key(&this_ptr_conv, val_conv);
 }
 
-int64_t  CS_LDK_TxCreationKeys_new(int8_tArray per_commitment_point_arg, int8_tArray revocation_key_arg, int8_tArray broadcaster_htlc_key_arg, int8_tArray countersignatory_htlc_key_arg, int8_tArray broadcaster_delayed_payment_key_arg) {
+int64_t  CS_LDK_TxCreationKeys_new(int8_tArray per_commitment_point_arg, int64_t revocation_key_arg, int64_t broadcaster_htlc_key_arg, int64_t countersignatory_htlc_key_arg, int64_t broadcaster_delayed_payment_key_arg) {
        LDKPublicKey per_commitment_point_arg_ref;
        CHECK(per_commitment_point_arg->arr_len == 33);
        memcpy(per_commitment_point_arg_ref.compressed_form, per_commitment_point_arg->elems, 33); FREE(per_commitment_point_arg);
-       LDKPublicKey revocation_key_arg_ref;
-       CHECK(revocation_key_arg->arr_len == 33);
-       memcpy(revocation_key_arg_ref.compressed_form, revocation_key_arg->elems, 33); FREE(revocation_key_arg);
-       LDKPublicKey broadcaster_htlc_key_arg_ref;
-       CHECK(broadcaster_htlc_key_arg->arr_len == 33);
-       memcpy(broadcaster_htlc_key_arg_ref.compressed_form, broadcaster_htlc_key_arg->elems, 33); FREE(broadcaster_htlc_key_arg);
-       LDKPublicKey countersignatory_htlc_key_arg_ref;
-       CHECK(countersignatory_htlc_key_arg->arr_len == 33);
-       memcpy(countersignatory_htlc_key_arg_ref.compressed_form, countersignatory_htlc_key_arg->elems, 33); FREE(countersignatory_htlc_key_arg);
-       LDKPublicKey broadcaster_delayed_payment_key_arg_ref;
-       CHECK(broadcaster_delayed_payment_key_arg->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_key_arg_ref.compressed_form, broadcaster_delayed_payment_key_arg->elems, 33); FREE(broadcaster_delayed_payment_key_arg);
-       LDKTxCreationKeys ret_var = TxCreationKeys_new(per_commitment_point_arg_ref, revocation_key_arg_ref, broadcaster_htlc_key_arg_ref, countersignatory_htlc_key_arg_ref, broadcaster_delayed_payment_key_arg_ref);
+       LDKRevocationKey revocation_key_arg_conv;
+       revocation_key_arg_conv.inner = untag_ptr(revocation_key_arg);
+       revocation_key_arg_conv.is_owned = ptr_is_owned(revocation_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_key_arg_conv);
+       revocation_key_arg_conv = RevocationKey_clone(&revocation_key_arg_conv);
+       LDKHtlcKey broadcaster_htlc_key_arg_conv;
+       broadcaster_htlc_key_arg_conv.inner = untag_ptr(broadcaster_htlc_key_arg);
+       broadcaster_htlc_key_arg_conv.is_owned = ptr_is_owned(broadcaster_htlc_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_htlc_key_arg_conv);
+       broadcaster_htlc_key_arg_conv = HtlcKey_clone(&broadcaster_htlc_key_arg_conv);
+       LDKHtlcKey countersignatory_htlc_key_arg_conv;
+       countersignatory_htlc_key_arg_conv.inner = untag_ptr(countersignatory_htlc_key_arg);
+       countersignatory_htlc_key_arg_conv.is_owned = ptr_is_owned(countersignatory_htlc_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_htlc_key_arg_conv);
+       countersignatory_htlc_key_arg_conv = HtlcKey_clone(&countersignatory_htlc_key_arg_conv);
+       LDKDelayedPaymentKey broadcaster_delayed_payment_key_arg_conv;
+       broadcaster_delayed_payment_key_arg_conv.inner = untag_ptr(broadcaster_delayed_payment_key_arg);
+       broadcaster_delayed_payment_key_arg_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_key_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_key_arg_conv);
+       broadcaster_delayed_payment_key_arg_conv = DelayedPaymentKey_clone(&broadcaster_delayed_payment_key_arg_conv);
+       LDKTxCreationKeys ret_var = TxCreationKeys_new(per_commitment_point_arg_ref, revocation_key_arg_conv, broadcaster_htlc_key_arg_conv, countersignatory_htlc_key_arg_conv, broadcaster_delayed_payment_key_arg_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -48080,27 +53345,31 @@ void  CS_LDK_ChannelPublicKeys_set_funding_pubkey(int64_t this_ptr, int8_tArray
        ChannelPublicKeys_set_funding_pubkey(&this_ptr_conv, val_ref);
 }
 
-int8_tArray  CS_LDK_ChannelPublicKeys_get_revocation_basepoint(int64_t this_ptr) {
+int64_t  CS_LDK_ChannelPublicKeys_get_revocation_basepoint(int64_t this_ptr) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, ChannelPublicKeys_get_revocation_basepoint(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKRevocationBasepoint ret_var = ChannelPublicKeys_get_revocation_basepoint(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_ChannelPublicKeys_set_revocation_basepoint(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_ChannelPublicKeys_set_revocation_basepoint(int64_t this_ptr, int64_t val) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       ChannelPublicKeys_set_revocation_basepoint(&this_ptr_conv, val_ref);
+       LDKRevocationBasepoint val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = RevocationBasepoint_clone(&val_conv);
+       ChannelPublicKeys_set_revocation_basepoint(&this_ptr_conv, val_conv);
 }
 
 int8_tArray  CS_LDK_ChannelPublicKeys_get_payment_point(int64_t this_ptr) {
@@ -48126,69 +53395,83 @@ void  CS_LDK_ChannelPublicKeys_set_payment_point(int64_t this_ptr, int8_tArray v
        ChannelPublicKeys_set_payment_point(&this_ptr_conv, val_ref);
 }
 
-int8_tArray  CS_LDK_ChannelPublicKeys_get_delayed_payment_basepoint(int64_t this_ptr) {
+int64_t  CS_LDK_ChannelPublicKeys_get_delayed_payment_basepoint(int64_t this_ptr) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, ChannelPublicKeys_get_delayed_payment_basepoint(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKDelayedPaymentBasepoint ret_var = ChannelPublicKeys_get_delayed_payment_basepoint(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint(int64_t this_ptr, int64_t val) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       ChannelPublicKeys_set_delayed_payment_basepoint(&this_ptr_conv, val_ref);
+       LDKDelayedPaymentBasepoint val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = DelayedPaymentBasepoint_clone(&val_conv);
+       ChannelPublicKeys_set_delayed_payment_basepoint(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_ChannelPublicKeys_get_htlc_basepoint(int64_t this_ptr) {
+int64_t  CS_LDK_ChannelPublicKeys_get_htlc_basepoint(int64_t this_ptr) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, ChannelPublicKeys_get_htlc_basepoint(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKHtlcBasepoint ret_var = ChannelPublicKeys_get_htlc_basepoint(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_ChannelPublicKeys_set_htlc_basepoint(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_ChannelPublicKeys_set_htlc_basepoint(int64_t this_ptr, int64_t val) {
        LDKChannelPublicKeys this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       ChannelPublicKeys_set_htlc_basepoint(&this_ptr_conv, val_ref);
+       LDKHtlcBasepoint val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = HtlcBasepoint_clone(&val_conv);
+       ChannelPublicKeys_set_htlc_basepoint(&this_ptr_conv, val_conv);
 }
 
-int64_t  CS_LDK_ChannelPublicKeys_new(int8_tArray funding_pubkey_arg, int8_tArray revocation_basepoint_arg, int8_tArray payment_point_arg, int8_tArray delayed_payment_basepoint_arg, int8_tArray htlc_basepoint_arg) {
+int64_t  CS_LDK_ChannelPublicKeys_new(int8_tArray funding_pubkey_arg, int64_t revocation_basepoint_arg, int8_tArray payment_point_arg, int64_t delayed_payment_basepoint_arg, int64_t htlc_basepoint_arg) {
        LDKPublicKey funding_pubkey_arg_ref;
        CHECK(funding_pubkey_arg->arr_len == 33);
        memcpy(funding_pubkey_arg_ref.compressed_form, funding_pubkey_arg->elems, 33); FREE(funding_pubkey_arg);
-       LDKPublicKey revocation_basepoint_arg_ref;
-       CHECK(revocation_basepoint_arg->arr_len == 33);
-       memcpy(revocation_basepoint_arg_ref.compressed_form, revocation_basepoint_arg->elems, 33); FREE(revocation_basepoint_arg);
+       LDKRevocationBasepoint revocation_basepoint_arg_conv;
+       revocation_basepoint_arg_conv.inner = untag_ptr(revocation_basepoint_arg);
+       revocation_basepoint_arg_conv.is_owned = ptr_is_owned(revocation_basepoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_basepoint_arg_conv);
+       revocation_basepoint_arg_conv = RevocationBasepoint_clone(&revocation_basepoint_arg_conv);
        LDKPublicKey payment_point_arg_ref;
        CHECK(payment_point_arg->arr_len == 33);
        memcpy(payment_point_arg_ref.compressed_form, payment_point_arg->elems, 33); FREE(payment_point_arg);
-       LDKPublicKey delayed_payment_basepoint_arg_ref;
-       CHECK(delayed_payment_basepoint_arg->arr_len == 33);
-       memcpy(delayed_payment_basepoint_arg_ref.compressed_form, delayed_payment_basepoint_arg->elems, 33); FREE(delayed_payment_basepoint_arg);
-       LDKPublicKey htlc_basepoint_arg_ref;
-       CHECK(htlc_basepoint_arg->arr_len == 33);
-       memcpy(htlc_basepoint_arg_ref.compressed_form, htlc_basepoint_arg->elems, 33); FREE(htlc_basepoint_arg);
-       LDKChannelPublicKeys ret_var = ChannelPublicKeys_new(funding_pubkey_arg_ref, revocation_basepoint_arg_ref, payment_point_arg_ref, delayed_payment_basepoint_arg_ref, htlc_basepoint_arg_ref);
+       LDKDelayedPaymentBasepoint delayed_payment_basepoint_arg_conv;
+       delayed_payment_basepoint_arg_conv.inner = untag_ptr(delayed_payment_basepoint_arg);
+       delayed_payment_basepoint_arg_conv.is_owned = ptr_is_owned(delayed_payment_basepoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(delayed_payment_basepoint_arg_conv);
+       delayed_payment_basepoint_arg_conv = DelayedPaymentBasepoint_clone(&delayed_payment_basepoint_arg_conv);
+       LDKHtlcBasepoint htlc_basepoint_arg_conv;
+       htlc_basepoint_arg_conv.inner = untag_ptr(htlc_basepoint_arg);
+       htlc_basepoint_arg_conv.is_owned = ptr_is_owned(htlc_basepoint_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(htlc_basepoint_arg_conv);
+       htlc_basepoint_arg_conv = HtlcBasepoint_clone(&htlc_basepoint_arg_conv);
+       LDKChannelPublicKeys ret_var = ChannelPublicKeys_new(funding_pubkey_arg_ref, revocation_basepoint_arg_conv, payment_point_arg_ref, delayed_payment_basepoint_arg_conv, htlc_basepoint_arg_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -48273,23 +53556,31 @@ int64_t  CS_LDK_ChannelPublicKeys_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_TxCreationKeys_derive_new(int8_tArray per_commitment_point, int8_tArray broadcaster_delayed_payment_base, int8_tArray broadcaster_htlc_base, int8_tArray countersignatory_revocation_base, int8_tArray countersignatory_htlc_base) {
+int64_t  CS_LDK_TxCreationKeys_derive_new(int8_tArray per_commitment_point, int64_t broadcaster_delayed_payment_base, int64_t broadcaster_htlc_base, int64_t countersignatory_revocation_base, int64_t countersignatory_htlc_base) {
        LDKPublicKey per_commitment_point_ref;
        CHECK(per_commitment_point->arr_len == 33);
        memcpy(per_commitment_point_ref.compressed_form, per_commitment_point->elems, 33); FREE(per_commitment_point);
-       LDKPublicKey broadcaster_delayed_payment_base_ref;
-       CHECK(broadcaster_delayed_payment_base->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_base_ref.compressed_form, broadcaster_delayed_payment_base->elems, 33); FREE(broadcaster_delayed_payment_base);
-       LDKPublicKey broadcaster_htlc_base_ref;
-       CHECK(broadcaster_htlc_base->arr_len == 33);
-       memcpy(broadcaster_htlc_base_ref.compressed_form, broadcaster_htlc_base->elems, 33); FREE(broadcaster_htlc_base);
-       LDKPublicKey countersignatory_revocation_base_ref;
-       CHECK(countersignatory_revocation_base->arr_len == 33);
-       memcpy(countersignatory_revocation_base_ref.compressed_form, countersignatory_revocation_base->elems, 33); FREE(countersignatory_revocation_base);
-       LDKPublicKey countersignatory_htlc_base_ref;
-       CHECK(countersignatory_htlc_base->arr_len == 33);
-       memcpy(countersignatory_htlc_base_ref.compressed_form, countersignatory_htlc_base->elems, 33); FREE(countersignatory_htlc_base);
-       LDKTxCreationKeys ret_var = TxCreationKeys_derive_new(per_commitment_point_ref, broadcaster_delayed_payment_base_ref, broadcaster_htlc_base_ref, countersignatory_revocation_base_ref, countersignatory_htlc_base_ref);
+       LDKDelayedPaymentBasepoint broadcaster_delayed_payment_base_conv;
+       broadcaster_delayed_payment_base_conv.inner = untag_ptr(broadcaster_delayed_payment_base);
+       broadcaster_delayed_payment_base_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_base_conv);
+       broadcaster_delayed_payment_base_conv.is_owned = false;
+       LDKHtlcBasepoint broadcaster_htlc_base_conv;
+       broadcaster_htlc_base_conv.inner = untag_ptr(broadcaster_htlc_base);
+       broadcaster_htlc_base_conv.is_owned = ptr_is_owned(broadcaster_htlc_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_htlc_base_conv);
+       broadcaster_htlc_base_conv.is_owned = false;
+       LDKRevocationBasepoint countersignatory_revocation_base_conv;
+       countersignatory_revocation_base_conv.inner = untag_ptr(countersignatory_revocation_base);
+       countersignatory_revocation_base_conv.is_owned = ptr_is_owned(countersignatory_revocation_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_revocation_base_conv);
+       countersignatory_revocation_base_conv.is_owned = false;
+       LDKHtlcBasepoint countersignatory_htlc_base_conv;
+       countersignatory_htlc_base_conv.inner = untag_ptr(countersignatory_htlc_base);
+       countersignatory_htlc_base_conv.is_owned = ptr_is_owned(countersignatory_htlc_base);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(countersignatory_htlc_base_conv);
+       countersignatory_htlc_base_conv.is_owned = false;
+       LDKTxCreationKeys ret_var = TxCreationKeys_derive_new(per_commitment_point_ref, &broadcaster_delayed_payment_base_conv, &broadcaster_htlc_base_conv, &countersignatory_revocation_base_conv, &countersignatory_htlc_base_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -48317,14 +53608,18 @@ int64_t  CS_LDK_TxCreationKeys_from_channel_static_keys(int8_tArray per_commitme
        return ret_ref;
 }
 
-int8_tArray  CS_LDK_get_revokeable_redeemscript(int8_tArray revocation_key, int16_t contest_delay, int8_tArray broadcaster_delayed_payment_key) {
-       LDKPublicKey revocation_key_ref;
-       CHECK(revocation_key->arr_len == 33);
-       memcpy(revocation_key_ref.compressed_form, revocation_key->elems, 33); FREE(revocation_key);
-       LDKPublicKey broadcaster_delayed_payment_key_ref;
-       CHECK(broadcaster_delayed_payment_key->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_key_ref.compressed_form, broadcaster_delayed_payment_key->elems, 33); FREE(broadcaster_delayed_payment_key);
-       LDKCVec_u8Z ret_var = get_revokeable_redeemscript(revocation_key_ref, contest_delay, broadcaster_delayed_payment_key_ref);
+int8_tArray  CS_LDK_get_revokeable_redeemscript(int64_t revocation_key, int16_t contest_delay, int64_t broadcaster_delayed_payment_key) {
+       LDKRevocationKey revocation_key_conv;
+       revocation_key_conv.inner = untag_ptr(revocation_key);
+       revocation_key_conv.is_owned = ptr_is_owned(revocation_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_key_conv);
+       revocation_key_conv.is_owned = false;
+       LDKDelayedPaymentKey broadcaster_delayed_payment_key_conv;
+       broadcaster_delayed_payment_key_conv.inner = untag_ptr(broadcaster_delayed_payment_key);
+       broadcaster_delayed_payment_key_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_key_conv);
+       broadcaster_delayed_payment_key_conv.is_owned = false;
+       LDKCVec_u8Z ret_var = get_revokeable_redeemscript(&revocation_key_conv, contest_delay, &broadcaster_delayed_payment_key_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
        CVec_u8Z_free(ret_var);
@@ -48580,7 +53875,7 @@ int8_tArray  CS_LDK_make_funding_redeemscript(int8_tArray broadcaster, int8_tArr
        return ret_arr;
 }
 
-int8_tArray  CS_LDK_build_htlc_transaction(int8_tArray commitment_txid, int32_t feerate_per_kw, int16_t contest_delay, int64_t htlc, int64_t channel_type_features, int8_tArray broadcaster_delayed_payment_key, int8_tArray revocation_key) {
+int8_tArray  CS_LDK_build_htlc_transaction(int8_tArray commitment_txid, int32_t feerate_per_kw, int16_t contest_delay, int64_t htlc, int64_t channel_type_features, int64_t broadcaster_delayed_payment_key, int64_t revocation_key) {
        uint8_t commitment_txid_arr[32];
        CHECK(commitment_txid->arr_len == 32);
        memcpy(commitment_txid_arr, commitment_txid->elems, 32); FREE(commitment_txid);
@@ -48595,13 +53890,17 @@ int8_tArray  CS_LDK_build_htlc_transaction(int8_tArray commitment_txid, int32_t
        channel_type_features_conv.is_owned = ptr_is_owned(channel_type_features);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_type_features_conv);
        channel_type_features_conv.is_owned = false;
-       LDKPublicKey broadcaster_delayed_payment_key_ref;
-       CHECK(broadcaster_delayed_payment_key->arr_len == 33);
-       memcpy(broadcaster_delayed_payment_key_ref.compressed_form, broadcaster_delayed_payment_key->elems, 33); FREE(broadcaster_delayed_payment_key);
-       LDKPublicKey revocation_key_ref;
-       CHECK(revocation_key->arr_len == 33);
-       memcpy(revocation_key_ref.compressed_form, revocation_key->elems, 33); FREE(revocation_key);
-       LDKTransaction ret_var = build_htlc_transaction(commitment_txid_ref, feerate_per_kw, contest_delay, &htlc_conv, &channel_type_features_conv, broadcaster_delayed_payment_key_ref, revocation_key_ref);
+       LDKDelayedPaymentKey broadcaster_delayed_payment_key_conv;
+       broadcaster_delayed_payment_key_conv.inner = untag_ptr(broadcaster_delayed_payment_key);
+       broadcaster_delayed_payment_key_conv.is_owned = ptr_is_owned(broadcaster_delayed_payment_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(broadcaster_delayed_payment_key_conv);
+       broadcaster_delayed_payment_key_conv.is_owned = false;
+       LDKRevocationKey revocation_key_conv;
+       revocation_key_conv.inner = untag_ptr(revocation_key);
+       revocation_key_conv.is_owned = ptr_is_owned(revocation_key);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_key_conv);
+       revocation_key_conv.is_owned = false;
+       LDKTransaction ret_var = build_htlc_transaction(commitment_txid_ref, feerate_per_kw, contest_delay, &htlc_conv, &channel_type_features_conv, &broadcaster_delayed_payment_key_conv, &revocation_key_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
        Transaction_free(ret_var);
@@ -50427,6 +55726,96 @@ int64_t  CS_LDK_ChannelTypeFeatures_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_InitFeatures_hash(int64_t o) {
+       LDKInitFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = InitFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_NodeFeatures_hash(int64_t o) {
+       LDKNodeFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = NodeFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelFeatures_hash(int64_t o) {
+       LDKChannelFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt11InvoiceFeatures_hash(int64_t o) {
+       LDKBolt11InvoiceFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Bolt11InvoiceFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OfferFeatures_hash(int64_t o) {
+       LDKOfferFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = OfferFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_InvoiceRequestFeatures_hash(int64_t o) {
+       LDKInvoiceRequestFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = InvoiceRequestFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_Bolt12InvoiceFeatures_hash(int64_t o) {
+       LDKBolt12InvoiceFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Bolt12InvoiceFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedHopFeatures_hash(int64_t o) {
+       LDKBlindedHopFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = BlindedHopFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_ChannelTypeFeatures_hash(int64_t o) {
+       LDKChannelTypeFeatures o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = ChannelTypeFeatures_hash(&o_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_InitFeatures_free(int64_t this_obj) {
        LDKInitFeatures this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -52407,6 +57796,82 @@ jboolean  CS_LDK_ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(int64_t t
        return ret_conv;
 }
 
+void  CS_LDK_InitFeatures_set_route_blinding_optional(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       InitFeatures_set_route_blinding_optional(&this_arg_conv);
+}
+
+void  CS_LDK_InitFeatures_set_route_blinding_required(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       InitFeatures_set_route_blinding_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_InitFeatures_supports_route_blinding(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = InitFeatures_supports_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_NodeFeatures_set_route_blinding_optional(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       NodeFeatures_set_route_blinding_optional(&this_arg_conv);
+}
+
+void  CS_LDK_NodeFeatures_set_route_blinding_required(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       NodeFeatures_set_route_blinding_required(&this_arg_conv);
+}
+
+jboolean  CS_LDK_NodeFeatures_supports_route_blinding(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = NodeFeatures_supports_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_InitFeatures_requires_route_blinding(int64_t this_arg) {
+       LDKInitFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = InitFeatures_requires_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
+jboolean  CS_LDK_NodeFeatures_requires_route_blinding(int64_t this_arg) {
+       LDKNodeFeatures this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = NodeFeatures_requires_route_blinding(&this_arg_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_InitFeatures_set_shutdown_any_segwit_optional(int64_t this_arg) {
        LDKInitFeatures this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -53120,9 +58585,10 @@ int8_tArray  CS_LDK_InvalidShutdownScript_get_script(int64_t this_ptr) {
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKu8slice ret_var = InvalidShutdownScript_get_script(&this_ptr_conv);
+       LDKCVec_u8Z ret_var = InvalidShutdownScript_get_script(&this_ptr_conv);
        int8_tArray ret_arr = init_int8_tArray(ret_var.datalen, __LINE__);
        memcpy(ret_arr->elems, ret_var.data, ret_var.datalen);
+       CVec_u8Z_free(ret_var);
        return ret_arr;
 }
 
@@ -53228,14 +58694,13 @@ int64_t  CS_LDK_ShutdownScript_new_p2wsh(int8_tArray script_hash) {
        return ret_ref;
 }
 
-int64_t  CS_LDK_ShutdownScript_new_witness_program(int8_t version, int8_tArray program) {
-       
-       LDKu8slice program_ref;
-       program_ref.datalen = program->arr_len;
-       program_ref.data = program->elems;
+int64_t  CS_LDK_ShutdownScript_new_witness_program(int64_t witness_program) {
+       void* witness_program_ptr = untag_ptr(witness_program);
+       CHECK_ACCESS(witness_program_ptr);
+       LDKWitnessProgram witness_program_conv = *(LDKWitnessProgram*)(witness_program_ptr);
+       witness_program_conv = WitnessProgram_clone((LDKWitnessProgram*)untag_ptr(witness_program));
        LDKCResult_ShutdownScriptInvalidShutdownScriptZ* ret_conv = MALLOC(sizeof(LDKCResult_ShutdownScriptInvalidShutdownScriptZ), "LDKCResult_ShutdownScriptInvalidShutdownScriptZ");
-       *ret_conv = ShutdownScript_new_witness_program((LDKWitnessVersion){ ._0 = version }, program_ref);
-       FREE(program);
+       *ret_conv = ShutdownScript_new_witness_program(witness_program_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -54000,6 +59465,16 @@ jboolean  CS_LDK_Offer_is_expired(int64_t this_arg) {
        return ret_conv;
 }
 
+jboolean  CS_LDK_Offer_is_expired_no_std(int64_t this_arg, int64_t duration_since_epoch) {
+       LDKOffer this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = Offer_is_expired_no_std(&this_arg_conv, duration_since_epoch);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Offer_is_valid_quantity(int64_t this_arg, int64_t quantity) {
        LDKOffer this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -56097,6 +61572,70 @@ void  CS_LDK_TaggedHash_free(int64_t this_obj) {
        TaggedHash_free(this_obj_conv);
 }
 
+static inline uint64_t TaggedHash_clone_ptr(LDKTaggedHash *NONNULL_PTR arg) {
+       LDKTaggedHash ret_var = TaggedHash_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_TaggedHash_clone_ptr(int64_t arg) {
+       LDKTaggedHash arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = TaggedHash_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_TaggedHash_clone(int64_t orig) {
+       LDKTaggedHash orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKTaggedHash ret_var = TaggedHash_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int8_tArray  CS_LDK_TaggedHash_as_digest(int64_t this_arg) {
+       LDKTaggedHash this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, *TaggedHash_as_digest(&this_arg_conv), 32);
+       return ret_arr;
+}
+
+jstring  CS_LDK_TaggedHash_tag(int64_t this_arg) {
+       LDKTaggedHash this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKStr ret_str = TaggedHash_tag(&this_arg_conv);
+       jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
+       Str_free(ret_str);
+       return ret_conv;
+}
+
+int8_tArray  CS_LDK_TaggedHash_merkle_root(int64_t this_arg) {
+       LDKTaggedHash this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(32, __LINE__);
+       memcpy(ret_arr->elems, TaggedHash_merkle_root(&this_arg_conv).data, 32);
+       return ret_arr;
+}
+
 void  CS_LDK_Bolt12ParseError_free(int64_t this_obj) {
        LDKBolt12ParseError this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -56349,6 +61888,16 @@ jboolean  CS_LDK_Refund_is_expired(int64_t this_arg) {
        return ret_conv;
 }
 
+jboolean  CS_LDK_Refund_is_expired_no_std(int64_t this_arg, int64_t duration_since_epoch) {
+       LDKRefund this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       jboolean ret_conv = Refund_is_expired_no_std(&this_arg_conv, duration_since_epoch);
+       return ret_conv;
+}
+
 int64_t  CS_LDK_Refund_issuer(int64_t this_arg) {
        LDKRefund this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -56709,6 +62258,17 @@ int8_tArray  CS_LDK_NodeId_as_slice(int64_t this_arg) {
        return ret_arr;
 }
 
+int8_tArray  CS_LDK_NodeId_as_array(int64_t this_arg) {
+       LDKNodeId this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, *NodeId_as_array(&this_arg_conv), 33);
+       return ret_arr;
+}
+
 int64_t  CS_LDK_NodeId_as_pubkey(int64_t this_arg) {
        LDKNodeId this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -57547,16 +63107,6 @@ int64_t  CS_LDK_DirectedChannelInfo_channel(int64_t this_arg) {
        return ret_ref;
 }
 
-int64_t  CS_LDK_DirectedChannelInfo_htlc_maximum_msat(int64_t this_arg) {
-       LDKDirectedChannelInfo this_arg_conv;
-       this_arg_conv.inner = untag_ptr(this_arg);
-       this_arg_conv.is_owned = ptr_is_owned(this_arg);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
-       this_arg_conv.is_owned = false;
-       int64_t ret_conv = DirectedChannelInfo_htlc_maximum_msat(&this_arg_conv);
-       return ret_conv;
-}
-
 int64_t  CS_LDK_DirectedChannelInfo_effective_capacity(int64_t this_arg) {
        LDKDirectedChannelInfo this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
@@ -58096,6 +63646,16 @@ int64_t  CS_LDK_NodeAlias_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_NodeAlias_hash(int64_t o) {
+       LDKNodeAlias o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = NodeAlias_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_NodeAlias_eq(int64_t a, int64_t b) {
        LDKNodeAlias a_conv;
        a_conv.inner = untag_ptr(a);
@@ -58688,7 +64248,7 @@ void  CS_LDK_DefaultRouter_free(int64_t this_obj) {
        DefaultRouter_free(this_obj_conv);
 }
 
-int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int8_tArray random_seed_bytes, int64_t scorer, int64_t score_params) {
+int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int64_t entropy_source, int64_t scorer, int64_t score_params) {
        LDKNetworkGraph network_graph_conv;
        network_graph_conv.inner = untag_ptr(network_graph);
        network_graph_conv.is_owned = ptr_is_owned(network_graph);
@@ -58701,9 +64261,13 @@ int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int8_tA
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKLogger_JCalls_cloned(&logger_conv);
        }
-       LDKThirtyTwoBytes random_seed_bytes_ref;
-       CHECK(random_seed_bytes->arr_len == 32);
-       memcpy(random_seed_bytes_ref.data, random_seed_bytes->elems, 32); FREE(random_seed_bytes);
+       void* entropy_source_ptr = untag_ptr(entropy_source);
+       CHECK_ACCESS(entropy_source_ptr);
+       LDKEntropySource entropy_source_conv = *(LDKEntropySource*)(entropy_source_ptr);
+       if (entropy_source_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&entropy_source_conv);
+       }
        void* scorer_ptr = untag_ptr(scorer);
        CHECK_ACCESS(scorer_ptr);
        LDKLockableScore scorer_conv = *(LDKLockableScore*)(scorer_ptr);
@@ -58716,7 +64280,7 @@ int64_t  CS_LDK_DefaultRouter_new(int64_t network_graph, int64_t logger, int8_tA
        score_params_conv.is_owned = ptr_is_owned(score_params);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(score_params_conv);
        score_params_conv = ProbabilisticScoringFeeParameters_clone(&score_params_conv);
-       LDKDefaultRouter ret_var = DefaultRouter_new(&network_graph_conv, logger_conv, random_seed_bytes_ref, scorer_conv, score_params_conv);
+       LDKDefaultRouter ret_var = DefaultRouter_new(&network_graph_conv, logger_conv, entropy_source_conv, scorer_conv, score_params_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -58734,6 +64298,17 @@ int64_t  CS_LDK_DefaultRouter_as_Router(int64_t this_arg) {
        return tag_ptr(ret_ret, true);
 }
 
+int64_t  CS_LDK_DefaultRouter_as_MessageRouter(int64_t this_arg) {
+       LDKDefaultRouter this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       LDKMessageRouter* ret_ret = MALLOC(sizeof(LDKMessageRouter), "LDKMessageRouter");
+       *ret_ret = DefaultRouter_as_MessageRouter(&this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
 void  CS_LDK_Router_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -60145,7 +65720,47 @@ void  CS_LDK_PaymentParameters_set_previously_failed_channels(int64_t this_ptr,
        PaymentParameters_set_previously_failed_channels(&this_ptr_conv, val_constr);
 }
 
-int64_t  CS_LDK_PaymentParameters_new(int64_t payee_arg, int64_t expiry_time_arg, int32_t max_total_cltv_expiry_delta_arg, int8_t max_path_count_arg, int8_t max_channel_saturation_power_of_half_arg, int64_tArray previously_failed_channels_arg) {
+int64_tArray  CS_LDK_PaymentParameters_get_previously_failed_blinded_path_idxs(int64_t this_ptr) {
+       LDKPaymentParameters this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u64Z ret_var = PaymentParameters_get_previously_failed_blinded_path_idxs(&this_ptr_conv);
+       int64_tArray ret_arr = NULL;
+       ret_arr = init_int64_tArray(ret_var.datalen, __LINE__);
+       int64_t *ret_arr_ptr = (int64_t*)(((uint8_t*)ret_arr) + 8);
+       for (size_t g = 0; g < ret_var.datalen; g++) {
+               int64_t ret_conv_6_conv = ret_var.data[g];
+               ret_arr_ptr[g] = ret_conv_6_conv;
+       }
+       
+       FREE(ret_var.data);
+       return ret_arr;
+}
+
+void  CS_LDK_PaymentParameters_set_previously_failed_blinded_path_idxs(int64_t this_ptr, int64_tArray val) {
+       LDKPaymentParameters this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCVec_u64Z val_constr;
+       val_constr.datalen = val->arr_len;
+       if (val_constr.datalen > 0)
+               val_constr.data = MALLOC(val_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               val_constr.data = NULL;
+       int64_t* val_vals = val->elems;
+       for (size_t g = 0; g < val_constr.datalen; g++) {
+               int64_t val_conv_6 = val_vals[g];
+               val_constr.data[g] = val_conv_6;
+       }
+       FREE(val);
+       PaymentParameters_set_previously_failed_blinded_path_idxs(&this_ptr_conv, val_constr);
+}
+
+int64_t  CS_LDK_PaymentParameters_new(int64_t payee_arg, int64_t expiry_time_arg, int32_t max_total_cltv_expiry_delta_arg, int8_t max_path_count_arg, int8_t max_channel_saturation_power_of_half_arg, int64_tArray previously_failed_channels_arg, int64_tArray previously_failed_blinded_path_idxs_arg) {
        void* payee_arg_ptr = untag_ptr(payee_arg);
        CHECK_ACCESS(payee_arg_ptr);
        LDKPayee payee_arg_conv = *(LDKPayee*)(payee_arg_ptr);
@@ -60166,7 +65781,19 @@ int64_t  CS_LDK_PaymentParameters_new(int64_t payee_arg, int64_t expiry_time_arg
                previously_failed_channels_arg_constr.data[g] = previously_failed_channels_arg_conv_6;
        }
        FREE(previously_failed_channels_arg);
-       LDKPaymentParameters ret_var = PaymentParameters_new(payee_arg_conv, expiry_time_arg_conv, max_total_cltv_expiry_delta_arg, max_path_count_arg, max_channel_saturation_power_of_half_arg, previously_failed_channels_arg_constr);
+       LDKCVec_u64Z previously_failed_blinded_path_idxs_arg_constr;
+       previously_failed_blinded_path_idxs_arg_constr.datalen = previously_failed_blinded_path_idxs_arg->arr_len;
+       if (previously_failed_blinded_path_idxs_arg_constr.datalen > 0)
+               previously_failed_blinded_path_idxs_arg_constr.data = MALLOC(previously_failed_blinded_path_idxs_arg_constr.datalen * sizeof(int64_t), "LDKCVec_u64Z Elements");
+       else
+               previously_failed_blinded_path_idxs_arg_constr.data = NULL;
+       int64_t* previously_failed_blinded_path_idxs_arg_vals = previously_failed_blinded_path_idxs_arg->elems;
+       for (size_t g = 0; g < previously_failed_blinded_path_idxs_arg_constr.datalen; g++) {
+               int64_t previously_failed_blinded_path_idxs_arg_conv_6 = previously_failed_blinded_path_idxs_arg_vals[g];
+               previously_failed_blinded_path_idxs_arg_constr.data[g] = previously_failed_blinded_path_idxs_arg_conv_6;
+       }
+       FREE(previously_failed_blinded_path_idxs_arg);
+       LDKPaymentParameters ret_var = PaymentParameters_new(payee_arg_conv, expiry_time_arg_conv, max_total_cltv_expiry_delta_arg, max_path_count_arg, max_channel_saturation_power_of_half_arg, previously_failed_channels_arg_constr, previously_failed_blinded_path_idxs_arg_constr);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -60819,6 +66446,351 @@ int64_t  CS_LDK_RouteHintHop_read(int8_tArray ser) {
        return tag_ptr(ret_conv, true);
 }
 
+void  CS_LDK_FirstHopCandidate_free(int64_t this_obj) {
+       LDKFirstHopCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       FirstHopCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t FirstHopCandidate_clone_ptr(LDKFirstHopCandidate *NONNULL_PTR arg) {
+       LDKFirstHopCandidate ret_var = FirstHopCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_FirstHopCandidate_clone_ptr(int64_t arg) {
+       LDKFirstHopCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = FirstHopCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_FirstHopCandidate_clone(int64_t orig) {
+       LDKFirstHopCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKFirstHopCandidate ret_var = FirstHopCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_PublicHopCandidate_free(int64_t this_obj) {
+       LDKPublicHopCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       PublicHopCandidate_free(this_obj_conv);
+}
+
+int64_t  CS_LDK_PublicHopCandidate_get_short_channel_id(int64_t this_ptr) {
+       LDKPublicHopCandidate this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = PublicHopCandidate_get_short_channel_id(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_PublicHopCandidate_set_short_channel_id(int64_t this_ptr, int64_t val) {
+       LDKPublicHopCandidate this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       PublicHopCandidate_set_short_channel_id(&this_ptr_conv, val);
+}
+
+static inline uint64_t PublicHopCandidate_clone_ptr(LDKPublicHopCandidate *NONNULL_PTR arg) {
+       LDKPublicHopCandidate ret_var = PublicHopCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_PublicHopCandidate_clone_ptr(int64_t arg) {
+       LDKPublicHopCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = PublicHopCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PublicHopCandidate_clone(int64_t orig) {
+       LDKPublicHopCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKPublicHopCandidate ret_var = PublicHopCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_PrivateHopCandidate_free(int64_t this_obj) {
+       LDKPrivateHopCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       PrivateHopCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t PrivateHopCandidate_clone_ptr(LDKPrivateHopCandidate *NONNULL_PTR arg) {
+       LDKPrivateHopCandidate ret_var = PrivateHopCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_PrivateHopCandidate_clone_ptr(int64_t arg) {
+       LDKPrivateHopCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = PrivateHopCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_PrivateHopCandidate_clone(int64_t orig) {
+       LDKPrivateHopCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKPrivateHopCandidate ret_var = PrivateHopCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_BlindedPathCandidate_free(int64_t this_obj) {
+       LDKBlindedPathCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       BlindedPathCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t BlindedPathCandidate_clone_ptr(LDKBlindedPathCandidate *NONNULL_PTR arg) {
+       LDKBlindedPathCandidate ret_var = BlindedPathCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_BlindedPathCandidate_clone_ptr(int64_t arg) {
+       LDKBlindedPathCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = BlindedPathCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_BlindedPathCandidate_clone(int64_t orig) {
+       LDKBlindedPathCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKBlindedPathCandidate ret_var = BlindedPathCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_OneHopBlindedPathCandidate_free(int64_t this_obj) {
+       LDKOneHopBlindedPathCandidate this_obj_conv;
+       this_obj_conv.inner = untag_ptr(this_obj);
+       this_obj_conv.is_owned = ptr_is_owned(this_obj);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_obj_conv);
+       OneHopBlindedPathCandidate_free(this_obj_conv);
+}
+
+static inline uint64_t OneHopBlindedPathCandidate_clone_ptr(LDKOneHopBlindedPathCandidate *NONNULL_PTR arg) {
+       LDKOneHopBlindedPathCandidate ret_var = OneHopBlindedPathCandidate_clone(arg);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+int64_t  CS_LDK_OneHopBlindedPathCandidate_clone_ptr(int64_t arg) {
+       LDKOneHopBlindedPathCandidate arg_conv;
+       arg_conv.inner = untag_ptr(arg);
+       arg_conv.is_owned = ptr_is_owned(arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(arg_conv);
+       arg_conv.is_owned = false;
+       int64_t ret_conv = OneHopBlindedPathCandidate_clone_ptr(&arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_OneHopBlindedPathCandidate_clone(int64_t orig) {
+       LDKOneHopBlindedPathCandidate orig_conv;
+       orig_conv.inner = untag_ptr(orig);
+       orig_conv.is_owned = ptr_is_owned(orig);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(orig_conv);
+       orig_conv.is_owned = false;
+       LDKOneHopBlindedPathCandidate ret_var = OneHopBlindedPathCandidate_clone(&orig_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+void  CS_LDK_CandidateRouteHop_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKCandidateRouteHop this_ptr_conv = *(LDKCandidateRouteHop*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       CandidateRouteHop_free(this_ptr_conv);
+}
+
+static inline uint64_t CandidateRouteHop_clone_ptr(LDKCandidateRouteHop *NONNULL_PTR arg) {
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_CandidateRouteHop_clone_ptr(int64_t arg) {
+       LDKCandidateRouteHop* arg_conv = (LDKCandidateRouteHop*)untag_ptr(arg);
+       int64_t ret_conv = CandidateRouteHop_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_clone(int64_t orig) {
+       LDKCandidateRouteHop* orig_conv = (LDKCandidateRouteHop*)untag_ptr(orig);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_first_hop(int64_t a) {
+       LDKFirstHopCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = FirstHopCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_first_hop(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_public_hop(int64_t a) {
+       LDKPublicHopCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = PublicHopCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_public_hop(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_private_hop(int64_t a) {
+       LDKPrivateHopCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = PrivateHopCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_private_hop(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_blinded(int64_t a) {
+       LDKBlindedPathCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = BlindedPathCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_blinded(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_one_hop_blinded(int64_t a) {
+       LDKOneHopBlindedPathCandidate a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = OneHopBlindedPathCandidate_clone(&a_conv);
+       LDKCandidateRouteHop *ret_copy = MALLOC(sizeof(LDKCandidateRouteHop), "LDKCandidateRouteHop");
+       *ret_copy = CandidateRouteHop_one_hop_blinded(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_globally_unique_short_channel_id(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKCOption_u64Z *ret_copy = MALLOC(sizeof(LDKCOption_u64Z), "LDKCOption_u64Z");
+       *ret_copy = CandidateRouteHop_globally_unique_short_channel_id(this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int32_t  CS_LDK_CandidateRouteHop_cltv_expiry_delta(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       int32_t ret_conv = CandidateRouteHop_cltv_expiry_delta(this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_htlc_minimum_msat(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       int64_t ret_conv = CandidateRouteHop_htlc_minimum_msat(this_arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_fees(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKRoutingFees ret_var = CandidateRouteHop_fees(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_source(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKNodeId ret_var = CandidateRouteHop_source(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_CandidateRouteHop_target(int64_t this_arg) {
+       LDKCandidateRouteHop* this_arg_conv = (LDKCandidateRouteHop*)untag_ptr(this_arg);
+       LDKNodeId ret_var = CandidateRouteHop_target(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
 int64_t  CS_LDK_find_route(int8_tArray our_node_pubkey, int64_t route_params, int64_t network_graph, int64_tArray first_hops, int64_t logger, int64_t scorer, int64_t score_params, int8_tArray random_seed_bytes) {
        LDKPublicKey our_node_pubkey_ref;
        CHECK(our_node_pubkey->arr_len == 33);
@@ -61954,27 +67926,31 @@ void  CS_LDK_DelayedPaymentOutputDescriptor_set_output(int64_t this_ptr, int64_t
        DelayedPaymentOutputDescriptor_set_output(&this_ptr_conv, val_conv);
 }
 
-int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_revocation_pubkey(int64_t this_ptr) {
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_get_revocation_pubkey(int64_t this_ptr) {
        LDKDelayedPaymentOutputDescriptor this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
-       memcpy(ret_arr->elems, DelayedPaymentOutputDescriptor_get_revocation_pubkey(&this_ptr_conv).compressed_form, 33);
-       return ret_arr;
+       LDKRevocationKey ret_var = DelayedPaymentOutputDescriptor_get_revocation_pubkey(&this_ptr_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
 }
 
-void  CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey(int64_t this_ptr, int8_tArray val) {
+void  CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey(int64_t this_ptr, int64_t val) {
        LDKDelayedPaymentOutputDescriptor this_ptr_conv;
        this_ptr_conv.inner = untag_ptr(this_ptr);
        this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
        this_ptr_conv.is_owned = false;
-       LDKPublicKey val_ref;
-       CHECK(val->arr_len == 33);
-       memcpy(val_ref.compressed_form, val->elems, 33); FREE(val);
-       DelayedPaymentOutputDescriptor_set_revocation_pubkey(&this_ptr_conv, val_ref);
+       LDKRevocationKey val_conv;
+       val_conv.inner = untag_ptr(val);
+       val_conv.is_owned = ptr_is_owned(val);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(val_conv);
+       val_conv = RevocationKey_clone(&val_conv);
+       DelayedPaymentOutputDescriptor_set_revocation_pubkey(&this_ptr_conv, val_conv);
 }
 
 int8_tArray  CS_LDK_DelayedPaymentOutputDescriptor_get_channel_keys_id(int64_t this_ptr) {
@@ -62019,7 +67995,7 @@ void  CS_LDK_DelayedPaymentOutputDescriptor_set_channel_value_satoshis(int64_t t
        DelayedPaymentOutputDescriptor_set_channel_value_satoshis(&this_ptr_conv, val);
 }
 
-int64_t  CS_LDK_DelayedPaymentOutputDescriptor_new(int64_t outpoint_arg, int8_tArray per_commitment_point_arg, int16_t to_self_delay_arg, int64_t output_arg, int8_tArray revocation_pubkey_arg, int8_tArray channel_keys_id_arg, int64_t channel_value_satoshis_arg) {
+int64_t  CS_LDK_DelayedPaymentOutputDescriptor_new(int64_t outpoint_arg, int8_tArray per_commitment_point_arg, int16_t to_self_delay_arg, int64_t output_arg, int64_t revocation_pubkey_arg, int8_tArray channel_keys_id_arg, int64_t channel_value_satoshis_arg) {
        LDKOutPoint outpoint_arg_conv;
        outpoint_arg_conv.inner = untag_ptr(outpoint_arg);
        outpoint_arg_conv.is_owned = ptr_is_owned(outpoint_arg);
@@ -62032,13 +68008,15 @@ int64_t  CS_LDK_DelayedPaymentOutputDescriptor_new(int64_t outpoint_arg, int8_tA
        CHECK_ACCESS(output_arg_ptr);
        LDKTxOut output_arg_conv = *(LDKTxOut*)(output_arg_ptr);
        output_arg_conv = TxOut_clone((LDKTxOut*)untag_ptr(output_arg));
-       LDKPublicKey revocation_pubkey_arg_ref;
-       CHECK(revocation_pubkey_arg->arr_len == 33);
-       memcpy(revocation_pubkey_arg_ref.compressed_form, revocation_pubkey_arg->elems, 33); FREE(revocation_pubkey_arg);
+       LDKRevocationKey revocation_pubkey_arg_conv;
+       revocation_pubkey_arg_conv.inner = untag_ptr(revocation_pubkey_arg);
+       revocation_pubkey_arg_conv.is_owned = ptr_is_owned(revocation_pubkey_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(revocation_pubkey_arg_conv);
+       revocation_pubkey_arg_conv = RevocationKey_clone(&revocation_pubkey_arg_conv);
        LDKThirtyTwoBytes channel_keys_id_arg_ref;
        CHECK(channel_keys_id_arg->arr_len == 32);
        memcpy(channel_keys_id_arg_ref.data, channel_keys_id_arg->elems, 32); FREE(channel_keys_id_arg);
-       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_new(outpoint_arg_conv, per_commitment_point_arg_ref, to_self_delay_arg, output_arg_conv, revocation_pubkey_arg_ref, channel_keys_id_arg_ref, channel_value_satoshis_arg);
+       LDKDelayedPaymentOutputDescriptor ret_var = DelayedPaymentOutputDescriptor_new(outpoint_arg_conv, per_commitment_point_arg_ref, to_self_delay_arg, output_arg_conv, revocation_pubkey_arg_conv, channel_keys_id_arg_ref, channel_value_satoshis_arg);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -62405,7 +68383,7 @@ int64_t  CS_LDK_SpendableOutputDescriptor_clone(int64_t orig) {
        return ret_ref;
 }
 
-int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_t output) {
+int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_t output, int8_tArray channel_keys_id) {
        LDKOutPoint outpoint_conv;
        outpoint_conv.inner = untag_ptr(outpoint);
        outpoint_conv.is_owned = ptr_is_owned(outpoint);
@@ -62415,8 +68393,11 @@ int64_t  CS_LDK_SpendableOutputDescriptor_static_output(int64_t outpoint, int64_
        CHECK_ACCESS(output_ptr);
        LDKTxOut output_conv = *(LDKTxOut*)(output_ptr);
        output_conv = TxOut_clone((LDKTxOut*)untag_ptr(output));
+       LDKThirtyTwoBytes channel_keys_id_ref;
+       CHECK(channel_keys_id->arr_len == 32);
+       memcpy(channel_keys_id_ref.data, channel_keys_id->elems, 32); FREE(channel_keys_id);
        LDKSpendableOutputDescriptor *ret_copy = MALLOC(sizeof(LDKSpendableOutputDescriptor), "LDKSpendableOutputDescriptor");
-       *ret_copy = SpendableOutputDescriptor_static_output(outpoint_conv, output_conv);
+       *ret_copy = SpendableOutputDescriptor_static_output(outpoint_conv, output_conv, channel_keys_id_ref);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -62518,7 +68499,7 @@ int64_t  CS_LDK_SpendableOutputDescriptor_create_spendable_outputs_psbt(int64_tA
        CHECK_ACCESS(locktime_ptr);
        LDKCOption_u32Z locktime_conv = *(LDKCOption_u32Z*)(locktime_ptr);
        locktime_conv = COption_u32Z_clone((LDKCOption_u32Z*)untag_ptr(locktime));
-       LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ), "LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ");
+       LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ), "LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ");
        *ret_conv = SpendableOutputDescriptor_create_spendable_outputs_psbt(descriptors_constr, outputs_constr, change_destination_script_ref, feerate_sat_per_1000_weight, locktime_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -63025,46 +69006,6 @@ void  CS_LDK_ChannelSigner_free(int64_t this_ptr) {
        ChannelSigner_free(this_ptr_conv);
 }
 
-void  CS_LDK_EcdsaChannelSigner_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKEcdsaChannelSigner this_ptr_conv = *(LDKEcdsaChannelSigner*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       EcdsaChannelSigner_free(this_ptr_conv);
-}
-
-static inline uint64_t WriteableEcdsaChannelSigner_clone_ptr(LDKWriteableEcdsaChannelSigner *NONNULL_PTR arg) {
-       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
-       *ret_ret = WriteableEcdsaChannelSigner_clone(arg);
-       return tag_ptr(ret_ret, true);
-}
-int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone_ptr(int64_t arg) {
-       void* arg_ptr = untag_ptr(arg);
-       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
-       LDKWriteableEcdsaChannelSigner* arg_conv = (LDKWriteableEcdsaChannelSigner*)arg_ptr;
-       int64_t ret_conv = WriteableEcdsaChannelSigner_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone(int64_t orig) {
-       void* orig_ptr = untag_ptr(orig);
-       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
-       LDKWriteableEcdsaChannelSigner* orig_conv = (LDKWriteableEcdsaChannelSigner*)orig_ptr;
-       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
-       *ret_ret = WriteableEcdsaChannelSigner_clone(orig_conv);
-       return tag_ptr(ret_ret, true);
-}
-
-void  CS_LDK_WriteableEcdsaChannelSigner_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKWriteableEcdsaChannelSigner this_ptr_conv = *(LDKWriteableEcdsaChannelSigner*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       WriteableEcdsaChannelSigner_free(this_ptr_conv);
-}
-
 int32_t  CS_LDK_Recipient_clone(int64_t orig) {
        LDKRecipient* orig_conv = (LDKRecipient*)untag_ptr(orig);
        int32_t ret_conv = LDKRecipient_to_cs(Recipient_clone(orig_conv));
@@ -63420,7 +69361,7 @@ int64_t  CS_LDK_InMemorySigner_sign_counterparty_payment_input(int64_t this_arg,
        descriptor_conv.is_owned = ptr_is_owned(descriptor);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(descriptor_conv);
        descriptor_conv.is_owned = false;
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
        *ret_conv = InMemorySigner_sign_counterparty_payment_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -63441,7 +69382,7 @@ int64_t  CS_LDK_InMemorySigner_sign_dynamic_p2wsh_input(int64_t this_arg, int8_t
        descriptor_conv.is_owned = ptr_is_owned(descriptor);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(descriptor_conv);
        descriptor_conv.is_owned = false;
-       LDKCResult_CVec_CVec_u8ZZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_CVec_u8ZZNoneZ), "LDKCResult_CVec_CVec_u8ZZNoneZ");
+       LDKCResult_WitnessNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_WitnessNoneZ), "LDKCResult_WitnessNoneZ");
        *ret_conv = InMemorySigner_sign_dynamic_p2wsh_input(&this_arg_conv, spend_tx_ref, input_idx, &descriptor_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -63830,6 +69771,46 @@ int8_tArray  CS_LDK_PhantomKeysManager_get_phantom_node_secret_key(int64_t this_
        return ret_arr;
 }
 
+void  CS_LDK_EcdsaChannelSigner_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKEcdsaChannelSigner this_ptr_conv = *(LDKEcdsaChannelSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       EcdsaChannelSigner_free(this_ptr_conv);
+}
+
+static inline uint64_t WriteableEcdsaChannelSigner_clone_ptr(LDKWriteableEcdsaChannelSigner *NONNULL_PTR arg) {
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = WriteableEcdsaChannelSigner_clone(arg);
+       return tag_ptr(ret_ret, true);
+}
+int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone_ptr(int64_t arg) {
+       void* arg_ptr = untag_ptr(arg);
+       if (ptr_is_owned(arg)) { CHECK_ACCESS(arg_ptr); }
+       LDKWriteableEcdsaChannelSigner* arg_conv = (LDKWriteableEcdsaChannelSigner*)arg_ptr;
+       int64_t ret_conv = WriteableEcdsaChannelSigner_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_WriteableEcdsaChannelSigner_clone(int64_t orig) {
+       void* orig_ptr = untag_ptr(orig);
+       if (ptr_is_owned(orig)) { CHECK_ACCESS(orig_ptr); }
+       LDKWriteableEcdsaChannelSigner* orig_conv = (LDKWriteableEcdsaChannelSigner*)orig_ptr;
+       LDKWriteableEcdsaChannelSigner* ret_ret = MALLOC(sizeof(LDKWriteableEcdsaChannelSigner), "LDKWriteableEcdsaChannelSigner");
+       *ret_ret = WriteableEcdsaChannelSigner_clone(orig_conv);
+       return tag_ptr(ret_ret, true);
+}
+
+void  CS_LDK_WriteableEcdsaChannelSigner_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKWriteableEcdsaChannelSigner this_ptr_conv = *(LDKWriteableEcdsaChannelSigner*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       WriteableEcdsaChannelSigner_free(this_ptr_conv);
+}
+
 void  CS_LDK_OnionMessenger_free(int64_t this_obj) {
        LDKOnionMessenger this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -63855,8 +69836,20 @@ void  CS_LDK_DefaultMessageRouter_free(int64_t this_obj) {
        DefaultMessageRouter_free(this_obj_conv);
 }
 
-int64_t  CS_LDK_DefaultMessageRouter_new() {
-       LDKDefaultMessageRouter ret_var = DefaultMessageRouter_new();
+int64_t  CS_LDK_DefaultMessageRouter_new(int64_t network_graph, int64_t entropy_source) {
+       LDKNetworkGraph network_graph_conv;
+       network_graph_conv.inner = untag_ptr(network_graph);
+       network_graph_conv.is_owned = ptr_is_owned(network_graph);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(network_graph_conv);
+       network_graph_conv.is_owned = false;
+       void* entropy_source_ptr = untag_ptr(entropy_source);
+       CHECK_ACCESS(entropy_source_ptr);
+       LDKEntropySource entropy_source_conv = *(LDKEntropySource*)(entropy_source_ptr);
+       if (entropy_source_conv.free == LDKEntropySource_JCalls_free) {
+               // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
+               LDKEntropySource_JCalls_cloned(&entropy_source_conv);
+       }
+       LDKDefaultMessageRouter ret_var = DefaultMessageRouter_new(&network_graph_conv, entropy_source_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -63951,7 +69944,32 @@ void  CS_LDK_OnionMessagePath_set_destination(int64_t this_ptr, int64_t val) {
        OnionMessagePath_set_destination(&this_ptr_conv, val_conv);
 }
 
-int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t destination_arg) {
+int64_t  CS_LDK_OnionMessagePath_get_first_node_addresses(int64_t this_ptr) {
+       LDKOnionMessagePath this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       LDKCOption_CVec_SocketAddressZZ *ret_copy = MALLOC(sizeof(LDKCOption_CVec_SocketAddressZZ), "LDKCOption_CVec_SocketAddressZZ");
+       *ret_copy = OnionMessagePath_get_first_node_addresses(&this_ptr_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+void  CS_LDK_OnionMessagePath_set_first_node_addresses(int64_t this_ptr, int64_t val) {
+       LDKOnionMessagePath this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       void* val_ptr = untag_ptr(val);
+       CHECK_ACCESS(val_ptr);
+       LDKCOption_CVec_SocketAddressZZ val_conv = *(LDKCOption_CVec_SocketAddressZZ*)(val_ptr);
+       val_conv = COption_CVec_SocketAddressZZ_clone((LDKCOption_CVec_SocketAddressZZ*)untag_ptr(val));
+       OnionMessagePath_set_first_node_addresses(&this_ptr_conv, val_conv);
+}
+
+int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t destination_arg, int64_t first_node_addresses_arg) {
        LDKCVec_PublicKeyZ intermediate_nodes_arg_constr;
        intermediate_nodes_arg_constr.datalen = intermediate_nodes_arg->arr_len;
        if (intermediate_nodes_arg_constr.datalen > 0)
@@ -63971,7 +69989,10 @@ int64_t  CS_LDK_OnionMessagePath_new(ptrArray intermediate_nodes_arg, int64_t de
        CHECK_ACCESS(destination_arg_ptr);
        LDKDestination destination_arg_conv = *(LDKDestination*)(destination_arg_ptr);
        destination_arg_conv = Destination_clone((LDKDestination*)untag_ptr(destination_arg));
-       LDKOnionMessagePath ret_var = OnionMessagePath_new(intermediate_nodes_arg_constr, destination_arg_conv);
+       void* first_node_addresses_arg_ptr = untag_ptr(first_node_addresses_arg);
+       CHECK_ACCESS(first_node_addresses_arg_ptr);
+       LDKCOption_CVec_SocketAddressZZ first_node_addresses_arg_conv = *(LDKCOption_CVec_SocketAddressZZ*)(first_node_addresses_arg_ptr);
+       LDKOnionMessagePath ret_var = OnionMessagePath_new(intermediate_nodes_arg_constr, destination_arg_conv, first_node_addresses_arg_conv);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -64008,6 +70029,17 @@ int64_t  CS_LDK_OnionMessagePath_clone(int64_t orig) {
        return ret_ref;
 }
 
+int8_tArray  CS_LDK_OnionMessagePath_first_node(int64_t this_arg) {
+       LDKOnionMessagePath this_arg_conv;
+       this_arg_conv.inner = untag_ptr(this_arg);
+       this_arg_conv.is_owned = ptr_is_owned(this_arg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
+       this_arg_conv.is_owned = false;
+       int8_tArray ret_arr = init_int8_tArray(33, __LINE__);
+       memcpy(ret_arr->elems, OnionMessagePath_first_node(&this_arg_conv).compressed_form, 33);
+       return ret_arr;
+}
+
 void  CS_LDK_Destination_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -64059,6 +70091,59 @@ int64_t  CS_LDK_Destination_blinded_path(int64_t a) {
        return ret_ref;
 }
 
+void  CS_LDK_SendSuccess_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKSendSuccess this_ptr_conv = *(LDKSendSuccess*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       SendSuccess_free(this_ptr_conv);
+}
+
+static inline uint64_t SendSuccess_clone_ptr(LDKSendSuccess *NONNULL_PTR arg) {
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_SendSuccess_clone_ptr(int64_t arg) {
+       LDKSendSuccess* arg_conv = (LDKSendSuccess*)untag_ptr(arg);
+       int64_t ret_conv = SendSuccess_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_SendSuccess_clone(int64_t orig) {
+       LDKSendSuccess* orig_conv = (LDKSendSuccess*)untag_ptr(orig);
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendSuccess_buffered() {
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_buffered();
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendSuccess_buffered_awaiting_connection(int8_tArray a) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKSendSuccess *ret_copy = MALLOC(sizeof(LDKSendSuccess), "LDKSendSuccess");
+       *ret_copy = SendSuccess_buffered_awaiting_connection(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+jboolean  CS_LDK_SendSuccess_eq(int64_t a, int64_t b) {
+       LDKSendSuccess* a_conv = (LDKSendSuccess*)untag_ptr(a);
+       LDKSendSuccess* b_conv = (LDKSendSuccess*)untag_ptr(b);
+       jboolean ret_conv = SendSuccess_eq(a_conv, b_conv);
+       return ret_conv;
+}
+
 void  CS_LDK_SendError_free(int64_t this_ptr) {
        if (!ptr_is_owned(this_ptr)) return;
        void* this_ptr_ptr = untag_ptr(this_ptr);
@@ -64110,9 +70195,19 @@ int64_t  CS_LDK_SendError_too_few_blinded_hops() {
        return ret_ref;
 }
 
-int64_t  CS_LDK_SendError_invalid_first_hop() {
+int64_t  CS_LDK_SendError_invalid_first_hop(int8_tArray a) {
+       LDKPublicKey a_ref;
+       CHECK(a->arr_len == 33);
+       memcpy(a_ref.compressed_form, a->elems, 33); FREE(a);
+       LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
+       *ret_copy = SendError_invalid_first_hop(a_ref);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_SendError_path_not_found() {
        LDKSendError *ret_copy = MALLOC(sizeof(LDKSendError), "LDKSendError");
-       *ret_copy = SendError_invalid_first_hop();
+       *ret_copy = SendError_path_not_found();
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -64248,7 +70343,7 @@ int64_t  CS_LDK_create_onion_message(int64_t entropy_source, int64_t node_signer
        reply_path_conv.is_owned = ptr_is_owned(reply_path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(reply_path_conv);
        reply_path_conv = BlindedPath_clone(&reply_path_conv);
-       LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ), "LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ");
+       LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ), "LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ");
        *ret_conv = create_onion_message(entropy_source_conv, node_signer_conv, path_conv, contents_conv, reply_path_conv);
        return tag_ptr(ret_conv, true);
 }
@@ -64335,17 +70430,12 @@ int64_t  CS_LDK_OnionMessenger_new(int64_t entropy_source, int64_t node_signer,
        return ret_ref;
 }
 
-int64_t  CS_LDK_OnionMessenger_send_onion_message(int64_t this_arg, int64_t path, int64_t contents, int64_t reply_path) {
+int64_t  CS_LDK_OnionMessenger_send_onion_message(int64_t this_arg, int64_t contents, int64_t destination, int64_t reply_path) {
        LDKOnionMessenger this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
        this_arg_conv.is_owned = false;
-       LDKOnionMessagePath path_conv;
-       path_conv.inner = untag_ptr(path);
-       path_conv.is_owned = ptr_is_owned(path);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(path_conv);
-       path_conv = OnionMessagePath_clone(&path_conv);
        void* contents_ptr = untag_ptr(contents);
        CHECK_ACCESS(contents_ptr);
        LDKOnionMessageContents contents_conv = *(LDKOnionMessageContents*)(contents_ptr);
@@ -64353,13 +70443,17 @@ int64_t  CS_LDK_OnionMessenger_send_onion_message(int64_t this_arg, int64_t path
                // If this_arg is a JCalls struct, then we need to increment the refcnt in it.
                LDKOnionMessageContents_JCalls_cloned(&contents_conv);
        }
+       void* destination_ptr = untag_ptr(destination);
+       CHECK_ACCESS(destination_ptr);
+       LDKDestination destination_conv = *(LDKDestination*)(destination_ptr);
+       destination_conv = Destination_clone((LDKDestination*)untag_ptr(destination));
        LDKBlindedPath reply_path_conv;
        reply_path_conv.inner = untag_ptr(reply_path);
        reply_path_conv.is_owned = ptr_is_owned(reply_path);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(reply_path_conv);
        reply_path_conv = BlindedPath_clone(&reply_path_conv);
-       LDKCResult_NoneSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NoneSendErrorZ), "LDKCResult_NoneSendErrorZ");
-       *ret_conv = OnionMessenger_send_onion_message(&this_arg_conv, path_conv, contents_conv, reply_path_conv);
+       LDKCResult_SendSuccessSendErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_SendSuccessSendErrorZ), "LDKCResult_SendSuccessSendErrorZ");
+       *ret_conv = OnionMessenger_send_onion_message(&this_arg_conv, contents_conv, destination_conv, reply_path_conv);
        return tag_ptr(ret_conv, true);
 }
 
@@ -64453,6 +70547,13 @@ jboolean  CS_LDK_OffersMessage_is_known_type(int64_t tlv_type) {
        return ret_conv;
 }
 
+int64_t  CS_LDK_OffersMessage_as_OnionMessageContents(int64_t this_arg) {
+       LDKOffersMessage* this_arg_conv = (LDKOffersMessage*)untag_ptr(this_arg);
+       LDKOnionMessageContents* ret_ret = MALLOC(sizeof(LDKOnionMessageContents), "LDKOnionMessageContents");
+       *ret_ret = OffersMessage_as_OnionMessageContents(this_arg_conv);
+       return tag_ptr(ret_ret, true);
+}
+
 int8_tArray  CS_LDK_OffersMessage_write(int64_t obj) {
        LDKOffersMessage* obj_conv = (LDKOffersMessage*)untag_ptr(obj);
        LDKCVec_u8Z ret_var = OffersMessage_write(obj_conv);
@@ -64622,6 +70723,16 @@ int64_t  CS_LDK_Packet_clone(int64_t orig) {
        return ret_ref;
 }
 
+int64_t  CS_LDK_Packet_hash(int64_t o) {
+       LDKPacket o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       int64_t ret_conv = Packet_hash(&o_conv);
+       return ret_conv;
+}
+
 jboolean  CS_LDK_Packet_eq(int64_t a, int64_t b) {
        LDKPacket a_conv;
        a_conv.inner = untag_ptr(a);
@@ -65119,6 +71230,40 @@ int64_t  CS_LDK_BlindedPath_one_hop_for_payment(int8_tArray payee_node_id, int64
        return tag_ptr(ret_conv, true);
 }
 
+int64_t  CS_LDK_BlindedPath_new_for_payment(int64_tArray intermediate_nodes, int8_tArray payee_node_id, int64_t payee_tlvs, int64_t htlc_maximum_msat, int64_t entropy_source) {
+       LDKCVec_ForwardNodeZ intermediate_nodes_constr;
+       intermediate_nodes_constr.datalen = intermediate_nodes->arr_len;
+       if (intermediate_nodes_constr.datalen > 0)
+               intermediate_nodes_constr.data = MALLOC(intermediate_nodes_constr.datalen * sizeof(LDKForwardNode), "LDKCVec_ForwardNodeZ Elements");
+       else
+               intermediate_nodes_constr.data = NULL;
+       int64_t* intermediate_nodes_vals = intermediate_nodes->elems;
+       for (size_t n = 0; n < intermediate_nodes_constr.datalen; n++) {
+               int64_t intermediate_nodes_conv_13 = intermediate_nodes_vals[n];
+               LDKForwardNode intermediate_nodes_conv_13_conv;
+               intermediate_nodes_conv_13_conv.inner = untag_ptr(intermediate_nodes_conv_13);
+               intermediate_nodes_conv_13_conv.is_owned = ptr_is_owned(intermediate_nodes_conv_13);
+               CHECK_INNER_FIELD_ACCESS_OR_NULL(intermediate_nodes_conv_13_conv);
+               intermediate_nodes_conv_13_conv = ForwardNode_clone(&intermediate_nodes_conv_13_conv);
+               intermediate_nodes_constr.data[n] = intermediate_nodes_conv_13_conv;
+       }
+       FREE(intermediate_nodes);
+       LDKPublicKey payee_node_id_ref;
+       CHECK(payee_node_id->arr_len == 33);
+       memcpy(payee_node_id_ref.compressed_form, payee_node_id->elems, 33); FREE(payee_node_id);
+       LDKReceiveTlvs payee_tlvs_conv;
+       payee_tlvs_conv.inner = untag_ptr(payee_tlvs);
+       payee_tlvs_conv.is_owned = ptr_is_owned(payee_tlvs);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(payee_tlvs_conv);
+       payee_tlvs_conv = ReceiveTlvs_clone(&payee_tlvs_conv);
+       void* entropy_source_ptr = untag_ptr(entropy_source);
+       if (ptr_is_owned(entropy_source)) { CHECK_ACCESS(entropy_source_ptr); }
+       LDKEntropySource* entropy_source_conv = (LDKEntropySource*)entropy_source_ptr;
+       LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ), "LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ");
+       *ret_conv = BlindedPath_new_for_payment(intermediate_nodes_constr, payee_node_id_ref, payee_tlvs_conv, htlc_maximum_msat, entropy_source_conv);
+       return tag_ptr(ret_conv, true);
+}
+
 int8_tArray  CS_LDK_BlindedPath_write(int64_t obj) {
        LDKBlindedPath obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -65766,16 +71911,6 @@ int8_tArray  CS_LDK_ReceiveTlvs_write(int64_t obj) {
        return ret_arr;
 }
 
-int64_t  CS_LDK_ReceiveTlvs_read(int8_tArray ser) {
-       LDKu8slice ser_ref;
-       ser_ref.datalen = ser->arr_len;
-       ser_ref.data = ser->elems;
-       LDKCResult_ReceiveTlvsDecodeErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ReceiveTlvsDecodeErrorZ), "LDKCResult_ReceiveTlvsDecodeErrorZ");
-       *ret_conv = ReceiveTlvs_read(ser_ref);
-       FREE(ser);
-       return tag_ptr(ret_conv, true);
-}
-
 int8_tArray  CS_LDK_PaymentRelay_write(int64_t obj) {
        LDKPaymentRelay obj_conv;
        obj_conv.inner = untag_ptr(obj);
@@ -65882,6 +72017,14 @@ jboolean  CS_LDK_PaymentPurpose_eq(int64_t a, int64_t b) {
        return ret_conv;
 }
 
+int64_t  CS_LDK_PaymentPurpose_preimage(int64_t this_arg) {
+       LDKPaymentPurpose* this_arg_conv = (LDKPaymentPurpose*)untag_ptr(this_arg);
+       LDKCOption_ThirtyTwoBytesZ *ret_copy = MALLOC(sizeof(LDKCOption_ThirtyTwoBytesZ), "LDKCOption_ThirtyTwoBytesZ");
+       *ret_copy = PaymentPurpose_preimage(this_arg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 int8_tArray  CS_LDK_PaymentPurpose_write(int64_t obj) {
        LDKPaymentPurpose* obj_conv = (LDKPaymentPurpose*)untag_ptr(obj);
        LDKCVec_u8Z ret_var = PaymentPurpose_write(obj_conv);
@@ -65993,14 +72136,33 @@ void  CS_LDK_ClaimedHTLC_set_value_msat(int64_t this_ptr, int64_t val) {
        ClaimedHTLC_set_value_msat(&this_ptr_conv, val);
 }
 
-int64_t  CS_LDK_ClaimedHTLC_new(int8_tArray channel_id_arg, int8_tArray user_channel_id_arg, int32_t cltv_expiry_arg, int64_t value_msat_arg) {
+int64_t  CS_LDK_ClaimedHTLC_get_counterparty_skimmed_fee_msat(int64_t this_ptr) {
+       LDKClaimedHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       int64_t ret_conv = ClaimedHTLC_get_counterparty_skimmed_fee_msat(&this_ptr_conv);
+       return ret_conv;
+}
+
+void  CS_LDK_ClaimedHTLC_set_counterparty_skimmed_fee_msat(int64_t this_ptr, int64_t val) {
+       LDKClaimedHTLC this_ptr_conv;
+       this_ptr_conv.inner = untag_ptr(this_ptr);
+       this_ptr_conv.is_owned = ptr_is_owned(this_ptr);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(this_ptr_conv);
+       this_ptr_conv.is_owned = false;
+       ClaimedHTLC_set_counterparty_skimmed_fee_msat(&this_ptr_conv, val);
+}
+
+int64_t  CS_LDK_ClaimedHTLC_new(int8_tArray channel_id_arg, int8_tArray user_channel_id_arg, int32_t cltv_expiry_arg, int64_t value_msat_arg, int64_t counterparty_skimmed_fee_msat_arg) {
        LDKThirtyTwoBytes channel_id_arg_ref;
        CHECK(channel_id_arg->arr_len == 32);
        memcpy(channel_id_arg_ref.data, channel_id_arg->elems, 32); FREE(channel_id_arg);
        LDKU128 user_channel_id_arg_ref;
        CHECK(user_channel_id_arg->arr_len == 16);
        memcpy(user_channel_id_arg_ref.le_bytes, user_channel_id_arg->elems, 16); FREE(user_channel_id_arg);
-       LDKClaimedHTLC ret_var = ClaimedHTLC_new(channel_id_arg_ref, user_channel_id_arg_ref, cltv_expiry_arg, value_msat_arg);
+       LDKClaimedHTLC ret_var = ClaimedHTLC_new(channel_id_arg_ref, user_channel_id_arg_ref, cltv_expiry_arg, value_msat_arg, counterparty_skimmed_fee_msat_arg);
        int64_t ret_ref = 0;
        CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
        ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
@@ -66558,6 +72720,31 @@ int64_t  CS_LDK_Event_payment_claimed(int8_tArray receiver_node_id, int8_tArray
        return ret_ref;
 }
 
+int64_t  CS_LDK_Event_connection_needed(int8_tArray node_id, int64_tArray addresses) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKCVec_SocketAddressZ addresses_constr;
+       addresses_constr.datalen = addresses->arr_len;
+       if (addresses_constr.datalen > 0)
+               addresses_constr.data = MALLOC(addresses_constr.datalen * sizeof(LDKSocketAddress), "LDKCVec_SocketAddressZ Elements");
+       else
+               addresses_constr.data = NULL;
+       int64_t* addresses_vals = addresses->elems;
+       for (size_t p = 0; p < addresses_constr.datalen; p++) {
+               int64_t addresses_conv_15 = addresses_vals[p];
+               void* addresses_conv_15_ptr = untag_ptr(addresses_conv_15);
+               CHECK_ACCESS(addresses_conv_15_ptr);
+               LDKSocketAddress addresses_conv_15_conv = *(LDKSocketAddress*)(addresses_conv_15_ptr);
+               addresses_constr.data[p] = addresses_conv_15_conv;
+       }
+       FREE(addresses);
+       LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
+       *ret_copy = Event_connection_needed(node_id_ref, addresses_constr);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 int64_t  CS_LDK_Event_invoice_request_failed(int8_tArray payment_id) {
        LDKThirtyTwoBytes payment_id_ref;
        CHECK(payment_id->arr_len == 32);
@@ -66808,7 +72995,7 @@ int64_t  CS_LDK_Event_channel_ready(int8_tArray channel_id, int8_tArray user_cha
        return ret_ref;
 }
 
-int64_t  CS_LDK_Event_channel_closed(int8_tArray channel_id, int8_tArray user_channel_id, int64_t reason, int8_tArray counterparty_node_id, int64_t channel_capacity_sats) {
+int64_t  CS_LDK_Event_channel_closed(int8_tArray channel_id, int8_tArray user_channel_id, int64_t reason, int8_tArray counterparty_node_id, int64_t channel_capacity_sats, int64_t channel_funding_txo) {
        LDKThirtyTwoBytes channel_id_ref;
        CHECK(channel_id->arr_len == 32);
        memcpy(channel_id_ref.data, channel_id->elems, 32); FREE(channel_id);
@@ -66826,8 +73013,13 @@ int64_t  CS_LDK_Event_channel_closed(int8_tArray channel_id, int8_tArray user_ch
        CHECK_ACCESS(channel_capacity_sats_ptr);
        LDKCOption_u64Z channel_capacity_sats_conv = *(LDKCOption_u64Z*)(channel_capacity_sats_ptr);
        channel_capacity_sats_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(channel_capacity_sats));
+       LDKOutPoint channel_funding_txo_conv;
+       channel_funding_txo_conv.inner = untag_ptr(channel_funding_txo);
+       channel_funding_txo_conv.is_owned = ptr_is_owned(channel_funding_txo);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(channel_funding_txo_conv);
+       channel_funding_txo_conv = OutPoint_clone(&channel_funding_txo_conv);
        LDKEvent *ret_copy = MALLOC(sizeof(LDKEvent), "LDKEvent");
-       *ret_copy = Event_channel_closed(channel_id_ref, user_channel_id_ref, reason_conv, counterparty_node_id_ref, channel_capacity_sats_conv);
+       *ret_copy = Event_channel_closed(channel_id_ref, user_channel_id_ref, reason_conv, counterparty_node_id_ref, channel_capacity_sats_conv, channel_funding_txo_conv);
        int64_t ret_ref = tag_ptr(ret_copy, true);
        return ret_ref;
 }
@@ -67035,6 +73227,66 @@ int64_t  CS_LDK_MessageSendEvent_send_funding_signed(int8_tArray node_id, int64_
        return ret_ref;
 }
 
+int64_t  CS_LDK_MessageSendEvent_send_stfu(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKStfu msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = Stfu_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_stfu(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_splice(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKSplice msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = Splice_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_splice(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_splice_ack(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKSpliceAck msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = SpliceAck_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_splice_ack(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_MessageSendEvent_send_splice_locked(int8_tArray node_id, int64_t msg) {
+       LDKPublicKey node_id_ref;
+       CHECK(node_id->arr_len == 33);
+       memcpy(node_id_ref.compressed_form, node_id->elems, 33); FREE(node_id);
+       LDKSpliceLocked msg_conv;
+       msg_conv.inner = untag_ptr(msg);
+       msg_conv.is_owned = ptr_is_owned(msg);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(msg_conv);
+       msg_conv = SpliceLocked_clone(&msg_conv);
+       LDKMessageSendEvent *ret_copy = MALLOC(sizeof(LDKMessageSendEvent), "LDKMessageSendEvent");
+       *ret_copy = MessageSendEvent_send_splice_locked(node_id_ref, msg_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 int64_t  CS_LDK_MessageSendEvent_send_tx_add_input(int8_tArray node_id, int64_t msg) {
        LDKPublicKey node_id_ref;
        CHECK(node_id->arr_len == 33);
@@ -70342,13 +76594,26 @@ int64_t  CS_LDK_Description_new(jstring description) {
        return tag_ptr(ret_conv, true);
 }
 
-jstring  CS_LDK_Description_into_inner(int64_t this_arg) {
+int64_t  CS_LDK_Description_into_inner(int64_t this_arg) {
        LDKDescription this_arg_conv;
        this_arg_conv.inner = untag_ptr(this_arg);
        this_arg_conv.is_owned = ptr_is_owned(this_arg);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(this_arg_conv);
        this_arg_conv = Description_clone(&this_arg_conv);
-       LDKStr ret_str = Description_into_inner(this_arg_conv);
+       LDKUntrustedString ret_var = Description_into_inner(this_arg_conv);
+       int64_t ret_ref = 0;
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(ret_var);
+       ret_ref = tag_ptr(ret_var.inner, ret_var.is_owned);
+       return ret_ref;
+}
+
+jstring  CS_LDK_Description_to_str(int64_t o) {
+       LDKDescription o_conv;
+       o_conv.inner = untag_ptr(o);
+       o_conv.is_owned = ptr_is_owned(o);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(o_conv);
+       o_conv.is_owned = false;
+       LDKStr ret_str = Description_to_str(&o_conv);
        jstring ret_conv = str_ref_to_cs(ret_str.chars, ret_str.len);
        Str_free(ret_str);
        return ret_conv;
@@ -70595,239 +76860,28 @@ jstring  CS_LDK_SignOrCreationError_to_str(int64_t o) {
        return ret_conv;
 }
 
-int64_t  CS_LDK_pay_invoice(int64_t invoice, int64_t retry_strategy, int64_t channelmanager) {
+int64_t  CS_LDK_payment_parameters_from_zero_amount_invoice(int64_t invoice, int64_t amount_msat) {
        LDKBolt11Invoice invoice_conv;
        invoice_conv.inner = untag_ptr(invoice);
        invoice_conv.is_owned = ptr_is_owned(invoice);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
        invoice_conv.is_owned = false;
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = pay_invoice(&invoice_conv, retry_strategy_conv, &channelmanager_conv);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = payment_parameters_from_zero_amount_invoice(&invoice_conv, amount_msat);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_pay_invoice_with_id(int64_t invoice, int8_tArray payment_id, int64_t retry_strategy, int64_t channelmanager) {
+int64_t  CS_LDK_payment_parameters_from_invoice(int64_t invoice) {
        LDKBolt11Invoice invoice_conv;
        invoice_conv.inner = untag_ptr(invoice);
        invoice_conv.is_owned = ptr_is_owned(invoice);
        CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
        invoice_conv.is_owned = false;
-       LDKThirtyTwoBytes payment_id_ref;
-       CHECK(payment_id->arr_len == 32);
-       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = pay_invoice_with_id(&invoice_conv, payment_id_ref, retry_strategy_conv, &channelmanager_conv);
+       LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ* ret_conv = MALLOC(sizeof(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ), "LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ");
+       *ret_conv = payment_parameters_from_invoice(&invoice_conv);
        return tag_ptr(ret_conv, true);
 }
 
-int64_t  CS_LDK_pay_zero_value_invoice(int64_t invoice, int64_t amount_msats, int64_t retry_strategy, int64_t channelmanager) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_ThirtyTwoBytesPaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_ThirtyTwoBytesPaymentErrorZ), "LDKCResult_ThirtyTwoBytesPaymentErrorZ");
-       *ret_conv = pay_zero_value_invoice(&invoice_conv, amount_msats, retry_strategy_conv, &channelmanager_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_pay_zero_value_invoice_with_id(int64_t invoice, int64_t amount_msats, int8_tArray payment_id, int64_t retry_strategy, int64_t channelmanager) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       LDKThirtyTwoBytes payment_id_ref;
-       CHECK(payment_id->arr_len == 32);
-       memcpy(payment_id_ref.data, payment_id->elems, 32); FREE(payment_id);
-       void* retry_strategy_ptr = untag_ptr(retry_strategy);
-       CHECK_ACCESS(retry_strategy_ptr);
-       LDKRetry retry_strategy_conv = *(LDKRetry*)(retry_strategy_ptr);
-       retry_strategy_conv = Retry_clone((LDKRetry*)untag_ptr(retry_strategy));
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       LDKCResult_NonePaymentErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_NonePaymentErrorZ), "LDKCResult_NonePaymentErrorZ");
-       *ret_conv = pay_zero_value_invoice_with_id(&invoice_conv, amount_msats, payment_id_ref, retry_strategy_conv, &channelmanager_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_preflight_probe_invoice(int64_t invoice, int64_t channelmanager, int64_t liquidity_limit_multiplier) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       void* liquidity_limit_multiplier_ptr = untag_ptr(liquidity_limit_multiplier);
-       CHECK_ACCESS(liquidity_limit_multiplier_ptr);
-       LDKCOption_u64Z liquidity_limit_multiplier_conv = *(LDKCOption_u64Z*)(liquidity_limit_multiplier_ptr);
-       liquidity_limit_multiplier_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(liquidity_limit_multiplier));
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = preflight_probe_invoice(&invoice_conv, &channelmanager_conv, liquidity_limit_multiplier_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-int64_t  CS_LDK_preflight_probe_zero_value_invoice(int64_t invoice, int64_t amount_msat, int64_t channelmanager, int64_t liquidity_limit_multiplier) {
-       LDKBolt11Invoice invoice_conv;
-       invoice_conv.inner = untag_ptr(invoice);
-       invoice_conv.is_owned = ptr_is_owned(invoice);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(invoice_conv);
-       invoice_conv.is_owned = false;
-       LDKChannelManager channelmanager_conv;
-       channelmanager_conv.inner = untag_ptr(channelmanager);
-       channelmanager_conv.is_owned = ptr_is_owned(channelmanager);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(channelmanager_conv);
-       channelmanager_conv.is_owned = false;
-       void* liquidity_limit_multiplier_ptr = untag_ptr(liquidity_limit_multiplier);
-       CHECK_ACCESS(liquidity_limit_multiplier_ptr);
-       LDKCOption_u64Z liquidity_limit_multiplier_conv = *(LDKCOption_u64Z*)(liquidity_limit_multiplier_ptr);
-       liquidity_limit_multiplier_conv = COption_u64Z_clone((LDKCOption_u64Z*)untag_ptr(liquidity_limit_multiplier));
-       LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ* ret_conv = MALLOC(sizeof(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ), "LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ");
-       *ret_conv = preflight_probe_zero_value_invoice(&invoice_conv, amount_msat, &channelmanager_conv, liquidity_limit_multiplier_conv);
-       return tag_ptr(ret_conv, true);
-}
-
-void  CS_LDK_PaymentError_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKPaymentError this_ptr_conv = *(LDKPaymentError*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       PaymentError_free(this_ptr_conv);
-}
-
-static inline uint64_t PaymentError_clone_ptr(LDKPaymentError *NONNULL_PTR arg) {
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_clone(arg);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-int64_t  CS_LDK_PaymentError_clone_ptr(int64_t arg) {
-       LDKPaymentError* arg_conv = (LDKPaymentError*)untag_ptr(arg);
-       int64_t ret_conv = PaymentError_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_PaymentError_clone(int64_t orig) {
-       LDKPaymentError* orig_conv = (LDKPaymentError*)untag_ptr(orig);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_clone(orig_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_PaymentError_invoice(jstring a) {
-       LDKStr a_conv = str_ref_to_owned_c(a);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_invoice(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_PaymentError_sending(int32_t a) {
-       LDKRetryableSendFailure a_conv = LDKRetryableSendFailure_from_cs(a);
-       LDKPaymentError *ret_copy = MALLOC(sizeof(LDKPaymentError), "LDKPaymentError");
-       *ret_copy = PaymentError_sending(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-jboolean  CS_LDK_PaymentError_eq(int64_t a, int64_t b) {
-       LDKPaymentError* a_conv = (LDKPaymentError*)untag_ptr(a);
-       LDKPaymentError* b_conv = (LDKPaymentError*)untag_ptr(b);
-       jboolean ret_conv = PaymentError_eq(a_conv, b_conv);
-       return ret_conv;
-}
-
-void  CS_LDK_ProbingError_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKProbingError this_ptr_conv = *(LDKProbingError*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       ProbingError_free(this_ptr_conv);
-}
-
-static inline uint64_t ProbingError_clone_ptr(LDKProbingError *NONNULL_PTR arg) {
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_clone(arg);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-int64_t  CS_LDK_ProbingError_clone_ptr(int64_t arg) {
-       LDKProbingError* arg_conv = (LDKProbingError*)untag_ptr(arg);
-       int64_t ret_conv = ProbingError_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_ProbingError_clone(int64_t orig) {
-       LDKProbingError* orig_conv = (LDKProbingError*)untag_ptr(orig);
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_clone(orig_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_ProbingError_invoice(jstring a) {
-       LDKStr a_conv = str_ref_to_owned_c(a);
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_invoice(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_ProbingError_sending(int64_t a) {
-       void* a_ptr = untag_ptr(a);
-       CHECK_ACCESS(a_ptr);
-       LDKProbeSendFailure a_conv = *(LDKProbeSendFailure*)(a_ptr);
-       a_conv = ProbeSendFailure_clone((LDKProbeSendFailure*)untag_ptr(a));
-       LDKProbingError *ret_copy = MALLOC(sizeof(LDKProbingError), "LDKProbingError");
-       *ret_copy = ProbingError_sending(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-jboolean  CS_LDK_ProbingError_eq(int64_t a, int64_t b) {
-       LDKProbingError* a_conv = (LDKProbingError*)untag_ptr(a);
-       LDKProbingError* b_conv = (LDKProbingError*)untag_ptr(b);
-       jboolean ret_conv = ProbingError_eq(a_conv, b_conv);
-       return ret_conv;
-}
-
 int64_t  CS_LDK_create_phantom_invoice(int64_t amt_msat, int64_t payment_hash, jstring description, int32_t invoice_expiry_delta_secs, int64_tArray phantom_route_hints, int64_t entropy_source, int64_t node_signer, int64_t logger, int32_t network, int64_t min_final_cltv_expiry_delta, int64_t duration_since_epoch) {
        void* amt_msat_ptr = untag_ptr(amt_msat);
        CHECK_ACCESS(amt_msat_ptr);
@@ -71211,6 +77265,58 @@ jstring  CS_LDK_SiPrefix_to_str(int64_t o) {
        return ret_conv;
 }
 
+void  CS_LDK_GraphSyncError_free(int64_t this_ptr) {
+       if (!ptr_is_owned(this_ptr)) return;
+       void* this_ptr_ptr = untag_ptr(this_ptr);
+       CHECK_ACCESS(this_ptr_ptr);
+       LDKGraphSyncError this_ptr_conv = *(LDKGraphSyncError*)(this_ptr_ptr);
+       FREE(untag_ptr(this_ptr));
+       GraphSyncError_free(this_ptr_conv);
+}
+
+static inline uint64_t GraphSyncError_clone_ptr(LDKGraphSyncError *NONNULL_PTR arg) {
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_clone(arg);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+int64_t  CS_LDK_GraphSyncError_clone_ptr(int64_t arg) {
+       LDKGraphSyncError* arg_conv = (LDKGraphSyncError*)untag_ptr(arg);
+       int64_t ret_conv = GraphSyncError_clone_ptr(arg_conv);
+       return ret_conv;
+}
+
+int64_t  CS_LDK_GraphSyncError_clone(int64_t orig) {
+       LDKGraphSyncError* orig_conv = (LDKGraphSyncError*)untag_ptr(orig);
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_clone(orig_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GraphSyncError_decode_error(int64_t a) {
+       void* a_ptr = untag_ptr(a);
+       CHECK_ACCESS(a_ptr);
+       LDKDecodeError a_conv = *(LDKDecodeError*)(a_ptr);
+       a_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(a));
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_decode_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
+int64_t  CS_LDK_GraphSyncError_lightning_error(int64_t a) {
+       LDKLightningError a_conv;
+       a_conv.inner = untag_ptr(a);
+       a_conv.is_owned = ptr_is_owned(a);
+       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
+       a_conv = LightningError_clone(&a_conv);
+       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
+       *ret_copy = GraphSyncError_lightning_error(a_conv);
+       int64_t ret_ref = tag_ptr(ret_copy, true);
+       return ret_ref;
+}
+
 void  CS_LDK_RapidGossipSync_free(int64_t this_obj) {
        LDKRapidGossipSync this_obj_conv;
        this_obj_conv.inner = untag_ptr(this_obj);
@@ -71295,55 +77401,3 @@ jboolean  CS_LDK_RapidGossipSync_is_initial_sync_complete(int64_t this_arg) {
        return ret_conv;
 }
 
-void  CS_LDK_GraphSyncError_free(int64_t this_ptr) {
-       if (!ptr_is_owned(this_ptr)) return;
-       void* this_ptr_ptr = untag_ptr(this_ptr);
-       CHECK_ACCESS(this_ptr_ptr);
-       LDKGraphSyncError this_ptr_conv = *(LDKGraphSyncError*)(this_ptr_ptr);
-       FREE(untag_ptr(this_ptr));
-       GraphSyncError_free(this_ptr_conv);
-}
-
-static inline uint64_t GraphSyncError_clone_ptr(LDKGraphSyncError *NONNULL_PTR arg) {
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_clone(arg);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-int64_t  CS_LDK_GraphSyncError_clone_ptr(int64_t arg) {
-       LDKGraphSyncError* arg_conv = (LDKGraphSyncError*)untag_ptr(arg);
-       int64_t ret_conv = GraphSyncError_clone_ptr(arg_conv);
-       return ret_conv;
-}
-
-int64_t  CS_LDK_GraphSyncError_clone(int64_t orig) {
-       LDKGraphSyncError* orig_conv = (LDKGraphSyncError*)untag_ptr(orig);
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_clone(orig_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_GraphSyncError_decode_error(int64_t a) {
-       void* a_ptr = untag_ptr(a);
-       CHECK_ACCESS(a_ptr);
-       LDKDecodeError a_conv = *(LDKDecodeError*)(a_ptr);
-       a_conv = DecodeError_clone((LDKDecodeError*)untag_ptr(a));
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_decode_error(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
-int64_t  CS_LDK_GraphSyncError_lightning_error(int64_t a) {
-       LDKLightningError a_conv;
-       a_conv.inner = untag_ptr(a);
-       a_conv.is_owned = ptr_is_owned(a);
-       CHECK_INNER_FIELD_ACCESS_OR_NULL(a_conv);
-       a_conv = LightningError_clone(&a_conv);
-       LDKGraphSyncError *ret_copy = MALLOC(sizeof(LDKGraphSyncError), "LDKGraphSyncError");
-       *ret_copy = GraphSyncError_lightning_error(a_conv);
-       int64_t ret_ref = tag_ptr(ret_copy, true);
-       return ret_ref;
-}
-
diff --git a/c_sharp/src/org/ldk/enums/BlindedFailure.cs b/c_sharp/src/org/ldk/enums/BlindedFailure.cs
new file mode 100644 (file)
index 0000000..230b434
--- /dev/null
@@ -0,0 +1,16 @@
+namespace org { namespace ldk { namespace enums {/**
+ * Whether this blinded HTLC is being failed backwards by the introduction node or a blinded node,
+ * which determines the failure message that should be used.
+ */
+public enum BlindedFailure {
+       /**
+        * This HTLC is being failed backwards by the introduction node, and thus should be failed with
+        * [`msgs::UpdateFailHTLC`] and error code `0x8000|0x4000|24`.
+        */
+       LDKBlindedFailure_FromIntroductionNode,
+       /**
+        * This HTLC is being failed backwards by a blinded node within the path, and thus should be
+        * failed with [`msgs::UpdateFailMalformedHTLC`] and error code `0x8000|0x4000|24`.
+        */
+       LDKBlindedFailure_FromBlindedNode,
+}} } }
index dceec73671c97744624472ec8e2296217150ec45..c5b9fcde15d2c417b77892d5da4efed1fac2b78b 100644 (file)
@@ -10,25 +10,6 @@ public enum ConfirmationTarget {
         * fee - this should be a relatively high priority feerate.
         */
        LDKConfirmationTarget_OnChainSweep,
-       /**
-        * The highest feerate we will allow our channel counterparty to have in a non-anchor channel.
-        * 
-        * This is the feerate on the transaction which we (or our counterparty) will broadcast in
-        * order to close the channel unilaterally. Because our counterparty must ensure they can
-        * always broadcast the latest state, this value being too low will cause immediate
-        * force-closures.
-        * 
-        * Allowing this value to be too high can allow our counterparty to burn our HTLC outputs to
-        * dust, which can result in HTLCs failing or force-closures (when the dust HTLCs exceed
-        * [`ChannelConfig::max_dust_htlc_exposure`]).
-        * 
-        * Because most nodes use a feerate estimate which is based on a relatively high priority
-        * transaction entering the current mempool, setting this to a small multiple of your current
-        * high priority feerate estimate should suffice.
-        * 
-        * [`ChannelConfig::max_dust_htlc_exposure`]: crate::util::config::ChannelConfig::max_dust_htlc_exposure
-        */
-       LDKConfirmationTarget_MaxAllowedNonAnchorChannelRemoteFee,
        /**
         * This is the lowest feerate we will allow our channel counterparty to have in an anchor
         * channel in order to close the channel if a channel party goes away.
index 8e1e194ccc12a59a3a05974d5a2f06848fca894f..e3c3a6e408fff3860f28d046de48080d2be9b9f5 100644 (file)
@@ -25,20 +25,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBech32Error_ty_from_ptr")] public static extern long LDKBech32Error_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBech32Error_InvalidChar_get_invalid_char")] public static extern int LDKBech32Error_InvalidChar_get_invalid_char(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKBech32Error_InvalidData_get_invalid_data")] public static extern byte LDKBech32Error_InvalidData_get_invalid_data(long ptr);
-       // struct LDKWitness TxIn_get_witness (struct LDKTxIn* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_witness")] public static extern long TxIn_get_witness(long _thing);
-       // struct LDKCVec_u8Z TxIn_get_script_sig (struct LDKTxIn* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_script_sig")] public static extern long TxIn_get_script_sig(long _thing);
-       // LDKThirtyTwoBytes TxIn_get_previous_txid (struct LDKTxIn* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_previous_txid")] public static extern long TxIn_get_previous_txid(long _thing);
-       // uint32_t TxIn_get_previous_vout (struct LDKTxIn* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_previous_vout")] public static extern int TxIn_get_previous_vout(long _thing);
-       // uint32_t TxIn_get_sequence (struct LDKTxIn* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_sequence")] public static extern int TxIn_get_sequence(long _thing);
-       // struct LDKCVec_u8Z TxOut_get_script_pubkey (struct LDKTxOut* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_get_script_pubkey")] public static extern long TxOut_get_script_pubkey(long _thing);
-       // uint64_t TxOut_get_value (struct LDKTxOut* thing)
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_get_value")] public static extern long TxOut_get_value(long _thing);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u64Z_ty_from_ptr")] public static extern long LDKCOption_u64Z_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u64Z_Some_get_some")] public static extern long LDKCOption_u64Z_Some_get_some(long ptr);
        // struct LDKRefund CResult_RefundBolt12ParseErrorZ_get_ok(LDKCResult_RefundBolt12ParseErrorZ *NONNULL_PTR owner);
@@ -102,6 +88,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSpendableOutputDescriptor_ty_from_ptr")] public static extern long LDKSpendableOutputDescriptor_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_outpoint")] public static extern long LDKSpendableOutputDescriptor_StaticOutput_get_outpoint(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_output")] public static extern long LDKSpendableOutputDescriptor_StaticOutput_get_output(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSpendableOutputDescriptor_StaticOutput_get_channel_keys_id")] public static extern long LDKSpendableOutputDescriptor_StaticOutput_get_channel_keys_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSpendableOutputDescriptor_DelayedPaymentOutput_get_delayed_payment_output")] public static extern long LDKSpendableOutputDescriptor_DelayedPaymentOutput_get_delayed_payment_output(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSpendableOutputDescriptor_StaticPaymentOutput_get_static_payment_output")] public static extern long LDKSpendableOutputDescriptor_StaticPaymentOutput_get_static_payment_output(long ptr);
        // struct LDKSpendableOutputDescriptor CResult_SpendableOutputDescriptorDecodeErrorZ_get_ok(LDKCResult_SpendableOutputDescriptorDecodeErrorZ *NONNULL_PTR owner);
@@ -110,14 +97,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpendableOutputDescriptorDecodeErrorZ_get_err")] public static extern long CResult_SpendableOutputDescriptorDecodeErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u32Z_ty_from_ptr")] public static extern long LDKCOption_u32Z_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u32Z_Some_get_some")] public static extern int LDKCOption_u32Z_Some_get_some(long ptr);
-       // struct LDKCVec_u8Z C2Tuple_CVec_u8ZusizeZ_get_a(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8ZusizeZ_get_a")] public static extern long C2Tuple_CVec_u8ZusizeZ_get_a(long _owner);
-       // uintptr_t C2Tuple_CVec_u8ZusizeZ_get_b(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8ZusizeZ_get_b")] public static extern long C2Tuple_CVec_u8ZusizeZ_get_b(long _owner);
-       // struct LDKC2Tuple_CVec_u8ZusizeZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok")] public static extern long CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(long _owner);
-       // void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err")] public static extern void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_err(long _owner);
+       // struct LDKCVec_u8Z C2Tuple_CVec_u8Zu64Z_get_a(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8Zu64Z_get_a")] public static extern long C2Tuple_CVec_u8Zu64Z_get_a(long _owner);
+       // uint64_t C2Tuple_CVec_u8Zu64Z_get_b(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8Zu64Z_get_b")] public static extern long C2Tuple_CVec_u8Zu64Z_get_b(long _owner);
+       // struct LDKC2Tuple_CVec_u8Zu64Z CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok")] public static extern long CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(long _owner);
+       // void CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err")] public static extern void CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_err(long _owner);
        // struct LDKChannelDerivationParameters CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_get_ok")] public static extern long CResult_ChannelDerivationParametersDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_ChannelDerivationParametersDecodeErrorZ_get_err(LDKCResult_ChannelDerivationParametersDecodeErrorZ *NONNULL_PTR owner);
@@ -130,18 +117,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneNoneZ_get_ok")] public static extern void CResult_NoneNoneZ_get_ok(long _owner);
        // void CResult_NoneNoneZ_get_err(LDKCResult_NoneNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneNoneZ_get_err")] public static extern void CResult_NoneNoneZ_get_err(long _owner);
-       // struct LDKECDSASignature C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(long _owner);
-       // struct LDKCVec_ECDSASignatureZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(long _owner);
-       // struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(long _owner);
-       // void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err")] public static extern void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(long _owner);
-       // struct LDKECDSASignature CResult_ECDSASignatureNoneZ_get_ok(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_get_ok")] public static extern long CResult_ECDSASignatureNoneZ_get_ok(long _owner);
-       // void CResult_ECDSASignatureNoneZ_get_err(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_get_err")] public static extern void CResult_ECDSASignatureNoneZ_get_err(long _owner);
        // struct LDKPublicKey CResult_PublicKeyNoneZ_get_ok(LDKCResult_PublicKeyNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyNoneZ_get_ok")] public static extern long CResult_PublicKeyNoneZ_get_ok(long _owner);
        // void CResult_PublicKeyNoneZ_get_err(LDKCResult_PublicKeyNoneZ *NONNULL_PTR owner);
@@ -156,10 +131,23 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_get_ok")] public static extern long CResult_SchnorrSignatureNoneZ_get_ok(long _owner);
        // void CResult_SchnorrSignatureNoneZ_get_err(LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_get_err")] public static extern void CResult_SchnorrSignatureNoneZ_get_err(long _owner);
+       // struct LDKECDSASignature CResult_ECDSASignatureNoneZ_get_ok(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_get_ok")] public static extern long CResult_ECDSASignatureNoneZ_get_ok(long _owner);
+       // void CResult_ECDSASignatureNoneZ_get_err(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_get_err")] public static extern void CResult_ECDSASignatureNoneZ_get_err(long _owner);
+       // struct LDKECDSASignature C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_a(long _owner);
+       // struct LDKCVec_ECDSASignatureZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_get_b(long _owner);
+       // struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_ok(long _owner);
+       // void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err")] public static extern void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_get_err(long _owner);
        public interface LDKChannelSigner {
                long get_per_commitment_point(long idx);
                long release_commitment_secret(long idx);
-               long validate_holder_commitment(long holder_tx, long preimages);
+               long validate_holder_commitment(long holder_tx, long outbound_htlc_preimages);
+               long validate_counterparty_revocation(long idx, long secret);
                long channel_keys_id();
                void provide_channel_parameters(long channel_parameters);
        }
@@ -184,8 +172,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_get_per_commitment_point")] public static extern long ChannelSigner_get_per_commitment_point(long _this_arg, long _idx);
        // LDKThirtyTwoBytes ChannelSigner_release_commitment_secret LDKChannelSigner *NONNULL_PTR this_arg, uint64_t idx
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_release_commitment_secret")] public static extern long ChannelSigner_release_commitment_secret(long _this_arg, long _idx);
-       // LDKCResult_NoneNoneZ ChannelSigner_validate_holder_commitment LDKChannelSigner *NONNULL_PTR this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR holder_tx, struct LDKCVec_ThirtyTwoBytesZ preimages
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_validate_holder_commitment")] public static extern long ChannelSigner_validate_holder_commitment(long _this_arg, long _holder_tx, long _preimages);
+       // LDKCResult_NoneNoneZ ChannelSigner_validate_holder_commitment LDKChannelSigner *NONNULL_PTR this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR holder_tx, struct LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_validate_holder_commitment")] public static extern long ChannelSigner_validate_holder_commitment(long _this_arg, long _holder_tx, long _outbound_htlc_preimages);
+       // LDKCResult_NoneNoneZ ChannelSigner_validate_counterparty_revocation LDKChannelSigner *NONNULL_PTR this_arg, uint64_t idx, const uint8_t (*secret)[32]
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_validate_counterparty_revocation")] public static extern long ChannelSigner_validate_counterparty_revocation(long _this_arg, long _idx, long _secret);
        // LDKThirtyTwoBytes ChannelSigner_channel_keys_id LDKChannelSigner *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_channel_keys_id")] public static extern long ChannelSigner_channel_keys_id(long _this_arg);
        // void ChannelSigner_provide_channel_parameters LDKChannelSigner *NONNULL_PTR this_arg, const struct LDKChannelTransactionParameters *NONNULL_PTR channel_parameters
@@ -193,8 +183,7 @@ internal class bindings {
        // LDKChannelPublicKeys ChannelSigner_get_pubkeys LDKChannelSigner *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_get_pubkeys")] public static extern long ChannelSigner_get_pubkeys(long _this_arg);
        public interface LDKEcdsaChannelSigner {
-               long sign_counterparty_commitment(long commitment_tx, long preimages);
-               long validate_counterparty_revocation(long idx, long secret);
+               long sign_counterparty_commitment(long commitment_tx, long inbound_htlc_preimages, long outbound_htlc_preimages);
                long sign_holder_commitment(long commitment_tx);
                long sign_justice_revoked_output(long justice_tx, long input, long amount, long per_commitment_key);
                long sign_justice_revoked_htlc(long justice_tx, long input, long amount, long per_commitment_key, long htlc);
@@ -221,10 +210,8 @@ internal class bindings {
                ret[1] = i;
                return ret;
        }
-       // LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ EcdsaChannelSigner_sign_counterparty_commitment LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKCommitmentTransaction *NONNULL_PTR commitment_tx, struct LDKCVec_ThirtyTwoBytesZ preimages
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment")] public static extern long EcdsaChannelSigner_sign_counterparty_commitment(long _this_arg, long _commitment_tx, long _preimages);
-       // LDKCResult_NoneNoneZ EcdsaChannelSigner_validate_counterparty_revocation LDKEcdsaChannelSigner *NONNULL_PTR this_arg, uint64_t idx, const uint8_t (*secret)[32]
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_validate_counterparty_revocation")] public static extern long EcdsaChannelSigner_validate_counterparty_revocation(long _this_arg, long _idx, long _secret);
+       // LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ EcdsaChannelSigner_sign_counterparty_commitment LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKCommitmentTransaction *NONNULL_PTR commitment_tx, struct LDKCVec_ThirtyTwoBytesZ inbound_htlc_preimages, struct LDKCVec_ThirtyTwoBytesZ outbound_htlc_preimages
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_counterparty_commitment")] public static extern long EcdsaChannelSigner_sign_counterparty_commitment(long _this_arg, long _commitment_tx, long _inbound_htlc_preimages, long _outbound_htlc_preimages);
        // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_holder_commitment LDKEcdsaChannelSigner *NONNULL_PTR this_arg, const struct LDKHolderCommitmentTransaction *NONNULL_PTR commitment_tx
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_sign_holder_commitment")] public static extern long EcdsaChannelSigner_sign_holder_commitment(long _this_arg, long _commitment_tx);
        // LDKCResult_ECDSASignatureNoneZ EcdsaChannelSigner_sign_justice_revoked_output LDKEcdsaChannelSigner *NONNULL_PTR this_arg, struct LDKTransaction justice_tx, uintptr_t input, uint64_t amount, const uint8_t (*per_commitment_key)[32]
@@ -279,10 +266,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_u16Z_Some_get_some")] public static extern short LDKCOption_u16Z_Some_get_some(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_boolZ_ty_from_ptr")] public static extern long LDKCOption_boolZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_boolZ_Some_get_some")] public static extern bool LDKCOption_boolZ_Some_get_some(long ptr);
-       // struct LDKCVec_CVec_u8ZZ CResult_CVec_CVec_u8ZZNoneZ_get_ok(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_get_ok")] public static extern long CResult_CVec_CVec_u8ZZNoneZ_get_ok(long _owner);
-       // void CResult_CVec_CVec_u8ZZNoneZ_get_err(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_get_err")] public static extern void CResult_CVec_CVec_u8ZZNoneZ_get_err(long _owner);
+       // struct LDKWitness CResult_WitnessNoneZ_get_ok(LDKCResult_WitnessNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_get_ok")] public static extern long CResult_WitnessNoneZ_get_ok(long _owner);
+       // void CResult_WitnessNoneZ_get_err(LDKCResult_WitnessNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_get_err")] public static extern void CResult_WitnessNoneZ_get_err(long _owner);
        // struct LDKInMemorySigner CResult_InMemorySignerDecodeErrorZ_get_ok(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InMemorySignerDecodeErrorZ_get_ok")] public static extern long CResult_InMemorySignerDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_InMemorySignerDecodeErrorZ_get_err(LDKCResult_InMemorySignerDecodeErrorZ *NONNULL_PTR owner);
@@ -291,8 +278,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TransactionNoneZ_get_ok")] public static extern long CResult_TransactionNoneZ_get_ok(long _owner);
        // void CResult_TransactionNoneZ_get_err(LDKCResult_TransactionNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TransactionNoneZ_get_err")] public static extern void CResult_TransactionNoneZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCandidateRouteHop_ty_from_ptr")] public static extern long LDKCandidateRouteHop_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCandidateRouteHop_FirstHop_get_first_hop")] public static extern long LDKCandidateRouteHop_FirstHop_get_first_hop(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCandidateRouteHop_PublicHop_get_public_hop")] public static extern long LDKCandidateRouteHop_PublicHop_get_public_hop(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCandidateRouteHop_PrivateHop_get_private_hop")] public static extern long LDKCandidateRouteHop_PrivateHop_get_private_hop(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCandidateRouteHop_Blinded_get_blinded")] public static extern long LDKCandidateRouteHop_Blinded_get_blinded(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCandidateRouteHop_OneHopBlinded_get_one_hop_blinded")] public static extern long LDKCandidateRouteHop_OneHopBlinded_get_one_hop_blinded(long ptr);
        public interface LDKScoreLookUp {
-               long channel_penalty_msat(long short_channel_id, long source, long target, long usage, long score_params);
+               long channel_penalty_msat(long candidate, long usage, long score_params);
        }
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKScoreLookUp_new")] public static extern long LDKScoreLookUp_new_native(long impl_idx);
        public static long[] LDKScoreLookUp_new(LDKScoreLookUp impl) {
@@ -311,13 +304,14 @@ internal class bindings {
                ret[1] = i;
                return ret;
        }
-       // uint64_t ScoreLookUp_channel_penalty_msat LDKScoreLookUp *NONNULL_PTR this_arg, uint64_t short_channel_id, const struct LDKNodeId *NONNULL_PTR source, const struct LDKNodeId *NONNULL_PTR target, struct LDKChannelUsage usage, const struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR score_params
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreLookUp_channel_penalty_msat")] public static extern long ScoreLookUp_channel_penalty_msat(long _this_arg, long _short_channel_id, long _source, long _target, long _usage, long _score_params);
+       // uint64_t ScoreLookUp_channel_penalty_msat LDKScoreLookUp *NONNULL_PTR this_arg, const struct LDKCandidateRouteHop *NONNULL_PTR candidate, struct LDKChannelUsage usage, const struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR score_params
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreLookUp_channel_penalty_msat")] public static extern long ScoreLookUp_channel_penalty_msat(long _this_arg, long _candidate, long _usage, long _score_params);
        public interface LDKScoreUpdate {
-               void payment_path_failed(long path, long short_channel_id);
-               void payment_path_successful(long path);
-               void probe_failed(long path, long short_channel_id);
-               void probe_successful(long path);
+               void payment_path_failed(long path, long short_channel_id, long duration_since_epoch);
+               void payment_path_successful(long path, long duration_since_epoch);
+               void probe_failed(long path, long short_channel_id, long duration_since_epoch);
+               void probe_successful(long path, long duration_since_epoch);
+               void time_passed(long duration_since_epoch);
        }
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKScoreUpdate_new")] public static extern long LDKScoreUpdate_new_native(long impl_idx);
        public static long[] LDKScoreUpdate_new(LDKScoreUpdate impl) {
@@ -336,14 +330,16 @@ internal class bindings {
                ret[1] = i;
                return ret;
        }
-       // void ScoreUpdate_payment_path_failed LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t short_channel_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_payment_path_failed")] public static extern void ScoreUpdate_payment_path_failed(long _this_arg, long _path, long _short_channel_id);
-       // void ScoreUpdate_payment_path_successful LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_payment_path_successful")] public static extern void ScoreUpdate_payment_path_successful(long _this_arg, long _path);
-       // void ScoreUpdate_probe_failed LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t short_channel_id
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_probe_failed")] public static extern void ScoreUpdate_probe_failed(long _this_arg, long _path, long _short_channel_id);
-       // void ScoreUpdate_probe_successful LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_probe_successful")] public static extern void ScoreUpdate_probe_successful(long _this_arg, long _path);
+       // void ScoreUpdate_payment_path_failed LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t short_channel_id, uint64_t duration_since_epoch
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_payment_path_failed")] public static extern void ScoreUpdate_payment_path_failed(long _this_arg, long _path, long _short_channel_id, long _duration_since_epoch);
+       // void ScoreUpdate_payment_path_successful LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t duration_since_epoch
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_payment_path_successful")] public static extern void ScoreUpdate_payment_path_successful(long _this_arg, long _path, long _duration_since_epoch);
+       // void ScoreUpdate_probe_failed LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t short_channel_id, uint64_t duration_since_epoch
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_probe_failed")] public static extern void ScoreUpdate_probe_failed(long _this_arg, long _path, long _short_channel_id, long _duration_since_epoch);
+       // void ScoreUpdate_probe_successful LDKScoreUpdate *NONNULL_PTR this_arg, const struct LDKPath *NONNULL_PTR path, uint64_t duration_since_epoch
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_probe_successful")] public static extern void ScoreUpdate_probe_successful(long _this_arg, long _path, long _duration_since_epoch);
+       // void ScoreUpdate_time_passed LDKScoreUpdate *NONNULL_PTR this_arg, uint64_t duration_since_epoch
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ScoreUpdate_time_passed")] public static extern void ScoreUpdate_time_passed(long _this_arg, long _duration_since_epoch);
        public interface LDKLockableScore {
                long read_lock();
                long write_lock();
@@ -401,6 +397,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteLightningErrorZ_get_ok")] public static extern long CResult_RouteLightningErrorZ_get_ok(long _owner);
        // struct LDKLightningError CResult_RouteLightningErrorZ_get_err(LDKCResult_RouteLightningErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteLightningErrorZ_get_err")] public static extern long CResult_RouteLightningErrorZ_get_err(long _owner);
+       // struct LDKBlindedPayInfo C2Tuple_BlindedPayInfoBlindedPathZ_get_a(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_a")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_get_a(long _owner);
+       // struct LDKBlindedPath C2Tuple_BlindedPayInfoBlindedPathZ_get_b(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_b")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_get_b(long _owner);
+       // struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok")] public static extern long CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(long _owner);
+       // void CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err")] public static extern void CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_err(long _owner);
+       // struct LDKOnionMessagePath CResult_OnionMessagePathNoneZ_get_ok(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_get_ok")] public static extern long CResult_OnionMessagePathNoneZ_get_ok(long _owner);
+       // void CResult_OnionMessagePathNoneZ_get_err(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_get_err")] public static extern void CResult_OnionMessagePathNoneZ_get_err(long _owner);
+       // struct LDKCVec_BlindedPathZ CResult_CVec_BlindedPathZNoneZ_get_ok(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_get_ok")] public static extern long CResult_CVec_BlindedPathZNoneZ_get_ok(long _owner);
+       // void CResult_CVec_BlindedPathZNoneZ_get_err(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_get_err")] public static extern void CResult_CVec_BlindedPathZNoneZ_get_err(long _owner);
        // struct LDKInFlightHtlcs CResult_InFlightHtlcsDecodeErrorZ_get_ok(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_get_ok")] public static extern long CResult_InFlightHtlcsDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_InFlightHtlcsDecodeErrorZ_get_err(LDKCResult_InFlightHtlcsDecodeErrorZ *NONNULL_PTR owner);
@@ -425,10 +437,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_ok")] public static extern long CResult_PaymentParametersDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_PaymentParametersDecodeErrorZ_get_err(LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentParametersDecodeErrorZ_get_err")] public static extern long CResult_PaymentParametersDecodeErrorZ_get_err(long _owner);
-       // struct LDKBlindedPayInfo C2Tuple_BlindedPayInfoBlindedPathZ_get_a(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_a")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_get_a(long _owner);
-       // struct LDKBlindedPath C2Tuple_BlindedPayInfoBlindedPathZ_get_b(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_get_b")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_get_b(long _owner);
        // struct LDKRouteHint CResult_RouteHintDecodeErrorZ_get_ok(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteHintDecodeErrorZ_get_ok")] public static extern long CResult_RouteHintDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_RouteHintDecodeErrorZ_get_err(LDKCResult_RouteHintDecodeErrorZ *NONNULL_PTR owner);
@@ -487,10 +495,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_usizeTransactionZ_get_a")] public static extern long C2Tuple_usizeTransactionZ_get_a(long _owner);
        // struct LDKTransaction C2Tuple_usizeTransactionZ_get_b(LDKC2Tuple_usizeTransactionZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_usizeTransactionZ_get_b")] public static extern long C2Tuple_usizeTransactionZ_get_b(long _owner);
-       // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a")] public static extern long C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(long _owner);
-       // struct LDKCOption_ThirtyTwoBytesZ C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b")] public static extern long C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(long _owner);
+       // struct LDKThirtyTwoBytes C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a")] public static extern long C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(long _owner);
+       // uint32_t C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b")] public static extern int C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(long _owner);
+       // struct LDKCOption_ThirtyTwoBytesZ C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c")] public static extern long C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(long _owner);
        // enum LDKChannelMonitorUpdateStatus CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_get_ok")] public static extern ChannelMonitorUpdateStatus CResult_ChannelMonitorUpdateStatusNoneZ_get_ok(long _owner);
        // void CResult_ChannelMonitorUpdateStatusNoneZ_get_err(LDKCResult_ChannelMonitorUpdateStatusNoneZ *NONNULL_PTR owner);
@@ -625,6 +635,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendFundingCreated_get_msg")] public static extern long LDKMessageSendEvent_SendFundingCreated_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendFundingSigned_get_node_id")] public static extern long LDKMessageSendEvent_SendFundingSigned_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendFundingSigned_get_msg")] public static extern long LDKMessageSendEvent_SendFundingSigned_get_msg(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendStfu_get_node_id")] public static extern long LDKMessageSendEvent_SendStfu_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendStfu_get_msg")] public static extern long LDKMessageSendEvent_SendStfu_get_msg(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendSplice_get_node_id")] public static extern long LDKMessageSendEvent_SendSplice_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendSplice_get_msg")] public static extern long LDKMessageSendEvent_SendSplice_get_msg(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendSpliceAck_get_node_id")] public static extern long LDKMessageSendEvent_SendSpliceAck_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendSpliceAck_get_msg")] public static extern long LDKMessageSendEvent_SendSpliceAck_get_msg(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendSpliceLocked_get_node_id")] public static extern long LDKMessageSendEvent_SendSpliceLocked_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendSpliceLocked_get_msg")] public static extern long LDKMessageSendEvent_SendSpliceLocked_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAddInput_get_node_id")] public static extern long LDKMessageSendEvent_SendTxAddInput_get_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAddInput_get_msg")] public static extern long LDKMessageSendEvent_SendTxAddInput_get_msg(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageSendEvent_SendTxAddOutput_get_node_id")] public static extern long LDKMessageSendEvent_SendTxAddOutput_get_node_id(long ptr);
@@ -718,6 +736,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NetworkGraphDecodeErrorZ_get_err")] public static extern long CResult_NetworkGraphDecodeErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_SocketAddressZZ_ty_from_ptr")] public static extern long LDKCOption_CVec_SocketAddressZZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_CVec_SocketAddressZZ_Some_get_some")] public static extern long LDKCOption_CVec_SocketAddressZZ_Some_get_some(long ptr);
+       // struct LDKPendingHTLCInfo CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(LDKCResult_PendingHTLCInfoInboundHTLCErrZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok")] public static extern long CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(long _owner);
+       // struct LDKInboundHTLCErr CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(LDKCResult_PendingHTLCInfoInboundHTLCErrZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_get_err")] public static extern long CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_TxOutZ_ty_from_ptr")] public static extern long LDKCOption_TxOutZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_TxOutZ_Some_get_some")] public static extern long LDKCOption_TxOutZ_Some_get_some(long ptr);
        // struct LDKCoinSelection CResult_CoinSelectionNoneZ_get_ok(LDKCResult_CoinSelectionNoneZ *NONNULL_PTR owner);
@@ -831,6 +853,37 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_ok")] public static extern long CResult_PhantomRouteHintsDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_PhantomRouteHintsDecodeErrorZ_get_err(LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_get_err")] public static extern long CResult_PhantomRouteHintsDecodeErrorZ_get_err(long _owner);
+       // struct LDKBlindedForward CResult_BlindedForwardDecodeErrorZ_get_ok(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_get_ok")] public static extern long CResult_BlindedForwardDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_BlindedForwardDecodeErrorZ_get_err(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_get_err")] public static extern long CResult_BlindedForwardDecodeErrorZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_ty_from_ptr")] public static extern long LDKPendingHTLCRouting_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Forward_get_onion_packet")] public static extern long LDKPendingHTLCRouting_Forward_get_onion_packet(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Forward_get_short_channel_id")] public static extern long LDKPendingHTLCRouting_Forward_get_short_channel_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Forward_get_blinded")] public static extern long LDKPendingHTLCRouting_Forward_get_blinded(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Receive_get_payment_data")] public static extern long LDKPendingHTLCRouting_Receive_get_payment_data(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Receive_get_payment_metadata")] public static extern long LDKPendingHTLCRouting_Receive_get_payment_metadata(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Receive_get_incoming_cltv_expiry")] public static extern int LDKPendingHTLCRouting_Receive_get_incoming_cltv_expiry(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Receive_get_phantom_shared_secret")] public static extern long LDKPendingHTLCRouting_Receive_get_phantom_shared_secret(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Receive_get_custom_tlvs")] public static extern long LDKPendingHTLCRouting_Receive_get_custom_tlvs(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_Receive_get_requires_blinded_error")] public static extern bool LDKPendingHTLCRouting_Receive_get_requires_blinded_error(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_data")] public static extern long LDKPendingHTLCRouting_ReceiveKeysend_get_payment_data(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_preimage")] public static extern long LDKPendingHTLCRouting_ReceiveKeysend_get_payment_preimage(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_payment_metadata")] public static extern long LDKPendingHTLCRouting_ReceiveKeysend_get_payment_metadata(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_incoming_cltv_expiry")] public static extern int LDKPendingHTLCRouting_ReceiveKeysend_get_incoming_cltv_expiry(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPendingHTLCRouting_ReceiveKeysend_get_custom_tlvs")] public static extern long LDKPendingHTLCRouting_ReceiveKeysend_get_custom_tlvs(long ptr);
+       // struct LDKPendingHTLCRouting CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_get_ok")] public static extern long CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_PendingHTLCRoutingDecodeErrorZ_get_err(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_get_err")] public static extern long CResult_PendingHTLCRoutingDecodeErrorZ_get_err(long _owner);
+       // struct LDKPendingHTLCInfo CResult_PendingHTLCInfoDecodeErrorZ_get_ok(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_get_ok")] public static extern long CResult_PendingHTLCInfoDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_PendingHTLCInfoDecodeErrorZ_get_err(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_get_err")] public static extern long CResult_PendingHTLCInfoDecodeErrorZ_get_err(long _owner);
+       // enum LDKBlindedFailure CResult_BlindedFailureDecodeErrorZ_get_ok(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_get_ok")] public static extern BlindedFailure CResult_BlindedFailureDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_BlindedFailureDecodeErrorZ_get_err(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_get_err")] public static extern long CResult_BlindedFailureDecodeErrorZ_get_err(long _owner);
        // enum LDKChannelShutdownState CResult_ChannelShutdownStateDecodeErrorZ_get_ok(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_get_ok")] public static extern ChannelShutdownState CResult_ChannelShutdownStateDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_ChannelShutdownStateDecodeErrorZ_get_err(LDKCResult_ChannelShutdownStateDecodeErrorZ *NONNULL_PTR owner);
@@ -955,7 +1008,7 @@ internal class bindings {
                long generate_channel_keys_id(bool inbound, long channel_value_satoshis, long user_channel_id);
                long derive_channel_signer(long channel_value_satoshis, long channel_keys_id);
                long read_chan_signer(long reader);
-               long get_destination_script();
+               long get_destination_script(long channel_keys_id);
                long get_shutdown_scriptpubkey();
        }
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSignerProvider_new")] public static extern long LDKSignerProvider_new_native(long impl_idx);
@@ -981,8 +1034,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_derive_channel_signer")] public static extern long SignerProvider_derive_channel_signer(long _this_arg, long _channel_value_satoshis, long _channel_keys_id);
        // LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ SignerProvider_read_chan_signer LDKSignerProvider *NONNULL_PTR this_arg, struct LDKu8slice reader
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_read_chan_signer")] public static extern long SignerProvider_read_chan_signer(long _this_arg, long _reader);
-       // LDKCResult_CVec_u8ZNoneZ SignerProvider_get_destination_script LDKSignerProvider *NONNULL_PTR this_arg
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_get_destination_script")] public static extern long SignerProvider_get_destination_script(long _this_arg);
+       // LDKCResult_CVec_u8ZNoneZ SignerProvider_get_destination_script LDKSignerProvider *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes channel_keys_id
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_get_destination_script")] public static extern long SignerProvider_get_destination_script(long _this_arg, long _channel_keys_id);
        // LDKCResult_ShutdownScriptNoneZ SignerProvider_get_shutdown_scriptpubkey LDKSignerProvider *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignerProvider_get_shutdown_scriptpubkey")] public static extern long SignerProvider_get_shutdown_scriptpubkey(long _this_arg);
        public interface LDKFeeEstimator {
@@ -1007,12 +1060,38 @@ internal class bindings {
        }
        // uint32_t FeeEstimator_get_est_sat_per_1000_weight LDKFeeEstimator *NONNULL_PTR this_arg, enum LDKConfirmationTarget confirmation_target
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FeeEstimator_get_est_sat_per_1000_weight")] public static extern int FeeEstimator_get_est_sat_per_1000_weight(long _this_arg, ConfirmationTarget _confirmation_target);
+       public interface LDKMessageRouter {
+               long find_path(long sender, long peers, long destination);
+               long create_blinded_paths(long recipient, long peers);
+       }
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageRouter_new")] public static extern long LDKMessageRouter_new_native(long impl_idx);
+       public static long[] LDKMessageRouter_new(LDKMessageRouter impl) {
+               long new_obj_idx = js_objs.Count;
+               int i = 0;
+               for (; i < js_objs.Count; i++) {
+                       if (js_objs[i] == null || !js_objs[i].IsAlive) { new_obj_idx = i; break; }
+               }
+               if (i == js_objs.Count) {
+                       js_objs.Add(new WeakReference(impl));
+               } else {
+                       js_objs[i] = new WeakReference(impl);
+               }
+               long[] ret = new long[2];
+               ret[0] = LDKMessageRouter_new_native(i);
+               ret[1] = i;
+               return ret;
+       }
+       // LDKCResult_OnionMessagePathNoneZ MessageRouter_find_path LDKMessageRouter *NONNULL_PTR this_arg, struct LDKPublicKey sender, struct LDKCVec_PublicKeyZ peers, struct LDKDestination destination
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageRouter_find_path")] public static extern long MessageRouter_find_path(long _this_arg, long _sender, long _peers, long _destination);
+       // LDKCResult_CVec_BlindedPathZNoneZ MessageRouter_create_blinded_paths LDKMessageRouter *NONNULL_PTR this_arg, struct LDKPublicKey recipient, struct LDKCVec_PublicKeyZ peers
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageRouter_create_blinded_paths")] public static extern long MessageRouter_create_blinded_paths(long _this_arg, long _recipient, long _peers);
        public interface LDKRouter {
                long find_route(long payer, long route_params, long first_hops, long inflight_htlcs);
                long find_route_with_id(long payer, long route_params, long first_hops, long inflight_htlcs, long _payment_hash, long _payment_id);
+               long create_blinded_payment_paths(long recipient, long first_hops, long tlvs, long amount_msats);
        }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRouter_new")] public static extern long LDKRouter_new_native(long impl_idx);
-       public static long[] LDKRouter_new(LDKRouter impl) {
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKRouter_new")] public static extern long LDKRouter_new_native(long impl_idx, long MessageRouter);
+       public static long[] LDKRouter_new(LDKRouter impl, long MessageRouter) {
                long new_obj_idx = js_objs.Count;
                int i = 0;
                for (; i < js_objs.Count; i++) {
@@ -1024,7 +1103,7 @@ internal class bindings {
                        js_objs[i] = new WeakReference(impl);
                }
                long[] ret = new long[2];
-               ret[0] = LDKRouter_new_native(i);
+               ret[0] = LDKRouter_new_native(i, MessageRouter);
                ret[1] = i;
                return ret;
        }
@@ -1032,6 +1111,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Router_find_route")] public static extern long Router_find_route(long _this_arg, long _payer, long _route_params, long _first_hops, long _inflight_htlcs);
        // LDKCResult_RouteLightningErrorZ Router_find_route_with_id LDKRouter *NONNULL_PTR this_arg, struct LDKPublicKey payer, const struct LDKRouteParameters *NONNULL_PTR route_params, struct LDKCVec_ChannelDetailsZ *first_hops, struct LDKInFlightHtlcs inflight_htlcs, struct LDKThirtyTwoBytes _payment_hash, struct LDKThirtyTwoBytes _payment_id
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Router_find_route_with_id")] public static extern long Router_find_route_with_id(long _this_arg, long _payer, long _route_params, long _first_hops, long _inflight_htlcs, long __payment_hash, long __payment_id);
+       // LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ Router_create_blinded_payment_paths LDKRouter *NONNULL_PTR this_arg, struct LDKPublicKey recipient, struct LDKCVec_ChannelDetailsZ first_hops, struct LDKReceiveTlvs tlvs, uint64_t amount_msats
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Router_create_blinded_payment_paths")] public static extern long Router_create_blinded_payment_paths(long _this_arg, long _recipient, long _first_hops, long _tlvs, long _amount_msats);
        // struct LDKThirtyTwoBytes C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a")] public static extern long C2Tuple_ThirtyTwoBytesChannelManagerZ_get_a(long _owner);
        // struct LDKChannelManager C2Tuple_ThirtyTwoBytesChannelManagerZ_get_b(LDKC2Tuple_ThirtyTwoBytesChannelManagerZ *NONNULL_PTR owner);
@@ -1148,9 +1229,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_get_a")] public static extern long C2Tuple_PublicKeyTypeZ_get_a(long _owner);
        // struct LDKType C2Tuple_PublicKeyTypeZ_get_b(LDKC2Tuple_PublicKeyTypeZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_get_b")] public static extern long C2Tuple_PublicKeyTypeZ_get_b(long _owner);
+       // struct LDKPublicKey C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a")] public static extern long C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(long _owner);
+       // struct LDKCVec_SocketAddressZ C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b")] public static extern long C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(long _owner);
        public interface LDKOnionMessageContents {
                long tlv_type();
                long write();
+               long debug_str();
        }
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKOnionMessageContents_new")] public static extern long LDKOnionMessageContents_new_native(long impl_idx);
        public static long[] LDKOnionMessageContents_new(LDKOnionMessageContents impl) {
@@ -1173,6 +1259,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_tlv_type")] public static extern long OnionMessageContents_tlv_type(long _this_arg);
        // LDKCVec_u8Z OnionMessageContents_write LDKOnionMessageContents *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_write")] public static extern long OnionMessageContents_write(long _this_arg);
+       // LDKStr OnionMessageContents_debug_str LDKOnionMessageContents *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageContents_debug_str")] public static extern long OnionMessageContents_debug_str(long _this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_OnionMessageContentsZ_ty_from_ptr")] public static extern long LDKCOption_OnionMessageContentsZ_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCOption_OnionMessageContentsZ_Some_get_some")] public static extern long LDKCOption_OnionMessageContentsZ_Some_get_some(long ptr);
        // struct LDKCOption_OnionMessageContentsZ CResult_COption_OnionMessageContentsZDecodeErrorZ_get_ok(LDKCResult_COption_OnionMessageContentsZDecodeErrorZ *NONNULL_PTR owner);
@@ -1256,6 +1344,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_ok")] public static extern long CResult_AcceptChannelV2DecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_AcceptChannelV2DecodeErrorZ_get_err(LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_get_err")] public static extern long CResult_AcceptChannelV2DecodeErrorZ_get_err(long _owner);
+       // struct LDKStfu CResult_StfuDecodeErrorZ_get_ok(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_get_ok")] public static extern long CResult_StfuDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_StfuDecodeErrorZ_get_err(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_get_err")] public static extern long CResult_StfuDecodeErrorZ_get_err(long _owner);
+       // struct LDKSplice CResult_SpliceDecodeErrorZ_get_ok(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_get_ok")] public static extern long CResult_SpliceDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_SpliceDecodeErrorZ_get_err(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_get_err")] public static extern long CResult_SpliceDecodeErrorZ_get_err(long _owner);
+       // struct LDKSpliceAck CResult_SpliceAckDecodeErrorZ_get_ok(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_get_ok")] public static extern long CResult_SpliceAckDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_SpliceAckDecodeErrorZ_get_err(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_get_err")] public static extern long CResult_SpliceAckDecodeErrorZ_get_err(long _owner);
+       // struct LDKSpliceLocked CResult_SpliceLockedDecodeErrorZ_get_ok(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_get_ok")] public static extern long CResult_SpliceLockedDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_SpliceLockedDecodeErrorZ_get_err(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_get_err")] public static extern long CResult_SpliceLockedDecodeErrorZ_get_err(long _owner);
        // struct LDKTxAddInput CResult_TxAddInputDecodeErrorZ_get_ok(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TxAddInputDecodeErrorZ_get_ok")] public static extern long CResult_TxAddInputDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_TxAddInputDecodeErrorZ_get_err(LDKCResult_TxAddInputDecodeErrorZ *NONNULL_PTR owner);
@@ -1360,6 +1464,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_ok")] public static extern long CResult_UpdateFulfillHTLCDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_UpdateFulfillHTLCDecodeErrorZ_get_err(LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_get_err")] public static extern long CResult_UpdateFulfillHTLCDecodeErrorZ_get_err(long _owner);
+       // struct LDKOnionPacket CResult_OnionPacketDecodeErrorZ_get_ok(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_get_ok")] public static extern long CResult_OnionPacketDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_OnionPacketDecodeErrorZ_get_err(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_get_err")] public static extern long CResult_OnionPacketDecodeErrorZ_get_err(long _owner);
        // struct LDKUpdateAddHTLC CResult_UpdateAddHTLCDecodeErrorZ_get_ok(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_get_ok")] public static extern long CResult_UpdateAddHTLCDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_UpdateAddHTLCDecodeErrorZ_get_err(LDKCResult_UpdateAddHTLCDecodeErrorZ *NONNULL_PTR owner);
@@ -1368,6 +1476,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessageDecodeErrorZ_get_ok")] public static extern long CResult_OnionMessageDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_OnionMessageDecodeErrorZ_get_err(LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessageDecodeErrorZ_get_err")] public static extern long CResult_OnionMessageDecodeErrorZ_get_err(long _owner);
+       // struct LDKFinalOnionHopData CResult_FinalOnionHopDataDecodeErrorZ_get_ok(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_get_ok")] public static extern long CResult_FinalOnionHopDataDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_FinalOnionHopDataDecodeErrorZ_get_err(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_get_err")] public static extern long CResult_FinalOnionHopDataDecodeErrorZ_get_err(long _owner);
        // struct LDKPing CResult_PingDecodeErrorZ_get_ok(LDKCResult_PingDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PingDecodeErrorZ_get_ok")] public static extern long CResult_PingDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_PingDecodeErrorZ_get_err(LDKCResult_PingDecodeErrorZ *NONNULL_PTR owner);
@@ -1580,6 +1692,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_purpose")] public static extern long LDKEvent_PaymentClaimed_get_purpose(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_htlcs")] public static extern long LDKEvent_PaymentClaimed_get_htlcs(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentClaimed_get_sender_intended_total_msat")] public static extern long LDKEvent_PaymentClaimed_get_sender_intended_total_msat(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ConnectionNeeded_get_node_id")] public static extern long LDKEvent_ConnectionNeeded_get_node_id(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ConnectionNeeded_get_addresses")] public static extern long LDKEvent_ConnectionNeeded_get_addresses(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_InvoiceRequestFailed_get_payment_id")] public static extern long LDKEvent_InvoiceRequestFailed_get_payment_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentSent_get_payment_id")] public static extern long LDKEvent_PaymentSent_get_payment_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_PaymentSent_get_payment_preimage")] public static extern long LDKEvent_PaymentSent_get_payment_preimage(long ptr);
@@ -1631,6 +1745,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_reason")] public static extern long LDKEvent_ChannelClosed_get_reason(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_counterparty_node_id")] public static extern long LDKEvent_ChannelClosed_get_counterparty_node_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_channel_capacity_sats")] public static extern long LDKEvent_ChannelClosed_get_channel_capacity_sats(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_ChannelClosed_get_channel_funding_txo")] public static extern long LDKEvent_ChannelClosed_get_channel_funding_txo(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_DiscardFunding_get_channel_id")] public static extern long LDKEvent_DiscardFunding_get_channel_id(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_DiscardFunding_get_transaction")] public static extern long LDKEvent_DiscardFunding_get_transaction(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKEvent_OpenChannelRequest_get_temporary_channel_id")] public static extern long LDKEvent_OpenChannelRequest_get_temporary_channel_id(long ptr);
@@ -1722,10 +1837,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_ok")] public static extern long CResult_UntrustedStringDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_UntrustedStringDecodeErrorZ_get_err(LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UntrustedStringDecodeErrorZ_get_err")] public static extern long CResult_UntrustedStringDecodeErrorZ_get_err(long _owner);
-       // struct LDKReceiveTlvs CResult_ReceiveTlvsDecodeErrorZ_get_ok(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_get_ok")] public static extern long CResult_ReceiveTlvsDecodeErrorZ_get_ok(long _owner);
-       // struct LDKDecodeError CResult_ReceiveTlvsDecodeErrorZ_get_err(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_get_err")] public static extern long CResult_ReceiveTlvsDecodeErrorZ_get_err(long _owner);
+       // struct LDKThirtyTwoBytes C2Tuple__u832u16Z_get_a(LDKC2Tuple__u832u16Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u832u16Z_get_a")] public static extern long C2Tuple__u832u16Z_get_a(long _owner);
+       // uint16_t C2Tuple__u832u16Z_get_b(LDKC2Tuple__u832u16Z *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u832u16Z_get_b")] public static extern short C2Tuple__u832u16Z_get_b(long _owner);
        // struct LDKPaymentRelay CResult_PaymentRelayDecodeErrorZ_get_ok(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_get_ok")] public static extern long CResult_PaymentRelayDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_PaymentRelayDecodeErrorZ_get_err(LDKCResult_PaymentRelayDecodeErrorZ *NONNULL_PTR owner);
@@ -1734,42 +1849,33 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_ok")] public static extern long CResult_PaymentConstraintsDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_PaymentConstraintsDecodeErrorZ_get_err(LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_get_err")] public static extern long CResult_PaymentConstraintsDecodeErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentError_ty_from_ptr")] public static extern long LDKPaymentError_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentError_Invoice_get_invoice")] public static extern long LDKPaymentError_Invoice_get_invoice(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKPaymentError_Sending_get_sending")] public static extern RetryableSendFailure LDKPaymentError_Sending_get_sending(long ptr);
-       // struct LDKThirtyTwoBytes CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_ok")] public static extern long CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(long _owner);
-       // struct LDKPaymentError CResult_ThirtyTwoBytesPaymentErrorZ_get_err(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_get_err")] public static extern long CResult_ThirtyTwoBytesPaymentErrorZ_get_err(long _owner);
-       // void CResult_NonePaymentErrorZ_get_ok(LDKCResult_NonePaymentErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_get_ok")] public static extern void CResult_NonePaymentErrorZ_get_ok(long _owner);
-       // struct LDKPaymentError CResult_NonePaymentErrorZ_get_err(LDKCResult_NonePaymentErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_get_err")] public static extern long CResult_NonePaymentErrorZ_get_err(long _owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKProbingError_ty_from_ptr")] public static extern long LDKProbingError_ty_from_ptr(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKProbingError_Invoice_get_invoice")] public static extern long LDKProbingError_Invoice_get_invoice(long ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKProbingError_Sending_get_sending")] public static extern long LDKProbingError_Sending_get_sending(long ptr);
-       // struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(long _owner);
-       // struct LDKProbingError CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(long _owner);
+       // struct LDKThirtyTwoBytes C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a")] public static extern long C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(long _owner);
+       // struct LDKRecipientOnionFields C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b")] public static extern long C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(long _owner);
+       // struct LDKRouteParameters C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c")] public static extern long C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(long _owner);
+       // struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok")] public static extern long CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(long _owner);
+       // void CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err")] public static extern void CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_err(long _owner);
        // struct LDKStr CResult_StrSecp256k1ErrorZ_get_ok(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_get_ok")] public static extern long CResult_StrSecp256k1ErrorZ_get_ok(long _owner);
        // enum LDKSecp256k1Error CResult_StrSecp256k1ErrorZ_get_err(LDKCResult_StrSecp256k1ErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_get_err")] public static extern Secp256k1Error CResult_StrSecp256k1ErrorZ_get_err(long _owner);
-       // struct LDKOnionMessagePath CResult_OnionMessagePathNoneZ_get_ok(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_get_ok")] public static extern long CResult_OnionMessagePathNoneZ_get_ok(long _owner);
-       // void CResult_OnionMessagePathNoneZ_get_err(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_get_err")] public static extern void CResult_OnionMessagePathNoneZ_get_err(long _owner);
-       // struct LDKPublicKey C2Tuple_PublicKeyOnionMessageZ_get_a(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyOnionMessageZ_get_a")] public static extern long C2Tuple_PublicKeyOnionMessageZ_get_a(long _owner);
-       // struct LDKOnionMessage C2Tuple_PublicKeyOnionMessageZ_get_b(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyOnionMessageZ_get_b")] public static extern long C2Tuple_PublicKeyOnionMessageZ_get_b(long _owner);
+       // struct LDKPublicKey C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a")] public static extern long C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(long _owner);
+       // struct LDKOnionMessage C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b")] public static extern long C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(long _owner);
+       // struct LDKCOption_CVec_SocketAddressZZ C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c")] public static extern long C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSendError_ty_from_ptr")] public static extern long LDKSendError_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSendError_Secp256k1_get_secp256k1")] public static extern Secp256k1Error LDKSendError_Secp256k1_get_secp256k1(long ptr);
-       // struct LDKC2Tuple_PublicKeyOnionMessageZ CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok")] public static extern long CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(long _owner);
-       // struct LDKSendError CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err")] public static extern long CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSendError_InvalidFirstHop_get_invalid_first_hop")] public static extern long LDKSendError_InvalidFirstHop_get_invalid_first_hop(long ptr);
+       // struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok")] public static extern long CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(long _owner);
+       // struct LDKSendError CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err")] public static extern long CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(long _owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKParsedOnionMessageContents_ty_from_ptr")] public static extern long LDKParsedOnionMessageContents_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKParsedOnionMessageContents_Offers_get_offers")] public static extern long LDKParsedOnionMessageContents_Offers_get_offers(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKParsedOnionMessageContents_Custom_get_custom")] public static extern long LDKParsedOnionMessageContents_Custom_get_custom(long ptr);
@@ -1783,10 +1889,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PeeledOnionNoneZ_get_ok")] public static extern long CResult_PeeledOnionNoneZ_get_ok(long _owner);
        // void CResult_PeeledOnionNoneZ_get_err(LDKCResult_PeeledOnionNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PeeledOnionNoneZ_get_err")] public static extern void CResult_PeeledOnionNoneZ_get_err(long _owner);
-       // void CResult_NoneSendErrorZ_get_ok(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneSendErrorZ_get_ok")] public static extern void CResult_NoneSendErrorZ_get_ok(long _owner);
-       // struct LDKSendError CResult_NoneSendErrorZ_get_err(LDKCResult_NoneSendErrorZ *NONNULL_PTR owner);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneSendErrorZ_get_err")] public static extern long CResult_NoneSendErrorZ_get_err(long _owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSendSuccess_ty_from_ptr")] public static extern long LDKSendSuccess_ty_from_ptr(long ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKSendSuccess_BufferedAwaitingConnection_get_buffered_awaiting_connection")] public static extern long LDKSendSuccess_BufferedAwaitingConnection_get_buffered_awaiting_connection(long ptr);
+       // struct LDKSendSuccess CResult_SendSuccessSendErrorZ_get_ok(LDKCResult_SendSuccessSendErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SendSuccessSendErrorZ_get_ok")] public static extern long CResult_SendSuccessSendErrorZ_get_ok(long _owner);
+       // struct LDKSendError CResult_SendSuccessSendErrorZ_get_err(LDKCResult_SendSuccessSendErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SendSuccessSendErrorZ_get_err")] public static extern long CResult_SendSuccessSendErrorZ_get_err(long _owner);
        // struct LDKBlindedPath CResult_BlindedPathNoneZ_get_ok(LDKCResult_BlindedPathNoneZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPathNoneZ_get_ok")] public static extern long CResult_BlindedPathNoneZ_get_ok(long _owner);
        // void CResult_BlindedPathNoneZ_get_err(LDKCResult_BlindedPathNoneZ *NONNULL_PTR owner);
@@ -1807,6 +1915,30 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_ok")] public static extern long CResult_InvoiceErrorDecodeErrorZ_get_ok(long _owner);
        // struct LDKDecodeError CResult_InvoiceErrorDecodeErrorZ_get_err(LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR owner);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InvoiceErrorDecodeErrorZ_get_err")] public static extern long CResult_InvoiceErrorDecodeErrorZ_get_err(long _owner);
+       // struct LDKDelayedPaymentBasepoint CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok")] public static extern long CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_get_err")] public static extern long CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(long _owner);
+       // struct LDKDelayedPaymentKey CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_get_ok")] public static extern long CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_DelayedPaymentKeyDecodeErrorZ_get_err(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_get_err")] public static extern long CResult_DelayedPaymentKeyDecodeErrorZ_get_err(long _owner);
+       // struct LDKHtlcBasepoint CResult_HtlcBasepointDecodeErrorZ_get_ok(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_get_ok")] public static extern long CResult_HtlcBasepointDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_HtlcBasepointDecodeErrorZ_get_err(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_get_err")] public static extern long CResult_HtlcBasepointDecodeErrorZ_get_err(long _owner);
+       // struct LDKHtlcKey CResult_HtlcKeyDecodeErrorZ_get_ok(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_get_ok")] public static extern long CResult_HtlcKeyDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_HtlcKeyDecodeErrorZ_get_err(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_get_err")] public static extern long CResult_HtlcKeyDecodeErrorZ_get_err(long _owner);
+       // struct LDKRevocationBasepoint CResult_RevocationBasepointDecodeErrorZ_get_ok(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_get_ok")] public static extern long CResult_RevocationBasepointDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_RevocationBasepointDecodeErrorZ_get_err(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_get_err")] public static extern long CResult_RevocationBasepointDecodeErrorZ_get_err(long _owner);
+       // struct LDKRevocationKey CResult_RevocationKeyDecodeErrorZ_get_ok(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_get_ok")] public static extern long CResult_RevocationKeyDecodeErrorZ_get_ok(long _owner);
+       // struct LDKDecodeError CResult_RevocationKeyDecodeErrorZ_get_err(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR owner);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_get_err")] public static extern long CResult_RevocationKeyDecodeErrorZ_get_err(long _owner);
        public interface LDKFilter {
                void register_tx(long txid, long script_pubkey);
                void register_output(long output);
@@ -2005,7 +2137,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Confirm_transaction_unconfirmed")] public static extern void Confirm_transaction_unconfirmed(long _this_arg, long _txid);
        // void Confirm_best_block_updated LDKConfirm *NONNULL_PTR this_arg, const uint8_t (*header)[80], uint32_t height
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Confirm_best_block_updated")] public static extern void Confirm_best_block_updated(long _this_arg, long _header, int _height);
-       // LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ Confirm_get_relevant_txids LDKConfirm *NONNULL_PTR this_arg
+       // LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ Confirm_get_relevant_txids LDKConfirm *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Confirm_get_relevant_txids")] public static extern long Confirm_get_relevant_txids(long _this_arg);
        public interface LDKEventHandler {
                void handle_event(long _event);
@@ -2085,6 +2217,10 @@ internal class bindings {
                void handle_channel_ready(long their_node_id, long msg);
                void handle_shutdown(long their_node_id, long msg);
                void handle_closing_signed(long their_node_id, long msg);
+               void handle_stfu(long their_node_id, long msg);
+               void handle_splice(long their_node_id, long msg);
+               void handle_splice_ack(long their_node_id, long msg);
+               void handle_splice_locked(long their_node_id, long msg);
                void handle_tx_add_input(long their_node_id, long msg);
                void handle_tx_add_output(long their_node_id, long msg);
                void handle_tx_remove_input(long their_node_id, long msg);
@@ -2146,6 +2282,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_shutdown")] public static extern void ChannelMessageHandler_handle_shutdown(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_closing_signed LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKClosingSigned *NONNULL_PTR msg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_closing_signed")] public static extern void ChannelMessageHandler_handle_closing_signed(long _this_arg, long _their_node_id, long _msg);
+       // void ChannelMessageHandler_handle_stfu LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKStfu *NONNULL_PTR msg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_stfu")] public static extern void ChannelMessageHandler_handle_stfu(long _this_arg, long _their_node_id, long _msg);
+       // void ChannelMessageHandler_handle_splice LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKSplice *NONNULL_PTR msg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_splice")] public static extern void ChannelMessageHandler_handle_splice(long _this_arg, long _their_node_id, long _msg);
+       // void ChannelMessageHandler_handle_splice_ack LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKSpliceAck *NONNULL_PTR msg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_splice_ack")] public static extern void ChannelMessageHandler_handle_splice_ack(long _this_arg, long _their_node_id, long _msg);
+       // void ChannelMessageHandler_handle_splice_locked LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKSpliceLocked *NONNULL_PTR msg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_splice_locked")] public static extern void ChannelMessageHandler_handle_splice_locked(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_add_input LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxAddInput *NONNULL_PTR msg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMessageHandler_handle_tx_add_input")] public static extern void ChannelMessageHandler_handle_tx_add_input(long _this_arg, long _their_node_id, long _msg);
        // void ChannelMessageHandler_handle_tx_add_output LDKChannelMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id, const struct LDKTxAddOutput *NONNULL_PTR msg
@@ -2280,10 +2424,12 @@ internal class bindings {
        // LDKInitFeatures RoutingMessageHandler_provided_init_features LDKRoutingMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_provided_init_features")] public static extern long RoutingMessageHandler_provided_init_features(long _this_arg, long _their_node_id);
        public interface LDKOnionMessageHandler {
+               long get_and_clear_connections_needed();
                void handle_onion_message(long peer_node_id, long msg);
                long next_onion_message_for_peer(long peer_node_id);
                long peer_connected(long their_node_id, long init, bool inbound);
                void peer_disconnected(long their_node_id);
+               void timer_tick_occurred();
                long provided_node_features();
                long provided_init_features(long their_node_id);
        }
@@ -2304,6 +2450,8 @@ internal class bindings {
                ret[1] = i;
                return ret;
        }
+       // LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ OnionMessageHandler_get_and_clear_connections_needed LDKOnionMessageHandler *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_get_and_clear_connections_needed")] public static extern long OnionMessageHandler_get_and_clear_connections_needed(long _this_arg);
        // void OnionMessageHandler_handle_onion_message LDKOnionMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey peer_node_id, const struct LDKOnionMessage *NONNULL_PTR msg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_handle_onion_message")] public static extern void OnionMessageHandler_handle_onion_message(long _this_arg, long _peer_node_id, long _msg);
        // LDKOnionMessage OnionMessageHandler_next_onion_message_for_peer LDKOnionMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey peer_node_id
@@ -2312,6 +2460,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_peer_connected")] public static extern long OnionMessageHandler_peer_connected(long _this_arg, long _their_node_id, long _init, bool _inbound);
        // void OnionMessageHandler_peer_disconnected LDKOnionMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_peer_disconnected")] public static extern void OnionMessageHandler_peer_disconnected(long _this_arg, long _their_node_id);
+       // void OnionMessageHandler_timer_tick_occurred LDKOnionMessageHandler *NONNULL_PTR this_arg
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_timer_tick_occurred")] public static extern void OnionMessageHandler_timer_tick_occurred(long _this_arg);
        // LDKNodeFeatures OnionMessageHandler_provided_node_features LDKOnionMessageHandler *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_provided_node_features")] public static extern long OnionMessageHandler_provided_node_features(long _this_arg);
        // LDKInitFeatures OnionMessageHandler_provided_init_features LDKOnionMessageHandler *NONNULL_PTR this_arg, struct LDKPublicKey their_node_id
@@ -2461,31 +2611,9 @@ internal class bindings {
        }
        // LDKCVec_u8Z Score_write LDKScore *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Score_write")] public static extern long Score_write(long _this_arg);
-       public interface LDKMessageRouter {
-               long find_path(long sender, long peers, long destination);
-       }
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKMessageRouter_new")] public static extern long LDKMessageRouter_new_native(long impl_idx);
-       public static long[] LDKMessageRouter_new(LDKMessageRouter impl) {
-               long new_obj_idx = js_objs.Count;
-               int i = 0;
-               for (; i < js_objs.Count; i++) {
-                       if (js_objs[i] == null || !js_objs[i].IsAlive) { new_obj_idx = i; break; }
-               }
-               if (i == js_objs.Count) {
-                       js_objs.Add(new WeakReference(impl));
-               } else {
-                       js_objs[i] = new WeakReference(impl);
-               }
-               long[] ret = new long[2];
-               ret[0] = LDKMessageRouter_new_native(i);
-               ret[1] = i;
-               return ret;
-       }
-       // LDKCResult_OnionMessagePathNoneZ MessageRouter_find_path LDKMessageRouter *NONNULL_PTR this_arg, struct LDKPublicKey sender, struct LDKCVec_PublicKeyZ peers, struct LDKDestination destination
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageRouter_find_path")] public static extern long MessageRouter_find_path(long _this_arg, long _sender, long _peers, long _destination);
        public interface LDKCoinSelectionSource {
                long select_confirmed_utxos(long claim_id, long must_spend, long must_pay_to, int target_feerate_sat_per_1000_weight);
-               long sign_tx(long tx);
+               long sign_psbt(long psbt);
        }
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKCoinSelectionSource_new")] public static extern long LDKCoinSelectionSource_new_native(long impl_idx);
        public static long[] LDKCoinSelectionSource_new(LDKCoinSelectionSource impl) {
@@ -2506,12 +2634,12 @@ internal class bindings {
        }
        // LDKCResult_CoinSelectionNoneZ CoinSelectionSource_select_confirmed_utxos LDKCoinSelectionSource *NONNULL_PTR this_arg, struct LDKThirtyTwoBytes claim_id, struct LDKCVec_InputZ must_spend, struct LDKCVec_TxOutZ must_pay_to, uint32_t target_feerate_sat_per_1000_weight
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelectionSource_select_confirmed_utxos")] public static extern long CoinSelectionSource_select_confirmed_utxos(long _this_arg, long _claim_id, long _must_spend, long _must_pay_to, int _target_feerate_sat_per_1000_weight);
-       // LDKCResult_TransactionNoneZ CoinSelectionSource_sign_tx LDKCoinSelectionSource *NONNULL_PTR this_arg, struct LDKTransaction tx
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelectionSource_sign_tx")] public static extern long CoinSelectionSource_sign_tx(long _this_arg, long _tx);
+       // LDKCResult_TransactionNoneZ CoinSelectionSource_sign_psbt LDKCoinSelectionSource *NONNULL_PTR this_arg, struct LDKCVec_u8Z psbt
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CoinSelectionSource_sign_psbt")] public static extern long CoinSelectionSource_sign_psbt(long _this_arg, long _psbt);
        public interface LDKWalletSource {
                long list_confirmed_utxos();
                long get_change_script();
-               long sign_tx(long tx);
+               long sign_psbt(long psbt);
        }
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKWalletSource_new")] public static extern long LDKWalletSource_new_native(long impl_idx);
        public static long[] LDKWalletSource_new(LDKWalletSource impl) {
@@ -2534,8 +2662,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WalletSource_list_confirmed_utxos")] public static extern long WalletSource_list_confirmed_utxos(long _this_arg);
        // LDKCResult_CVec_u8ZNoneZ WalletSource_get_change_script LDKWalletSource *NONNULL_PTR this_arg
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WalletSource_get_change_script")] public static extern long WalletSource_get_change_script(long _this_arg);
-       // LDKCResult_TransactionNoneZ WalletSource_sign_tx LDKWalletSource *NONNULL_PTR this_arg, struct LDKTransaction tx
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WalletSource_sign_tx")] public static extern long WalletSource_sign_tx(long _this_arg, long _tx);
+       // LDKCResult_TransactionNoneZ WalletSource_sign_psbt LDKWalletSource *NONNULL_PTR this_arg, struct LDKCVec_u8Z psbt
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WalletSource_sign_psbt")] public static extern long WalletSource_sign_psbt(long _this_arg, long _psbt);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKGossipSync_ty_from_ptr")] public static extern long LDKGossipSync_ty_from_ptr(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKGossipSync_P2P_get_p2p")] public static extern long LDKGossipSync_P2P_get_p2p(long ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LDKGossipSync_Rapid_get_rapid")] public static extern long LDKGossipSync_Rapid_get_rapid(long ptr);
@@ -2552,6 +2680,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_U128_le_bytes")] public static extern long U128_le_bytes(long _val);
        // struct LDKU128 U128_new(struct LDKSixteenBytes le_bytes);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_U128_new")] public static extern long U128_new(long _le_bytes);
+       // struct LDKWitnessProgram WitnessProgram_new(struct LDKWitnessVersion version, struct LDKCVec_u8Z program);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WitnessProgram_new")] public static extern long WitnessProgram_new(byte _version, long _program);
+       // struct LDKWitnessVersion WitnessProgram_get_version(const struct LDKWitnessProgram *NONNULL_PTR prog);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WitnessProgram_get_version")] public static extern byte WitnessProgram_get_version(long _prog);
+       // struct LDKu8slice WitnessProgram_get_program(const struct LDKWitnessProgram *NONNULL_PTR prog);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WitnessProgram_get_program")] public static extern long WitnessProgram_get_program(long _prog);
+       // uint64_t WitnessProgram_clone_ptr(LDKWitnessProgram *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WitnessProgram_clone_ptr")] public static extern long WitnessProgram_clone_ptr(long _arg);
+       // struct LDKWitnessProgram WitnessProgram_clone(const struct LDKWitnessProgram *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WitnessProgram_clone")] public static extern long WitnessProgram_clone(long _orig);
+       // void WitnessProgram_free(struct LDKWitnessProgram o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WitnessProgram_free")] public static extern void WitnessProgram_free(long _o);
        // struct LDKBigEndianScalar BigEndianScalar_new(struct LDKThirtyTwoBytes big_endian_bytes);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BigEndianScalar_new")] public static extern long BigEndianScalar_new(long _big_endian_bytes);
        // uint64_t Bech32Error_clone_ptr(LDKBech32Error *NONNULL_PTR arg);
@@ -2564,12 +2704,26 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Transaction_free")] public static extern void Transaction_free(long __res);
        // void Witness_free(struct LDKWitness _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Witness_free")] public static extern void Witness_free(long __res);
-       // void TxIn_free(struct LDKTxIn _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_free")] public static extern void TxIn_free(long __res);
        // struct LDKTxIn TxIn_new(struct LDKWitness witness, struct LDKCVec_u8Z script_sig, uint32_t sequence, struct LDKThirtyTwoBytes previous_txid, uint32_t previous_vout);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_new")] public static extern long TxIn_new(long _witness, long _script_sig, int _sequence, long _previous_txid, int _previous_vout);
+       // struct LDKWitness TxIn_get_witness(const struct LDKTxIn *NONNULL_PTR txin);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_witness")] public static extern long TxIn_get_witness(long _txin);
+       // struct LDKu8slice TxIn_get_script_sig(const struct LDKTxIn *NONNULL_PTR txin);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_script_sig")] public static extern long TxIn_get_script_sig(long _txin);
+       // uint32_t TxIn_get_sequence(const struct LDKTxIn *NONNULL_PTR txin);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_sequence")] public static extern int TxIn_get_sequence(long _txin);
+       // struct LDKThirtyTwoBytes TxIn_get_previous_txid(const struct LDKTxIn *NONNULL_PTR txin);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_previous_txid")] public static extern long TxIn_get_previous_txid(long _txin);
+       // uint32_t TxIn_get_previous_vout(const struct LDKTxIn *NONNULL_PTR txin);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_get_previous_vout")] public static extern int TxIn_get_previous_vout(long _txin);
+       // void TxIn_free(struct LDKTxIn _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxIn_free")] public static extern void TxIn_free(long __res);
        // struct LDKTxOut TxOut_new(struct LDKCVec_u8Z script_pubkey, uint64_t value);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_new")] public static extern long TxOut_new(long _script_pubkey, long _value);
+       // struct LDKu8slice TxOut_get_script_pubkey(const struct LDKTxOut *NONNULL_PTR txout);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_get_script_pubkey")] public static extern long TxOut_get_script_pubkey(long _txout);
+       // uint64_t TxOut_get_value(const struct LDKTxOut *NONNULL_PTR txout);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_get_value")] public static extern long TxOut_get_value(long _txout);
        // void TxOut_free(struct LDKTxOut _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxOut_free")] public static extern void TxOut_free(long __res);
        // uint64_t TxOut_clone_ptr(LDKTxOut *NONNULL_PTR arg);
@@ -2772,26 +2926,26 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_clone_ptr")] public static extern long COption_u32Z_clone_ptr(long _arg);
        // struct LDKCOption_u32Z COption_u32Z_clone(const struct LDKCOption_u32Z *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_u32Z_clone")] public static extern long COption_u32Z_clone(long _orig);
-       // uint64_t C2Tuple_CVec_u8ZusizeZ_clone_ptr(LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8ZusizeZ_clone_ptr")] public static extern long C2Tuple_CVec_u8ZusizeZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_CVec_u8ZusizeZ C2Tuple_CVec_u8ZusizeZ_clone(const struct LDKC2Tuple_CVec_u8ZusizeZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8ZusizeZ_clone")] public static extern long C2Tuple_CVec_u8ZusizeZ_clone(long _orig);
-       // struct LDKC2Tuple_CVec_u8ZusizeZ C2Tuple_CVec_u8ZusizeZ_new(struct LDKCVec_u8Z a, uintptr_t b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8ZusizeZ_new")] public static extern long C2Tuple_CVec_u8ZusizeZ_new(long _a, long _b);
-       // void C2Tuple_CVec_u8ZusizeZ_free(struct LDKC2Tuple_CVec_u8ZusizeZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8ZusizeZ_free")] public static extern void C2Tuple_CVec_u8ZusizeZ_free(long __res);
-       // struct LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok(struct LDKC2Tuple_CVec_u8ZusizeZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok")] public static extern long CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err")] public static extern long CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err();
-       // bool CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(const struct LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(long _o);
-       // void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free(struct LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free")] public static extern void CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free(long __res);
-       // uint64_t CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(const struct LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone")] public static extern long CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(long _orig);
+       // uint64_t C2Tuple_CVec_u8Zu64Z_clone_ptr(LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8Zu64Z_clone_ptr")] public static extern long C2Tuple_CVec_u8Zu64Z_clone_ptr(long _arg);
+       // struct LDKC2Tuple_CVec_u8Zu64Z C2Tuple_CVec_u8Zu64Z_clone(const struct LDKC2Tuple_CVec_u8Zu64Z *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8Zu64Z_clone")] public static extern long C2Tuple_CVec_u8Zu64Z_clone(long _orig);
+       // struct LDKC2Tuple_CVec_u8Zu64Z C2Tuple_CVec_u8Zu64Z_new(struct LDKCVec_u8Z a, uint64_t b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8Zu64Z_new")] public static extern long C2Tuple_CVec_u8Zu64Z_new(long _a, long _b);
+       // void C2Tuple_CVec_u8Zu64Z_free(struct LDKC2Tuple_CVec_u8Zu64Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_CVec_u8Zu64Z_free")] public static extern void C2Tuple_CVec_u8Zu64Z_free(long __res);
+       // struct LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok(struct LDKC2Tuple_CVec_u8Zu64Z o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok")] public static extern long CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err")] public static extern long CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err();
+       // bool CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(const struct LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(long _o);
+       // void CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free(struct LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free")] public static extern void CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free(long __res);
+       // uint64_t CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(const struct LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone")] public static extern long CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(long _orig);
        // struct LDKCResult_ChannelDerivationParametersDecodeErrorZ CResult_ChannelDerivationParametersDecodeErrorZ_ok(struct LDKChannelDerivationParameters o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelDerivationParametersDecodeErrorZ_ok")] public static extern long CResult_ChannelDerivationParametersDecodeErrorZ_ok(long _o);
        // struct LDKCResult_ChannelDerivationParametersDecodeErrorZ CResult_ChannelDerivationParametersDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2828,40 +2982,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneNoneZ_clone_ptr")] public static extern long CResult_NoneNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_NoneNoneZ CResult_NoneNoneZ_clone(const struct LDKCResult_NoneNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneNoneZ_clone")] public static extern long CResult_NoneNoneZ_clone(long _orig);
-       // void CVec_ECDSASignatureZ_free(struct LDKCVec_ECDSASignatureZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ECDSASignatureZ_free")] public static extern void CVec_ECDSASignatureZ_free(long __res);
-       // uint64_t C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(const struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(long _orig);
-       // struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(struct LDKECDSASignature a, struct LDKCVec_ECDSASignatureZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(long _a, long _b);
-       // void C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free")] public static extern void C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(long __res);
-       // struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err();
-       // bool CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(const struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(long _o);
-       // void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free")] public static extern void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(long __res);
-       // uint64_t CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(const struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(long _orig);
-       // struct LDKCResult_ECDSASignatureNoneZ CResult_ECDSASignatureNoneZ_ok(struct LDKECDSASignature o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_ok")] public static extern long CResult_ECDSASignatureNoneZ_ok(long _o);
-       // struct LDKCResult_ECDSASignatureNoneZ CResult_ECDSASignatureNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_err")] public static extern long CResult_ECDSASignatureNoneZ_err();
-       // bool CResult_ECDSASignatureNoneZ_is_ok(const struct LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_is_ok")] public static extern bool CResult_ECDSASignatureNoneZ_is_ok(long _o);
-       // void CResult_ECDSASignatureNoneZ_free(struct LDKCResult_ECDSASignatureNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_free")] public static extern void CResult_ECDSASignatureNoneZ_free(long __res);
-       // uint64_t CResult_ECDSASignatureNoneZ_clone_ptr(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_clone_ptr")] public static extern long CResult_ECDSASignatureNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_ECDSASignatureNoneZ CResult_ECDSASignatureNoneZ_clone(const struct LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_clone")] public static extern long CResult_ECDSASignatureNoneZ_clone(long _orig);
        // struct LDKCResult_PublicKeyNoneZ CResult_PublicKeyNoneZ_ok(struct LDKPublicKey o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PublicKeyNoneZ_ok")] public static extern long CResult_PublicKeyNoneZ_ok(long _o);
        // struct LDKCResult_PublicKeyNoneZ CResult_PublicKeyNoneZ_err(void);
@@ -2910,6 +3030,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_clone_ptr")] public static extern long CResult_SchnorrSignatureNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_SchnorrSignatureNoneZ CResult_SchnorrSignatureNoneZ_clone(const struct LDKCResult_SchnorrSignatureNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SchnorrSignatureNoneZ_clone")] public static extern long CResult_SchnorrSignatureNoneZ_clone(long _orig);
+       // struct LDKCResult_ECDSASignatureNoneZ CResult_ECDSASignatureNoneZ_ok(struct LDKECDSASignature o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_ok")] public static extern long CResult_ECDSASignatureNoneZ_ok(long _o);
+       // struct LDKCResult_ECDSASignatureNoneZ CResult_ECDSASignatureNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_err")] public static extern long CResult_ECDSASignatureNoneZ_err();
+       // bool CResult_ECDSASignatureNoneZ_is_ok(const struct LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_is_ok")] public static extern bool CResult_ECDSASignatureNoneZ_is_ok(long _o);
+       // void CResult_ECDSASignatureNoneZ_free(struct LDKCResult_ECDSASignatureNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_free")] public static extern void CResult_ECDSASignatureNoneZ_free(long __res);
+       // uint64_t CResult_ECDSASignatureNoneZ_clone_ptr(LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_clone_ptr")] public static extern long CResult_ECDSASignatureNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_ECDSASignatureNoneZ CResult_ECDSASignatureNoneZ_clone(const struct LDKCResult_ECDSASignatureNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ECDSASignatureNoneZ_clone")] public static extern long CResult_ECDSASignatureNoneZ_clone(long _orig);
        // struct LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ CResult_WriteableEcdsaChannelSignerDecodeErrorZ_ok(struct LDKWriteableEcdsaChannelSigner o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WriteableEcdsaChannelSignerDecodeErrorZ_ok")] public static extern long CResult_WriteableEcdsaChannelSignerDecodeErrorZ_ok(long _o);
        // struct LDKCResult_WriteableEcdsaChannelSignerDecodeErrorZ CResult_WriteableEcdsaChannelSignerDecodeErrorZ_err(struct LDKDecodeError e);
@@ -2966,20 +3098,40 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_boolZ_clone_ptr")] public static extern long COption_boolZ_clone_ptr(long _arg);
        // struct LDKCOption_boolZ COption_boolZ_clone(const struct LDKCOption_boolZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_boolZ_clone")] public static extern long COption_boolZ_clone(long _orig);
-       // void CVec_CVec_u8ZZ_free(struct LDKCVec_CVec_u8ZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_CVec_u8ZZ_free")] public static extern void CVec_CVec_u8ZZ_free(long __res);
-       // struct LDKCResult_CVec_CVec_u8ZZNoneZ CResult_CVec_CVec_u8ZZNoneZ_ok(struct LDKCVec_CVec_u8ZZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_ok")] public static extern long CResult_CVec_CVec_u8ZZNoneZ_ok(long _o);
-       // struct LDKCResult_CVec_CVec_u8ZZNoneZ CResult_CVec_CVec_u8ZZNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_err")] public static extern long CResult_CVec_CVec_u8ZZNoneZ_err();
-       // bool CResult_CVec_CVec_u8ZZNoneZ_is_ok(const struct LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_is_ok")] public static extern bool CResult_CVec_CVec_u8ZZNoneZ_is_ok(long _o);
-       // void CResult_CVec_CVec_u8ZZNoneZ_free(struct LDKCResult_CVec_CVec_u8ZZNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_free")] public static extern void CResult_CVec_CVec_u8ZZNoneZ_free(long __res);
-       // uint64_t CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_clone_ptr")] public static extern long CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_CVec_CVec_u8ZZNoneZ CResult_CVec_CVec_u8ZZNoneZ_clone(const struct LDKCResult_CVec_CVec_u8ZZNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_CVec_u8ZZNoneZ_clone")] public static extern long CResult_CVec_CVec_u8ZZNoneZ_clone(long _orig);
+       // struct LDKCResult_WitnessNoneZ CResult_WitnessNoneZ_ok(struct LDKWitness o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_ok")] public static extern long CResult_WitnessNoneZ_ok(long _o);
+       // struct LDKCResult_WitnessNoneZ CResult_WitnessNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_err")] public static extern long CResult_WitnessNoneZ_err();
+       // bool CResult_WitnessNoneZ_is_ok(const struct LDKCResult_WitnessNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_is_ok")] public static extern bool CResult_WitnessNoneZ_is_ok(long _o);
+       // void CResult_WitnessNoneZ_free(struct LDKCResult_WitnessNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_free")] public static extern void CResult_WitnessNoneZ_free(long __res);
+       // uint64_t CResult_WitnessNoneZ_clone_ptr(LDKCResult_WitnessNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_clone_ptr")] public static extern long CResult_WitnessNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_WitnessNoneZ CResult_WitnessNoneZ_clone(const struct LDKCResult_WitnessNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_WitnessNoneZ_clone")] public static extern long CResult_WitnessNoneZ_clone(long _orig);
+       // void CVec_ECDSASignatureZ_free(struct LDKCVec_ECDSASignatureZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ECDSASignatureZ_free")] public static extern void CVec_ECDSASignatureZ_free(long __res);
+       // uint64_t C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(const struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_clone(long _orig);
+       // struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(struct LDKECDSASignature a, struct LDKCVec_ECDSASignatureZ b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new")] public static extern long C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_new(long _a, long _b);
+       // void C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free")] public static extern void C2Tuple_ECDSASignatureCVec_ECDSASignatureZZ_free(long __res);
+       // struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(struct LDKC2Tuple_ECDSASignatureCVec_ECDSASignatureZZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_ok(long _o);
+       // struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_err();
+       // bool CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(const struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok")] public static extern bool CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_is_ok(long _o);
+       // void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free")] public static extern void CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_free(long __res);
+       // uint64_t CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(const struct LDKCResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone")] public static extern long CResult_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ_clone(long _orig);
        // struct LDKCResult_InMemorySignerDecodeErrorZ CResult_InMemorySignerDecodeErrorZ_ok(struct LDKInMemorySigner o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InMemorySignerDecodeErrorZ_ok")] public static extern long CResult_InMemorySignerDecodeErrorZ_ok(long _o);
        // struct LDKCResult_InMemorySignerDecodeErrorZ CResult_InMemorySignerDecodeErrorZ_err(struct LDKDecodeError e);
@@ -3036,6 +3188,54 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteLightningErrorZ_clone_ptr")] public static extern long CResult_RouteLightningErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_RouteLightningErrorZ CResult_RouteLightningErrorZ_clone(const struct LDKCResult_RouteLightningErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteLightningErrorZ_clone")] public static extern long CResult_RouteLightningErrorZ_clone(long _orig);
+       // uint64_t C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_BlindedPayInfoBlindedPathZ C2Tuple_BlindedPayInfoBlindedPathZ_clone(const struct LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_clone(long _orig);
+       // struct LDKC2Tuple_BlindedPayInfoBlindedPathZ C2Tuple_BlindedPayInfoBlindedPathZ_new(struct LDKBlindedPayInfo a, struct LDKBlindedPath b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_new")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_new(long _a, long _b);
+       // void C2Tuple_BlindedPayInfoBlindedPathZ_free(struct LDKC2Tuple_BlindedPayInfoBlindedPathZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_free")] public static extern void C2Tuple_BlindedPayInfoBlindedPathZ_free(long __res);
+       // void CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free")] public static extern void CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(long __res);
+       // struct LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok(struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok")] public static extern long CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok(long _o);
+       // struct LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err")] public static extern long CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err();
+       // bool CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(const struct LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok")] public static extern bool CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(long _o);
+       // void CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free(struct LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free")] public static extern void CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free(long __res);
+       // uint64_t CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr")] public static extern long CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(const struct LDKCResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone")] public static extern long CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(long _orig);
+       // void CVec_PublicKeyZ_free(struct LDKCVec_PublicKeyZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PublicKeyZ_free")] public static extern void CVec_PublicKeyZ_free(long __res);
+       // struct LDKCResult_OnionMessagePathNoneZ CResult_OnionMessagePathNoneZ_ok(struct LDKOnionMessagePath o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_ok")] public static extern long CResult_OnionMessagePathNoneZ_ok(long _o);
+       // struct LDKCResult_OnionMessagePathNoneZ CResult_OnionMessagePathNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_err")] public static extern long CResult_OnionMessagePathNoneZ_err();
+       // bool CResult_OnionMessagePathNoneZ_is_ok(const struct LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_is_ok")] public static extern bool CResult_OnionMessagePathNoneZ_is_ok(long _o);
+       // void CResult_OnionMessagePathNoneZ_free(struct LDKCResult_OnionMessagePathNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_free")] public static extern void CResult_OnionMessagePathNoneZ_free(long __res);
+       // uint64_t CResult_OnionMessagePathNoneZ_clone_ptr(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_clone_ptr")] public static extern long CResult_OnionMessagePathNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_OnionMessagePathNoneZ CResult_OnionMessagePathNoneZ_clone(const struct LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_clone")] public static extern long CResult_OnionMessagePathNoneZ_clone(long _orig);
+       // struct LDKCResult_CVec_BlindedPathZNoneZ CResult_CVec_BlindedPathZNoneZ_ok(struct LDKCVec_BlindedPathZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_ok")] public static extern long CResult_CVec_BlindedPathZNoneZ_ok(long _o);
+       // struct LDKCResult_CVec_BlindedPathZNoneZ CResult_CVec_BlindedPathZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_err")] public static extern long CResult_CVec_BlindedPathZNoneZ_err();
+       // bool CResult_CVec_BlindedPathZNoneZ_is_ok(const struct LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_is_ok")] public static extern bool CResult_CVec_BlindedPathZNoneZ_is_ok(long _o);
+       // void CResult_CVec_BlindedPathZNoneZ_free(struct LDKCResult_CVec_BlindedPathZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_free")] public static extern void CResult_CVec_BlindedPathZNoneZ_free(long __res);
+       // uint64_t CResult_CVec_BlindedPathZNoneZ_clone_ptr(LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_clone_ptr")] public static extern long CResult_CVec_BlindedPathZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_CVec_BlindedPathZNoneZ CResult_CVec_BlindedPathZNoneZ_clone(const struct LDKCResult_CVec_BlindedPathZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_BlindedPathZNoneZ_clone")] public static extern long CResult_CVec_BlindedPathZNoneZ_clone(long _orig);
        // struct LDKCResult_InFlightHtlcsDecodeErrorZ CResult_InFlightHtlcsDecodeErrorZ_ok(struct LDKInFlightHtlcs o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InFlightHtlcsDecodeErrorZ_ok")] public static extern long CResult_InFlightHtlcsDecodeErrorZ_ok(long _o);
        // struct LDKCResult_InFlightHtlcsDecodeErrorZ CResult_InFlightHtlcsDecodeErrorZ_err(struct LDKDecodeError e);
@@ -3116,16 +3316,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone_ptr")] public static extern long CResult_PaymentParametersDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_PaymentParametersDecodeErrorZ CResult_PaymentParametersDecodeErrorZ_clone(const struct LDKCResult_PaymentParametersDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentParametersDecodeErrorZ_clone")] public static extern long CResult_PaymentParametersDecodeErrorZ_clone(long _orig);
-       // uint64_t C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_BlindedPayInfoBlindedPathZ C2Tuple_BlindedPayInfoBlindedPathZ_clone(const struct LDKC2Tuple_BlindedPayInfoBlindedPathZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_clone")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_clone(long _orig);
-       // struct LDKC2Tuple_BlindedPayInfoBlindedPathZ C2Tuple_BlindedPayInfoBlindedPathZ_new(struct LDKBlindedPayInfo a, struct LDKBlindedPath b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_new")] public static extern long C2Tuple_BlindedPayInfoBlindedPathZ_new(long _a, long _b);
-       // void C2Tuple_BlindedPayInfoBlindedPathZ_free(struct LDKC2Tuple_BlindedPayInfoBlindedPathZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_BlindedPayInfoBlindedPathZ_free")] public static extern void C2Tuple_BlindedPayInfoBlindedPathZ_free(long __res);
-       // void CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(struct LDKCVec_C2Tuple_BlindedPayInfoBlindedPathZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free")] public static extern void CVec_C2Tuple_BlindedPayInfoBlindedPathZZ_free(long __res);
        // void CVec_RouteHintZ_free(struct LDKCVec_RouteHintZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_RouteHintZ_free")] public static extern void CVec_RouteHintZ_free(long __res);
        // void CVec_RouteHintHopZ_free(struct LDKCVec_RouteHintHopZ _res);
@@ -3154,8 +3344,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone_ptr")] public static extern long CResult_RouteHintHopDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_RouteHintHopDecodeErrorZ CResult_RouteHintHopDecodeErrorZ_clone(const struct LDKCResult_RouteHintHopDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RouteHintHopDecodeErrorZ_clone")] public static extern long CResult_RouteHintHopDecodeErrorZ_clone(long _orig);
-       // void CVec_PublicKeyZ_free(struct LDKCVec_PublicKeyZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_PublicKeyZ_free")] public static extern void CVec_PublicKeyZ_free(long __res);
        // struct LDKCResult_FixedPenaltyScorerDecodeErrorZ CResult_FixedPenaltyScorerDecodeErrorZ_ok(struct LDKFixedPenaltyScorer o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FixedPenaltyScorerDecodeErrorZ_ok")] public static extern long CResult_FixedPenaltyScorerDecodeErrorZ_ok(long _o);
        // struct LDKCResult_FixedPenaltyScorerDecodeErrorZ CResult_FixedPenaltyScorerDecodeErrorZ_err(struct LDKDecodeError e);
@@ -3230,16 +3418,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_usizeTransactionZ_free")] public static extern void C2Tuple_usizeTransactionZ_free(long __res);
        // void CVec_C2Tuple_usizeTransactionZZ_free(struct LDKCVec_C2Tuple_usizeTransactionZZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_usizeTransactionZZ_free")] public static extern void CVec_C2Tuple_usizeTransactionZZ_free(long __res);
-       // uint64_t C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr")] public static extern long C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(const struct LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone")] public static extern long C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(long _orig);
-       // struct LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(struct LDKThirtyTwoBytes a, struct LDKCOption_ThirtyTwoBytesZ b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new")] public static extern long C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(long _a, long _b);
-       // void C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(struct LDKC2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free")] public static extern void C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(long __res);
-       // void CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(struct LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free")] public static extern void CVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ_free(long __res);
+       // uint64_t C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr")] public static extern long C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(long _arg);
+       // struct LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(const struct LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone")] public static extern long C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(long _orig);
+       // struct LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new(struct LDKThirtyTwoBytes a, uint32_t b, struct LDKCOption_ThirtyTwoBytesZ c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new")] public static extern long C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new(long _a, int _b, long _c);
+       // void C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free(struct LDKC3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free")] public static extern void C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free(long __res);
+       // void CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_free(struct LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_free")] public static extern void CVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ_free(long __res);
        // struct LDKCResult_ChannelMonitorUpdateStatusNoneZ CResult_ChannelMonitorUpdateStatusNoneZ_ok(enum LDKChannelMonitorUpdateStatus o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelMonitorUpdateStatusNoneZ_ok")] public static extern long CResult_ChannelMonitorUpdateStatusNoneZ_ok(ChannelMonitorUpdateStatus _o);
        // struct LDKCResult_ChannelMonitorUpdateStatusNoneZ CResult_ChannelMonitorUpdateStatusNoneZ_err(void);
@@ -3548,6 +3736,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_SocketAddressZZ_clone_ptr")] public static extern long COption_CVec_SocketAddressZZ_clone_ptr(long _arg);
        // struct LDKCOption_CVec_SocketAddressZZ COption_CVec_SocketAddressZZ_clone(const struct LDKCOption_CVec_SocketAddressZZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_CVec_SocketAddressZZ_clone")] public static extern long COption_CVec_SocketAddressZZ_clone(long _orig);
+       // struct LDKCResult_PendingHTLCInfoInboundHTLCErrZ CResult_PendingHTLCInfoInboundHTLCErrZ_ok(struct LDKPendingHTLCInfo o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_ok")] public static extern long CResult_PendingHTLCInfoInboundHTLCErrZ_ok(long _o);
+       // struct LDKCResult_PendingHTLCInfoInboundHTLCErrZ CResult_PendingHTLCInfoInboundHTLCErrZ_err(struct LDKInboundHTLCErr e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_err")] public static extern long CResult_PendingHTLCInfoInboundHTLCErrZ_err(long _e);
+       // bool CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(const struct LDKCResult_PendingHTLCInfoInboundHTLCErrZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok")] public static extern bool CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(long _o);
+       // void CResult_PendingHTLCInfoInboundHTLCErrZ_free(struct LDKCResult_PendingHTLCInfoInboundHTLCErrZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoInboundHTLCErrZ_free")] public static extern void CResult_PendingHTLCInfoInboundHTLCErrZ_free(long __res);
        // void CVec_HTLCOutputInCommitmentZ_free(struct LDKCVec_HTLCOutputInCommitmentZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_HTLCOutputInCommitmentZ_free")] public static extern void CVec_HTLCOutputInCommitmentZ_free(long __res);
        // void CVec_HTLCDescriptorZ_free(struct LDKCVec_HTLCDescriptorZ _res);
@@ -3826,6 +4022,54 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr")] public static extern long CResult_PhantomRouteHintsDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_PhantomRouteHintsDecodeErrorZ CResult_PhantomRouteHintsDecodeErrorZ_clone(const struct LDKCResult_PhantomRouteHintsDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PhantomRouteHintsDecodeErrorZ_clone")] public static extern long CResult_PhantomRouteHintsDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_BlindedForwardDecodeErrorZ CResult_BlindedForwardDecodeErrorZ_ok(struct LDKBlindedForward o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_ok")] public static extern long CResult_BlindedForwardDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_BlindedForwardDecodeErrorZ CResult_BlindedForwardDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_err")] public static extern long CResult_BlindedForwardDecodeErrorZ_err(long _e);
+       // bool CResult_BlindedForwardDecodeErrorZ_is_ok(const struct LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_is_ok")] public static extern bool CResult_BlindedForwardDecodeErrorZ_is_ok(long _o);
+       // void CResult_BlindedForwardDecodeErrorZ_free(struct LDKCResult_BlindedForwardDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_free")] public static extern void CResult_BlindedForwardDecodeErrorZ_free(long __res);
+       // uint64_t CResult_BlindedForwardDecodeErrorZ_clone_ptr(LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_clone_ptr")] public static extern long CResult_BlindedForwardDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_BlindedForwardDecodeErrorZ CResult_BlindedForwardDecodeErrorZ_clone(const struct LDKCResult_BlindedForwardDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedForwardDecodeErrorZ_clone")] public static extern long CResult_BlindedForwardDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_PendingHTLCRoutingDecodeErrorZ CResult_PendingHTLCRoutingDecodeErrorZ_ok(struct LDKPendingHTLCRouting o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_ok")] public static extern long CResult_PendingHTLCRoutingDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_PendingHTLCRoutingDecodeErrorZ CResult_PendingHTLCRoutingDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_err")] public static extern long CResult_PendingHTLCRoutingDecodeErrorZ_err(long _e);
+       // bool CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(const struct LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_is_ok")] public static extern bool CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(long _o);
+       // void CResult_PendingHTLCRoutingDecodeErrorZ_free(struct LDKCResult_PendingHTLCRoutingDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_free")] public static extern void CResult_PendingHTLCRoutingDecodeErrorZ_free(long __res);
+       // uint64_t CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr")] public static extern long CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_PendingHTLCRoutingDecodeErrorZ CResult_PendingHTLCRoutingDecodeErrorZ_clone(const struct LDKCResult_PendingHTLCRoutingDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCRoutingDecodeErrorZ_clone")] public static extern long CResult_PendingHTLCRoutingDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_PendingHTLCInfoDecodeErrorZ CResult_PendingHTLCInfoDecodeErrorZ_ok(struct LDKPendingHTLCInfo o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_ok")] public static extern long CResult_PendingHTLCInfoDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_PendingHTLCInfoDecodeErrorZ CResult_PendingHTLCInfoDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_err")] public static extern long CResult_PendingHTLCInfoDecodeErrorZ_err(long _e);
+       // bool CResult_PendingHTLCInfoDecodeErrorZ_is_ok(const struct LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_is_ok")] public static extern bool CResult_PendingHTLCInfoDecodeErrorZ_is_ok(long _o);
+       // void CResult_PendingHTLCInfoDecodeErrorZ_free(struct LDKCResult_PendingHTLCInfoDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_free")] public static extern void CResult_PendingHTLCInfoDecodeErrorZ_free(long __res);
+       // uint64_t CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr")] public static extern long CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_PendingHTLCInfoDecodeErrorZ CResult_PendingHTLCInfoDecodeErrorZ_clone(const struct LDKCResult_PendingHTLCInfoDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PendingHTLCInfoDecodeErrorZ_clone")] public static extern long CResult_PendingHTLCInfoDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_BlindedFailureDecodeErrorZ CResult_BlindedFailureDecodeErrorZ_ok(enum LDKBlindedFailure o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_ok")] public static extern long CResult_BlindedFailureDecodeErrorZ_ok(BlindedFailure _o);
+       // struct LDKCResult_BlindedFailureDecodeErrorZ CResult_BlindedFailureDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_err")] public static extern long CResult_BlindedFailureDecodeErrorZ_err(long _e);
+       // bool CResult_BlindedFailureDecodeErrorZ_is_ok(const struct LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_is_ok")] public static extern bool CResult_BlindedFailureDecodeErrorZ_is_ok(long _o);
+       // void CResult_BlindedFailureDecodeErrorZ_free(struct LDKCResult_BlindedFailureDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_free")] public static extern void CResult_BlindedFailureDecodeErrorZ_free(long __res);
+       // uint64_t CResult_BlindedFailureDecodeErrorZ_clone_ptr(LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_clone_ptr")] public static extern long CResult_BlindedFailureDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_BlindedFailureDecodeErrorZ CResult_BlindedFailureDecodeErrorZ_clone(const struct LDKCResult_BlindedFailureDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedFailureDecodeErrorZ_clone")] public static extern long CResult_BlindedFailureDecodeErrorZ_clone(long _orig);
        // struct LDKCResult_ChannelShutdownStateDecodeErrorZ CResult_ChannelShutdownStateDecodeErrorZ_ok(enum LDKChannelShutdownState o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ChannelShutdownStateDecodeErrorZ_ok")] public static extern long CResult_ChannelShutdownStateDecodeErrorZ_ok(ChannelShutdownState _o);
        // struct LDKCResult_ChannelShutdownStateDecodeErrorZ CResult_ChannelShutdownStateDecodeErrorZ_err(struct LDKDecodeError e);
@@ -4038,6 +4282,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyTypeZ_free")] public static extern void C2Tuple_PublicKeyTypeZ_free(long __res);
        // void CVec_C2Tuple_PublicKeyTypeZZ_free(struct LDKCVec_C2Tuple_PublicKeyTypeZZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_PublicKeyTypeZZ_free")] public static extern void CVec_C2Tuple_PublicKeyTypeZZ_free(long __res);
+       // uint64_t C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr")] public static extern long C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(long _arg);
+       // struct LDKC2Tuple_PublicKeyCVec_SocketAddressZZ C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(const struct LDKC2Tuple_PublicKeyCVec_SocketAddressZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_clone")] public static extern long C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(long _orig);
+       // struct LDKC2Tuple_PublicKeyCVec_SocketAddressZZ C2Tuple_PublicKeyCVec_SocketAddressZZ_new(struct LDKPublicKey a, struct LDKCVec_SocketAddressZ b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_new")] public static extern long C2Tuple_PublicKeyCVec_SocketAddressZZ_new(long _a, long _b);
+       // void C2Tuple_PublicKeyCVec_SocketAddressZZ_free(struct LDKC2Tuple_PublicKeyCVec_SocketAddressZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyCVec_SocketAddressZZ_free")] public static extern void C2Tuple_PublicKeyCVec_SocketAddressZZ_free(long __res);
+       // void CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_free(struct LDKCVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_free")] public static extern void CVec_C2Tuple_PublicKeyCVec_SocketAddressZZZ_free(long __res);
        // struct LDKCOption_OnionMessageContentsZ COption_OnionMessageContentsZ_some(struct LDKOnionMessageContents o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_OnionMessageContentsZ_some")] public static extern long COption_OnionMessageContentsZ_some(long _o);
        // struct LDKCOption_OnionMessageContentsZ COption_OnionMessageContentsZ_none(void);
@@ -4304,6 +4558,54 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone_ptr")] public static extern long CResult_AcceptChannelV2DecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_AcceptChannelV2DecodeErrorZ CResult_AcceptChannelV2DecodeErrorZ_clone(const struct LDKCResult_AcceptChannelV2DecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_AcceptChannelV2DecodeErrorZ_clone")] public static extern long CResult_AcceptChannelV2DecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_StfuDecodeErrorZ CResult_StfuDecodeErrorZ_ok(struct LDKStfu o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_ok")] public static extern long CResult_StfuDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_StfuDecodeErrorZ CResult_StfuDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_err")] public static extern long CResult_StfuDecodeErrorZ_err(long _e);
+       // bool CResult_StfuDecodeErrorZ_is_ok(const struct LDKCResult_StfuDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_is_ok")] public static extern bool CResult_StfuDecodeErrorZ_is_ok(long _o);
+       // void CResult_StfuDecodeErrorZ_free(struct LDKCResult_StfuDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_free")] public static extern void CResult_StfuDecodeErrorZ_free(long __res);
+       // uint64_t CResult_StfuDecodeErrorZ_clone_ptr(LDKCResult_StfuDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_clone_ptr")] public static extern long CResult_StfuDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_StfuDecodeErrorZ CResult_StfuDecodeErrorZ_clone(const struct LDKCResult_StfuDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StfuDecodeErrorZ_clone")] public static extern long CResult_StfuDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_SpliceDecodeErrorZ CResult_SpliceDecodeErrorZ_ok(struct LDKSplice o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_ok")] public static extern long CResult_SpliceDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_SpliceDecodeErrorZ CResult_SpliceDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_err")] public static extern long CResult_SpliceDecodeErrorZ_err(long _e);
+       // bool CResult_SpliceDecodeErrorZ_is_ok(const struct LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_is_ok")] public static extern bool CResult_SpliceDecodeErrorZ_is_ok(long _o);
+       // void CResult_SpliceDecodeErrorZ_free(struct LDKCResult_SpliceDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_free")] public static extern void CResult_SpliceDecodeErrorZ_free(long __res);
+       // uint64_t CResult_SpliceDecodeErrorZ_clone_ptr(LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_clone_ptr")] public static extern long CResult_SpliceDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_SpliceDecodeErrorZ CResult_SpliceDecodeErrorZ_clone(const struct LDKCResult_SpliceDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceDecodeErrorZ_clone")] public static extern long CResult_SpliceDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_SpliceAckDecodeErrorZ CResult_SpliceAckDecodeErrorZ_ok(struct LDKSpliceAck o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_ok")] public static extern long CResult_SpliceAckDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_SpliceAckDecodeErrorZ CResult_SpliceAckDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_err")] public static extern long CResult_SpliceAckDecodeErrorZ_err(long _e);
+       // bool CResult_SpliceAckDecodeErrorZ_is_ok(const struct LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_is_ok")] public static extern bool CResult_SpliceAckDecodeErrorZ_is_ok(long _o);
+       // void CResult_SpliceAckDecodeErrorZ_free(struct LDKCResult_SpliceAckDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_free")] public static extern void CResult_SpliceAckDecodeErrorZ_free(long __res);
+       // uint64_t CResult_SpliceAckDecodeErrorZ_clone_ptr(LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_clone_ptr")] public static extern long CResult_SpliceAckDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_SpliceAckDecodeErrorZ CResult_SpliceAckDecodeErrorZ_clone(const struct LDKCResult_SpliceAckDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceAckDecodeErrorZ_clone")] public static extern long CResult_SpliceAckDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_SpliceLockedDecodeErrorZ CResult_SpliceLockedDecodeErrorZ_ok(struct LDKSpliceLocked o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_ok")] public static extern long CResult_SpliceLockedDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_SpliceLockedDecodeErrorZ CResult_SpliceLockedDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_err")] public static extern long CResult_SpliceLockedDecodeErrorZ_err(long _e);
+       // bool CResult_SpliceLockedDecodeErrorZ_is_ok(const struct LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_is_ok")] public static extern bool CResult_SpliceLockedDecodeErrorZ_is_ok(long _o);
+       // void CResult_SpliceLockedDecodeErrorZ_free(struct LDKCResult_SpliceLockedDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_free")] public static extern void CResult_SpliceLockedDecodeErrorZ_free(long __res);
+       // uint64_t CResult_SpliceLockedDecodeErrorZ_clone_ptr(LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_clone_ptr")] public static extern long CResult_SpliceLockedDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_SpliceLockedDecodeErrorZ CResult_SpliceLockedDecodeErrorZ_clone(const struct LDKCResult_SpliceLockedDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SpliceLockedDecodeErrorZ_clone")] public static extern long CResult_SpliceLockedDecodeErrorZ_clone(long _orig);
        // struct LDKCResult_TxAddInputDecodeErrorZ CResult_TxAddInputDecodeErrorZ_ok(struct LDKTxAddInput o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TxAddInputDecodeErrorZ_ok")] public static extern long CResult_TxAddInputDecodeErrorZ_ok(long _o);
        // struct LDKCResult_TxAddInputDecodeErrorZ CResult_TxAddInputDecodeErrorZ_err(struct LDKDecodeError e);
@@ -4616,6 +4918,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr")] public static extern long CResult_UpdateFulfillHTLCDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_UpdateFulfillHTLCDecodeErrorZ CResult_UpdateFulfillHTLCDecodeErrorZ_clone(const struct LDKCResult_UpdateFulfillHTLCDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UpdateFulfillHTLCDecodeErrorZ_clone")] public static extern long CResult_UpdateFulfillHTLCDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_OnionPacketDecodeErrorZ CResult_OnionPacketDecodeErrorZ_ok(struct LDKOnionPacket o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_ok")] public static extern long CResult_OnionPacketDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_OnionPacketDecodeErrorZ CResult_OnionPacketDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_err")] public static extern long CResult_OnionPacketDecodeErrorZ_err(long _e);
+       // bool CResult_OnionPacketDecodeErrorZ_is_ok(const struct LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_is_ok")] public static extern bool CResult_OnionPacketDecodeErrorZ_is_ok(long _o);
+       // void CResult_OnionPacketDecodeErrorZ_free(struct LDKCResult_OnionPacketDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_free")] public static extern void CResult_OnionPacketDecodeErrorZ_free(long __res);
+       // uint64_t CResult_OnionPacketDecodeErrorZ_clone_ptr(LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_clone_ptr")] public static extern long CResult_OnionPacketDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_OnionPacketDecodeErrorZ CResult_OnionPacketDecodeErrorZ_clone(const struct LDKCResult_OnionPacketDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionPacketDecodeErrorZ_clone")] public static extern long CResult_OnionPacketDecodeErrorZ_clone(long _orig);
        // struct LDKCResult_UpdateAddHTLCDecodeErrorZ CResult_UpdateAddHTLCDecodeErrorZ_ok(struct LDKUpdateAddHTLC o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UpdateAddHTLCDecodeErrorZ_ok")] public static extern long CResult_UpdateAddHTLCDecodeErrorZ_ok(long _o);
        // struct LDKCResult_UpdateAddHTLCDecodeErrorZ CResult_UpdateAddHTLCDecodeErrorZ_err(struct LDKDecodeError e);
@@ -4640,6 +4954,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessageDecodeErrorZ_clone_ptr")] public static extern long CResult_OnionMessageDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_OnionMessageDecodeErrorZ CResult_OnionMessageDecodeErrorZ_clone(const struct LDKCResult_OnionMessageDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessageDecodeErrorZ_clone")] public static extern long CResult_OnionMessageDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_FinalOnionHopDataDecodeErrorZ CResult_FinalOnionHopDataDecodeErrorZ_ok(struct LDKFinalOnionHopData o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_ok")] public static extern long CResult_FinalOnionHopDataDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_FinalOnionHopDataDecodeErrorZ CResult_FinalOnionHopDataDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_err")] public static extern long CResult_FinalOnionHopDataDecodeErrorZ_err(long _e);
+       // bool CResult_FinalOnionHopDataDecodeErrorZ_is_ok(const struct LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_is_ok")] public static extern bool CResult_FinalOnionHopDataDecodeErrorZ_is_ok(long _o);
+       // void CResult_FinalOnionHopDataDecodeErrorZ_free(struct LDKCResult_FinalOnionHopDataDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_free")] public static extern void CResult_FinalOnionHopDataDecodeErrorZ_free(long __res);
+       // uint64_t CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr")] public static extern long CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_FinalOnionHopDataDecodeErrorZ CResult_FinalOnionHopDataDecodeErrorZ_clone(const struct LDKCResult_FinalOnionHopDataDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_FinalOnionHopDataDecodeErrorZ_clone")] public static extern long CResult_FinalOnionHopDataDecodeErrorZ_clone(long _orig);
        // struct LDKCResult_PingDecodeErrorZ CResult_PingDecodeErrorZ_ok(struct LDKPing o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PingDecodeErrorZ_ok")] public static extern long CResult_PingDecodeErrorZ_ok(long _o);
        // struct LDKCResult_PingDecodeErrorZ CResult_PingDecodeErrorZ_err(struct LDKDecodeError e);
@@ -5360,18 +5686,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone_ptr")] public static extern long CResult_UntrustedStringDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_UntrustedStringDecodeErrorZ CResult_UntrustedStringDecodeErrorZ_clone(const struct LDKCResult_UntrustedStringDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_UntrustedStringDecodeErrorZ_clone")] public static extern long CResult_UntrustedStringDecodeErrorZ_clone(long _orig);
-       // struct LDKCResult_ReceiveTlvsDecodeErrorZ CResult_ReceiveTlvsDecodeErrorZ_ok(struct LDKReceiveTlvs o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_ok")] public static extern long CResult_ReceiveTlvsDecodeErrorZ_ok(long _o);
-       // struct LDKCResult_ReceiveTlvsDecodeErrorZ CResult_ReceiveTlvsDecodeErrorZ_err(struct LDKDecodeError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_err")] public static extern long CResult_ReceiveTlvsDecodeErrorZ_err(long _e);
-       // bool CResult_ReceiveTlvsDecodeErrorZ_is_ok(const struct LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_is_ok")] public static extern bool CResult_ReceiveTlvsDecodeErrorZ_is_ok(long _o);
-       // void CResult_ReceiveTlvsDecodeErrorZ_free(struct LDKCResult_ReceiveTlvsDecodeErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_free")] public static extern void CResult_ReceiveTlvsDecodeErrorZ_free(long __res);
-       // uint64_t CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_clone_ptr")] public static extern long CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_ReceiveTlvsDecodeErrorZ CResult_ReceiveTlvsDecodeErrorZ_clone(const struct LDKCResult_ReceiveTlvsDecodeErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ReceiveTlvsDecodeErrorZ_clone")] public static extern long CResult_ReceiveTlvsDecodeErrorZ_clone(long _orig);
+       // uint64_t C2Tuple__u832u16Z_clone_ptr(LDKC2Tuple__u832u16Z *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u832u16Z_clone_ptr")] public static extern long C2Tuple__u832u16Z_clone_ptr(long _arg);
+       // struct LDKC2Tuple__u832u16Z C2Tuple__u832u16Z_clone(const struct LDKC2Tuple__u832u16Z *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u832u16Z_clone")] public static extern long C2Tuple__u832u16Z_clone(long _orig);
+       // struct LDKC2Tuple__u832u16Z C2Tuple__u832u16Z_new(struct LDKThirtyTwoBytes a, uint16_t b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u832u16Z_new")] public static extern long C2Tuple__u832u16Z_new(long _a, short _b);
+       // void C2Tuple__u832u16Z_free(struct LDKC2Tuple__u832u16Z _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple__u832u16Z_free")] public static extern void C2Tuple__u832u16Z_free(long __res);
        // struct LDKCResult_PaymentRelayDecodeErrorZ CResult_PaymentRelayDecodeErrorZ_ok(struct LDKPaymentRelay o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentRelayDecodeErrorZ_ok")] public static extern long CResult_PaymentRelayDecodeErrorZ_ok(long _o);
        // struct LDKCResult_PaymentRelayDecodeErrorZ CResult_PaymentRelayDecodeErrorZ_err(struct LDKDecodeError e);
@@ -5396,42 +5718,26 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone_ptr")] public static extern long CResult_PaymentConstraintsDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_PaymentConstraintsDecodeErrorZ CResult_PaymentConstraintsDecodeErrorZ_clone(const struct LDKCResult_PaymentConstraintsDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PaymentConstraintsDecodeErrorZ_clone")] public static extern long CResult_PaymentConstraintsDecodeErrorZ_clone(long _orig);
-       // struct LDKCResult_ThirtyTwoBytesPaymentErrorZ CResult_ThirtyTwoBytesPaymentErrorZ_ok(struct LDKThirtyTwoBytes o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_ok")] public static extern long CResult_ThirtyTwoBytesPaymentErrorZ_ok(long _o);
-       // struct LDKCResult_ThirtyTwoBytesPaymentErrorZ CResult_ThirtyTwoBytesPaymentErrorZ_err(struct LDKPaymentError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_err")] public static extern long CResult_ThirtyTwoBytesPaymentErrorZ_err(long _e);
-       // bool CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(const struct LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_is_ok")] public static extern bool CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(long _o);
-       // void CResult_ThirtyTwoBytesPaymentErrorZ_free(struct LDKCResult_ThirtyTwoBytesPaymentErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_free")] public static extern void CResult_ThirtyTwoBytesPaymentErrorZ_free(long __res);
-       // uint64_t CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr")] public static extern long CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_ThirtyTwoBytesPaymentErrorZ CResult_ThirtyTwoBytesPaymentErrorZ_clone(const struct LDKCResult_ThirtyTwoBytesPaymentErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_ThirtyTwoBytesPaymentErrorZ_clone")] public static extern long CResult_ThirtyTwoBytesPaymentErrorZ_clone(long _orig);
-       // struct LDKCResult_NonePaymentErrorZ CResult_NonePaymentErrorZ_ok(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_ok")] public static extern long CResult_NonePaymentErrorZ_ok();
-       // struct LDKCResult_NonePaymentErrorZ CResult_NonePaymentErrorZ_err(struct LDKPaymentError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_err")] public static extern long CResult_NonePaymentErrorZ_err(long _e);
-       // bool CResult_NonePaymentErrorZ_is_ok(const struct LDKCResult_NonePaymentErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_is_ok")] public static extern bool CResult_NonePaymentErrorZ_is_ok(long _o);
-       // void CResult_NonePaymentErrorZ_free(struct LDKCResult_NonePaymentErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_free")] public static extern void CResult_NonePaymentErrorZ_free(long __res);
-       // uint64_t CResult_NonePaymentErrorZ_clone_ptr(LDKCResult_NonePaymentErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_clone_ptr")] public static extern long CResult_NonePaymentErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_NonePaymentErrorZ CResult_NonePaymentErrorZ_clone(const struct LDKCResult_NonePaymentErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NonePaymentErrorZ_clone")] public static extern long CResult_NonePaymentErrorZ_clone(long _orig);
-       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok(struct LDKCVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok(long _o);
-       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err(struct LDKProbingError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err(long _e);
-       // bool CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(const struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok")] public static extern bool CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(long _o);
-       // void CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free(struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free")] public static extern void CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free(long __res);
-       // uint64_t CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(long _arg);
-       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(const struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone")] public static extern long CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(long _orig);
+       // uint64_t C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr")] public static extern long C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(long _arg);
+       // struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(const struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone")] public static extern long C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(long _orig);
+       // struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new(struct LDKThirtyTwoBytes a, struct LDKRecipientOnionFields b, struct LDKRouteParameters c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new")] public static extern long C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new(long _a, long _b, long _c);
+       // void C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free(struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free")] public static extern void C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free(long __res);
+       // struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok(struct LDKC3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok")] public static extern long CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok(long _o);
+       // struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err")] public static extern long CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err();
+       // bool CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(const struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok")] public static extern bool CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(long _o);
+       // void CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free(struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free")] public static extern void CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free(long __res);
+       // uint64_t CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr")] public static extern long CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(long _arg);
+       // struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(const struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone")] public static extern long CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(long _orig);
        // struct LDKCResult_StrSecp256k1ErrorZ CResult_StrSecp256k1ErrorZ_ok(struct LDKStr o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_StrSecp256k1ErrorZ_ok")] public static extern long CResult_StrSecp256k1ErrorZ_ok(long _o);
        // struct LDKCResult_StrSecp256k1ErrorZ CResult_StrSecp256k1ErrorZ_err(enum LDKSecp256k1Error e);
@@ -5456,34 +5762,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone_ptr")] public static extern long CResult_TxOutUtxoLookupErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_TxOutUtxoLookupErrorZ CResult_TxOutUtxoLookupErrorZ_clone(const struct LDKCResult_TxOutUtxoLookupErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_TxOutUtxoLookupErrorZ_clone")] public static extern long CResult_TxOutUtxoLookupErrorZ_clone(long _orig);
-       // struct LDKCResult_OnionMessagePathNoneZ CResult_OnionMessagePathNoneZ_ok(struct LDKOnionMessagePath o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_ok")] public static extern long CResult_OnionMessagePathNoneZ_ok(long _o);
-       // struct LDKCResult_OnionMessagePathNoneZ CResult_OnionMessagePathNoneZ_err(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_err")] public static extern long CResult_OnionMessagePathNoneZ_err();
-       // bool CResult_OnionMessagePathNoneZ_is_ok(const struct LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_is_ok")] public static extern bool CResult_OnionMessagePathNoneZ_is_ok(long _o);
-       // void CResult_OnionMessagePathNoneZ_free(struct LDKCResult_OnionMessagePathNoneZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_free")] public static extern void CResult_OnionMessagePathNoneZ_free(long __res);
-       // uint64_t CResult_OnionMessagePathNoneZ_clone_ptr(LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_clone_ptr")] public static extern long CResult_OnionMessagePathNoneZ_clone_ptr(long _arg);
-       // struct LDKCResult_OnionMessagePathNoneZ CResult_OnionMessagePathNoneZ_clone(const struct LDKCResult_OnionMessagePathNoneZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_OnionMessagePathNoneZ_clone")] public static extern long CResult_OnionMessagePathNoneZ_clone(long _orig);
-       // uint64_t C2Tuple_PublicKeyOnionMessageZ_clone_ptr(LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyOnionMessageZ_clone_ptr")] public static extern long C2Tuple_PublicKeyOnionMessageZ_clone_ptr(long _arg);
-       // struct LDKC2Tuple_PublicKeyOnionMessageZ C2Tuple_PublicKeyOnionMessageZ_clone(const struct LDKC2Tuple_PublicKeyOnionMessageZ *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyOnionMessageZ_clone")] public static extern long C2Tuple_PublicKeyOnionMessageZ_clone(long _orig);
-       // struct LDKC2Tuple_PublicKeyOnionMessageZ C2Tuple_PublicKeyOnionMessageZ_new(struct LDKPublicKey a, struct LDKOnionMessage b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyOnionMessageZ_new")] public static extern long C2Tuple_PublicKeyOnionMessageZ_new(long _a, long _b);
-       // void C2Tuple_PublicKeyOnionMessageZ_free(struct LDKC2Tuple_PublicKeyOnionMessageZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_PublicKeyOnionMessageZ_free")] public static extern void C2Tuple_PublicKeyOnionMessageZ_free(long __res);
-       // struct LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok(struct LDKC2Tuple_PublicKeyOnionMessageZ o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok")] public static extern long CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok(long _o);
-       // struct LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err(struct LDKSendError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err")] public static extern long CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err(long _e);
-       // bool CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(const struct LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok")] public static extern bool CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(long _o);
-       // void CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(struct LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free")] public static extern void CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(long __res);
+       // uint64_t C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr")] public static extern long C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(long _arg);
+       // struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(const struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone")] public static extern long C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(long _orig);
+       // struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new(struct LDKPublicKey a, struct LDKOnionMessage b, struct LDKCOption_CVec_SocketAddressZZ c);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new")] public static extern long C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new(long _a, long _b, long _c);
+       // void C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free(struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free")] public static extern void C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free(long __res);
+       // struct LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok(struct LDKC3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok")] public static extern long CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok(long _o);
+       // struct LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err(struct LDKSendError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err")] public static extern long CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err(long _e);
+       // bool CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(const struct LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok")] public static extern bool CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(long _o);
+       // void CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free(struct LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free")] public static extern void CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free(long __res);
        // struct LDKCResult_PeeledOnionNoneZ CResult_PeeledOnionNoneZ_ok(struct LDKPeeledOnion o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PeeledOnionNoneZ_ok")] public static extern long CResult_PeeledOnionNoneZ_ok(long _o);
        // struct LDKCResult_PeeledOnionNoneZ CResult_PeeledOnionNoneZ_err(void);
@@ -5492,14 +5786,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PeeledOnionNoneZ_is_ok")] public static extern bool CResult_PeeledOnionNoneZ_is_ok(long _o);
        // void CResult_PeeledOnionNoneZ_free(struct LDKCResult_PeeledOnionNoneZ _res);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_PeeledOnionNoneZ_free")] public static extern void CResult_PeeledOnionNoneZ_free(long __res);
-       // struct LDKCResult_NoneSendErrorZ CResult_NoneSendErrorZ_ok(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneSendErrorZ_ok")] public static extern long CResult_NoneSendErrorZ_ok();
-       // struct LDKCResult_NoneSendErrorZ CResult_NoneSendErrorZ_err(struct LDKSendError e);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneSendErrorZ_err")] public static extern long CResult_NoneSendErrorZ_err(long _e);
-       // bool CResult_NoneSendErrorZ_is_ok(const struct LDKCResult_NoneSendErrorZ *NONNULL_PTR o);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneSendErrorZ_is_ok")] public static extern bool CResult_NoneSendErrorZ_is_ok(long _o);
-       // void CResult_NoneSendErrorZ_free(struct LDKCResult_NoneSendErrorZ _res);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_NoneSendErrorZ_free")] public static extern void CResult_NoneSendErrorZ_free(long __res);
+       // struct LDKCResult_SendSuccessSendErrorZ CResult_SendSuccessSendErrorZ_ok(struct LDKSendSuccess o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SendSuccessSendErrorZ_ok")] public static extern long CResult_SendSuccessSendErrorZ_ok(long _o);
+       // struct LDKCResult_SendSuccessSendErrorZ CResult_SendSuccessSendErrorZ_err(struct LDKSendError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SendSuccessSendErrorZ_err")] public static extern long CResult_SendSuccessSendErrorZ_err(long _e);
+       // bool CResult_SendSuccessSendErrorZ_is_ok(const struct LDKCResult_SendSuccessSendErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SendSuccessSendErrorZ_is_ok")] public static extern bool CResult_SendSuccessSendErrorZ_is_ok(long _o);
+       // void CResult_SendSuccessSendErrorZ_free(struct LDKCResult_SendSuccessSendErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_SendSuccessSendErrorZ_free")] public static extern void CResult_SendSuccessSendErrorZ_free(long __res);
        // struct LDKCResult_BlindedPathNoneZ CResult_BlindedPathNoneZ_ok(struct LDKBlindedPath o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPathNoneZ_ok")] public static extern long CResult_BlindedPathNoneZ_ok(long _o);
        // struct LDKCResult_BlindedPathNoneZ CResult_BlindedPathNoneZ_err(void);
@@ -5524,6 +5818,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr")] public static extern long CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone_ptr(long _arg);
        // struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(const struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone")] public static extern long CResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ_clone(long _orig);
+       // void CVec_ForwardNodeZ_free(struct LDKCVec_ForwardNodeZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CVec_ForwardNodeZ_free")] public static extern void CVec_ForwardNodeZ_free(long __res);
        // struct LDKCResult_BlindedPathDecodeErrorZ CResult_BlindedPathDecodeErrorZ_ok(struct LDKBlindedPath o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_BlindedPathDecodeErrorZ_ok")] public static extern long CResult_BlindedPathDecodeErrorZ_ok(long _o);
        // struct LDKCResult_BlindedPathDecodeErrorZ CResult_BlindedPathDecodeErrorZ_err(struct LDKDecodeError e);
@@ -5560,6 +5856,78 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone_ptr")] public static extern long CResult_InvoiceErrorDecodeErrorZ_clone_ptr(long _arg);
        // struct LDKCResult_InvoiceErrorDecodeErrorZ CResult_InvoiceErrorDecodeErrorZ_clone(const struct LDKCResult_InvoiceErrorDecodeErrorZ *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_InvoiceErrorDecodeErrorZ_clone")] public static extern long CResult_InvoiceErrorDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_DelayedPaymentBasepointDecodeErrorZ CResult_DelayedPaymentBasepointDecodeErrorZ_ok(struct LDKDelayedPaymentBasepoint o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_ok")] public static extern long CResult_DelayedPaymentBasepointDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_DelayedPaymentBasepointDecodeErrorZ CResult_DelayedPaymentBasepointDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_err")] public static extern long CResult_DelayedPaymentBasepointDecodeErrorZ_err(long _e);
+       // bool CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(const struct LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok")] public static extern bool CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(long _o);
+       // void CResult_DelayedPaymentBasepointDecodeErrorZ_free(struct LDKCResult_DelayedPaymentBasepointDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_free")] public static extern void CResult_DelayedPaymentBasepointDecodeErrorZ_free(long __res);
+       // uint64_t CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr")] public static extern long CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_DelayedPaymentBasepointDecodeErrorZ CResult_DelayedPaymentBasepointDecodeErrorZ_clone(const struct LDKCResult_DelayedPaymentBasepointDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentBasepointDecodeErrorZ_clone")] public static extern long CResult_DelayedPaymentBasepointDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_DelayedPaymentKeyDecodeErrorZ CResult_DelayedPaymentKeyDecodeErrorZ_ok(struct LDKDelayedPaymentKey o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_ok")] public static extern long CResult_DelayedPaymentKeyDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_DelayedPaymentKeyDecodeErrorZ CResult_DelayedPaymentKeyDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_err")] public static extern long CResult_DelayedPaymentKeyDecodeErrorZ_err(long _e);
+       // bool CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(const struct LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_is_ok")] public static extern bool CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(long _o);
+       // void CResult_DelayedPaymentKeyDecodeErrorZ_free(struct LDKCResult_DelayedPaymentKeyDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_free")] public static extern void CResult_DelayedPaymentKeyDecodeErrorZ_free(long __res);
+       // uint64_t CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr")] public static extern long CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_DelayedPaymentKeyDecodeErrorZ CResult_DelayedPaymentKeyDecodeErrorZ_clone(const struct LDKCResult_DelayedPaymentKeyDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_DelayedPaymentKeyDecodeErrorZ_clone")] public static extern long CResult_DelayedPaymentKeyDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_HtlcBasepointDecodeErrorZ CResult_HtlcBasepointDecodeErrorZ_ok(struct LDKHtlcBasepoint o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_ok")] public static extern long CResult_HtlcBasepointDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_HtlcBasepointDecodeErrorZ CResult_HtlcBasepointDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_err")] public static extern long CResult_HtlcBasepointDecodeErrorZ_err(long _e);
+       // bool CResult_HtlcBasepointDecodeErrorZ_is_ok(const struct LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_is_ok")] public static extern bool CResult_HtlcBasepointDecodeErrorZ_is_ok(long _o);
+       // void CResult_HtlcBasepointDecodeErrorZ_free(struct LDKCResult_HtlcBasepointDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_free")] public static extern void CResult_HtlcBasepointDecodeErrorZ_free(long __res);
+       // uint64_t CResult_HtlcBasepointDecodeErrorZ_clone_ptr(LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_clone_ptr")] public static extern long CResult_HtlcBasepointDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_HtlcBasepointDecodeErrorZ CResult_HtlcBasepointDecodeErrorZ_clone(const struct LDKCResult_HtlcBasepointDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcBasepointDecodeErrorZ_clone")] public static extern long CResult_HtlcBasepointDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_HtlcKeyDecodeErrorZ CResult_HtlcKeyDecodeErrorZ_ok(struct LDKHtlcKey o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_ok")] public static extern long CResult_HtlcKeyDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_HtlcKeyDecodeErrorZ CResult_HtlcKeyDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_err")] public static extern long CResult_HtlcKeyDecodeErrorZ_err(long _e);
+       // bool CResult_HtlcKeyDecodeErrorZ_is_ok(const struct LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_is_ok")] public static extern bool CResult_HtlcKeyDecodeErrorZ_is_ok(long _o);
+       // void CResult_HtlcKeyDecodeErrorZ_free(struct LDKCResult_HtlcKeyDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_free")] public static extern void CResult_HtlcKeyDecodeErrorZ_free(long __res);
+       // uint64_t CResult_HtlcKeyDecodeErrorZ_clone_ptr(LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_clone_ptr")] public static extern long CResult_HtlcKeyDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_HtlcKeyDecodeErrorZ CResult_HtlcKeyDecodeErrorZ_clone(const struct LDKCResult_HtlcKeyDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_HtlcKeyDecodeErrorZ_clone")] public static extern long CResult_HtlcKeyDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_RevocationBasepointDecodeErrorZ CResult_RevocationBasepointDecodeErrorZ_ok(struct LDKRevocationBasepoint o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_ok")] public static extern long CResult_RevocationBasepointDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_RevocationBasepointDecodeErrorZ CResult_RevocationBasepointDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_err")] public static extern long CResult_RevocationBasepointDecodeErrorZ_err(long _e);
+       // bool CResult_RevocationBasepointDecodeErrorZ_is_ok(const struct LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_is_ok")] public static extern bool CResult_RevocationBasepointDecodeErrorZ_is_ok(long _o);
+       // void CResult_RevocationBasepointDecodeErrorZ_free(struct LDKCResult_RevocationBasepointDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_free")] public static extern void CResult_RevocationBasepointDecodeErrorZ_free(long __res);
+       // uint64_t CResult_RevocationBasepointDecodeErrorZ_clone_ptr(LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_clone_ptr")] public static extern long CResult_RevocationBasepointDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_RevocationBasepointDecodeErrorZ CResult_RevocationBasepointDecodeErrorZ_clone(const struct LDKCResult_RevocationBasepointDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationBasepointDecodeErrorZ_clone")] public static extern long CResult_RevocationBasepointDecodeErrorZ_clone(long _orig);
+       // struct LDKCResult_RevocationKeyDecodeErrorZ CResult_RevocationKeyDecodeErrorZ_ok(struct LDKRevocationKey o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_ok")] public static extern long CResult_RevocationKeyDecodeErrorZ_ok(long _o);
+       // struct LDKCResult_RevocationKeyDecodeErrorZ CResult_RevocationKeyDecodeErrorZ_err(struct LDKDecodeError e);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_err")] public static extern long CResult_RevocationKeyDecodeErrorZ_err(long _e);
+       // bool CResult_RevocationKeyDecodeErrorZ_is_ok(const struct LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_is_ok")] public static extern bool CResult_RevocationKeyDecodeErrorZ_is_ok(long _o);
+       // void CResult_RevocationKeyDecodeErrorZ_free(struct LDKCResult_RevocationKeyDecodeErrorZ _res);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_free")] public static extern void CResult_RevocationKeyDecodeErrorZ_free(long __res);
+       // uint64_t CResult_RevocationKeyDecodeErrorZ_clone_ptr(LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_clone_ptr")] public static extern long CResult_RevocationKeyDecodeErrorZ_clone_ptr(long _arg);
+       // struct LDKCResult_RevocationKeyDecodeErrorZ CResult_RevocationKeyDecodeErrorZ_clone(const struct LDKCResult_RevocationKeyDecodeErrorZ *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CResult_RevocationKeyDecodeErrorZ_clone")] public static extern long CResult_RevocationKeyDecodeErrorZ_clone(long _orig);
        // struct LDKCOption_FilterZ COption_FilterZ_some(struct LDKFilter o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_COption_FilterZ_some")] public static extern long COption_FilterZ_some(long _o);
        // struct LDKCOption_FilterZ COption_FilterZ_none(void);
@@ -5638,6 +6006,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_clone_ptr")] public static extern long Hostname_clone_ptr(long _arg);
        // struct LDKHostname Hostname_clone(const struct LDKHostname *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_clone")] public static extern long Hostname_clone(long _orig);
+       // uint64_t Hostname_hash(const struct LDKHostname *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_hash")] public static extern long Hostname_hash(long _o);
        // bool Hostname_eq(const struct LDKHostname *NONNULL_PTR a, const struct LDKHostname *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Hostname_eq")] public static extern bool Hostname_eq(long _a, long _b);
        // MUST_USE_RES uint8_t Hostname_len(const struct LDKHostname *NONNULL_PTR this_arg);
@@ -5652,6 +6022,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_clone_ptr")] public static extern long TransactionU16LenLimited_clone_ptr(long _arg);
        // struct LDKTransactionU16LenLimited TransactionU16LenLimited_clone(const struct LDKTransactionU16LenLimited *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_clone")] public static extern long TransactionU16LenLimited_clone(long _orig);
+       // uint64_t TransactionU16LenLimited_hash(const struct LDKTransactionU16LenLimited *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_hash")] public static extern long TransactionU16LenLimited_hash(long _o);
        // bool TransactionU16LenLimited_eq(const struct LDKTransactionU16LenLimited *NONNULL_PTR a, const struct LDKTransactionU16LenLimited *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TransactionU16LenLimited_eq")] public static extern bool TransactionU16LenLimited_eq(long _a, long _b);
        // MUST_USE_RES struct LDKCResult_TransactionU16LenLimitedNoneZ TransactionU16LenLimited_new(struct LDKTransaction transaction);
@@ -5702,6 +6074,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_clone")] public static extern long UntrustedString_clone(long _orig);
        // bool UntrustedString_eq(const struct LDKUntrustedString *NONNULL_PTR a, const struct LDKUntrustedString *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_eq")] public static extern bool UntrustedString_eq(long _a, long _b);
+       // uint64_t UntrustedString_hash(const struct LDKUntrustedString *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_hash")] public static extern long UntrustedString_hash(long _o);
        // struct LDKCVec_u8Z UntrustedString_write(const struct LDKUntrustedString *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UntrustedString_write")] public static extern long UntrustedString_write(long _obj);
        // struct LDKCResult_UntrustedStringDecodeErrorZ UntrustedString_read(struct LDKu8slice ser);
@@ -5766,6 +6140,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_level")] public static extern Level Record_get_level(long _this_ptr);
        // void Record_set_level(struct LDKRecord *NONNULL_PTR this_ptr, enum LDKLevel val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_level")] public static extern void Record_set_level(long _this_ptr, Level _val);
+       // struct LDKPublicKey Record_get_peer_id(const struct LDKRecord *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_peer_id")] public static extern long Record_get_peer_id(long _this_ptr);
+       // void Record_set_peer_id(struct LDKRecord *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_peer_id")] public static extern void Record_set_peer_id(long _this_ptr, long _val);
+       // struct LDKCOption_ThirtyTwoBytesZ Record_get_channel_id(const struct LDKRecord *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_channel_id")] public static extern long Record_get_channel_id(long _this_ptr);
+       // void Record_set_channel_id(struct LDKRecord *NONNULL_PTR this_ptr, struct LDKCOption_ThirtyTwoBytesZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_channel_id")] public static extern void Record_set_channel_id(long _this_ptr, long _val);
        // struct LDKStr Record_get_args(const struct LDKRecord *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_args")] public static extern long Record_get_args(long _this_ptr);
        // void Record_set_args(struct LDKRecord *NONNULL_PTR this_ptr, struct LDKStr val);
@@ -5782,6 +6164,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_get_line")] public static extern int Record_get_line(long _this_ptr);
        // void Record_set_line(struct LDKRecord *NONNULL_PTR this_ptr, uint32_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_set_line")] public static extern void Record_set_line(long _this_ptr, int _val);
+       // MUST_USE_RES struct LDKRecord Record_new(enum LDKLevel level_arg, struct LDKPublicKey peer_id_arg, struct LDKCOption_ThirtyTwoBytesZ channel_id_arg, struct LDKStr args_arg, struct LDKStr module_path_arg, struct LDKStr file_arg, uint32_t line_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_new")] public static extern long Record_new(Level _level_arg, long _peer_id_arg, long _channel_id_arg, long _args_arg, long _module_path_arg, long _file_arg, int _line_arg);
        // uint64_t Record_clone_ptr(LDKRecord *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Record_clone_ptr")] public static extern long Record_clone_ptr(long _arg);
        // struct LDKRecord Record_clone(const struct LDKRecord *NONNULL_PTR orig);
@@ -6058,7 +6442,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_get_outpoint")] public static extern long WatchedOutput_get_outpoint(long _this_ptr);
        // void WatchedOutput_set_outpoint(struct LDKWatchedOutput *NONNULL_PTR this_ptr, struct LDKOutPoint val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_set_outpoint")] public static extern void WatchedOutput_set_outpoint(long _this_ptr, long _val);
-       // struct LDKu8slice WatchedOutput_get_script_pubkey(const struct LDKWatchedOutput *NONNULL_PTR this_ptr);
+       // struct LDKCVec_u8Z WatchedOutput_get_script_pubkey(const struct LDKWatchedOutput *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_get_script_pubkey")] public static extern long WatchedOutput_get_script_pubkey(long _this_ptr);
        // void WatchedOutput_set_script_pubkey(struct LDKWatchedOutput *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WatchedOutput_set_script_pubkey")] public static extern void WatchedOutput_set_script_pubkey(long _this_ptr, long _val);
@@ -6078,8 +6462,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_clone")] public static extern ConfirmationTarget ConfirmationTarget_clone(long _orig);
        // enum LDKConfirmationTarget ConfirmationTarget_on_chain_sweep(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_on_chain_sweep")] public static extern ConfirmationTarget ConfirmationTarget_on_chain_sweep();
-       // enum LDKConfirmationTarget ConfirmationTarget_max_allowed_non_anchor_channel_remote_fee(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_max_allowed_non_anchor_channel_remote_fee")] public static extern ConfirmationTarget ConfirmationTarget_max_allowed_non_anchor_channel_remote_fee();
        // enum LDKConfirmationTarget ConfirmationTarget_min_allowed_anchor_channel_remote_fee(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ConfirmationTarget_min_allowed_anchor_channel_remote_fee")] public static extern ConfirmationTarget ConfirmationTarget_min_allowed_anchor_channel_remote_fee();
        // enum LDKConfirmationTarget ConfirmationTarget_min_allowed_non_anchor_channel_remote_fee(void);
@@ -6220,8 +6602,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_funding_txo")] public static extern long ChannelMonitor_get_funding_txo(long _this_arg);
        // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32CVec_u8ZZZZZ ChannelMonitor_get_outputs_to_watch(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_outputs_to_watch")] public static extern long ChannelMonitor_get_outputs_to_watch(long _this_arg);
-       // void ChannelMonitor_load_outputs_to_watch(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKFilter *NONNULL_PTR filter);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_load_outputs_to_watch")] public static extern void ChannelMonitor_load_outputs_to_watch(long _this_arg, long _filter);
+       // void ChannelMonitor_load_outputs_to_watch(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKFilter *NONNULL_PTR filter, const struct LDKLogger *NONNULL_PTR logger);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_load_outputs_to_watch")] public static extern void ChannelMonitor_load_outputs_to_watch(long _this_arg, long _filter, long _logger);
        // MUST_USE_RES struct LDKCVec_MonitorEventZ ChannelMonitor_get_and_clear_pending_monitor_events(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_and_clear_pending_monitor_events")] public static extern long ChannelMonitor_get_and_clear_pending_monitor_events(long _this_arg);
        // void ChannelMonitor_process_pending_events(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKEventHandler *NONNULL_PTR handler);
@@ -6236,21 +6618,21 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_counterparty_node_id")] public static extern long ChannelMonitor_get_counterparty_node_id(long _this_arg);
        // MUST_USE_RES struct LDKCVec_TransactionZ ChannelMonitor_get_latest_holder_commitment_txn(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_latest_holder_commitment_txn")] public static extern long ChannelMonitor_get_latest_holder_commitment_txn(long _this_arg, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ChannelMonitor_block_connected(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], struct LDKCVec_C2Tuple_usizeTransactionZZ txdata, uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, struct LDKLogger logger);
+       // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ChannelMonitor_block_connected(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], struct LDKCVec_C2Tuple_usizeTransactionZZ txdata, uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_block_connected")] public static extern long ChannelMonitor_block_connected(long _this_arg, long _header, long _txdata, int _height, long _broadcaster, long _fee_estimator, long _logger);
-       // void ChannelMonitor_block_disconnected(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, struct LDKLogger logger);
+       // void ChannelMonitor_block_disconnected(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_block_disconnected")] public static extern void ChannelMonitor_block_disconnected(long _this_arg, long _header, int _height, long _broadcaster, long _fee_estimator, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ChannelMonitor_transactions_confirmed(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], struct LDKCVec_C2Tuple_usizeTransactionZZ txdata, uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, struct LDKLogger logger);
+       // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ChannelMonitor_transactions_confirmed(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], struct LDKCVec_C2Tuple_usizeTransactionZZ txdata, uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_transactions_confirmed")] public static extern long ChannelMonitor_transactions_confirmed(long _this_arg, long _header, long _txdata, int _height, long _broadcaster, long _fee_estimator, long _logger);
-       // void ChannelMonitor_transaction_unconfirmed(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*txid)[32], struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, struct LDKLogger logger);
+       // void ChannelMonitor_transaction_unconfirmed(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*txid)[32], struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_transaction_unconfirmed")] public static extern void ChannelMonitor_transaction_unconfirmed(long _this_arg, long _txid, long _broadcaster, long _fee_estimator, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ChannelMonitor_best_block_updated(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, struct LDKLogger logger);
+       // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ ChannelMonitor_best_block_updated(const struct LDKChannelMonitor *NONNULL_PTR this_arg, const uint8_t (*header)[80], uint32_t height, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_best_block_updated")] public static extern long ChannelMonitor_best_block_updated(long _this_arg, long _header, int _height, long _broadcaster, long _fee_estimator, long _logger);
-       // MUST_USE_RES struct LDKCVec_C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZZ ChannelMonitor_get_relevant_txids(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
+       // MUST_USE_RES struct LDKCVec_C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZZ ChannelMonitor_get_relevant_txids(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_relevant_txids")] public static extern long ChannelMonitor_get_relevant_txids(long _this_arg);
        // MUST_USE_RES struct LDKBestBlock ChannelMonitor_current_best_block(const struct LDKChannelMonitor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_current_best_block")] public static extern long ChannelMonitor_current_best_block(long _this_arg);
-       // void ChannelMonitor_rebroadcast_pending_claims(const struct LDKChannelMonitor *NONNULL_PTR this_arg, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, struct LDKLogger logger);
+       // void ChannelMonitor_rebroadcast_pending_claims(const struct LDKChannelMonitor *NONNULL_PTR this_arg, struct LDKBroadcasterInterface broadcaster, struct LDKFeeEstimator fee_estimator, const struct LDKLogger *NONNULL_PTR logger);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_rebroadcast_pending_claims")] public static extern void ChannelMonitor_rebroadcast_pending_claims(long _this_arg, long _broadcaster, long _fee_estimator, long _logger);
        // MUST_USE_RES struct LDKCVec_SpendableOutputDescriptorZ ChannelMonitor_get_spendable_outputs(const struct LDKChannelMonitor *NONNULL_PTR this_arg, struct LDKTransaction tx, uint32_t confirmation_height);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelMonitor_get_spendable_outputs")] public static extern long ChannelMonitor_get_spendable_outputs(long _this_arg, long _tx, int _confirmation_height);
@@ -6284,6 +6666,102 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_write")] public static extern long OutPoint_write(long _obj);
        // struct LDKCResult_OutPointDecodeErrorZ OutPoint_read(struct LDKu8slice ser);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OutPoint_read")] public static extern long OutPoint_read(long _ser);
+       // void InboundHTLCErr_free(struct LDKInboundHTLCErr this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_free")] public static extern void InboundHTLCErr_free(long _this_obj);
+       // uint16_t InboundHTLCErr_get_err_code(const struct LDKInboundHTLCErr *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_get_err_code")] public static extern short InboundHTLCErr_get_err_code(long _this_ptr);
+       // void InboundHTLCErr_set_err_code(struct LDKInboundHTLCErr *NONNULL_PTR this_ptr, uint16_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_set_err_code")] public static extern void InboundHTLCErr_set_err_code(long _this_ptr, short _val);
+       // struct LDKCVec_u8Z InboundHTLCErr_get_err_data(const struct LDKInboundHTLCErr *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_get_err_data")] public static extern long InboundHTLCErr_get_err_data(long _this_ptr);
+       // void InboundHTLCErr_set_err_data(struct LDKInboundHTLCErr *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_set_err_data")] public static extern void InboundHTLCErr_set_err_data(long _this_ptr, long _val);
+       // struct LDKStr InboundHTLCErr_get_msg(const struct LDKInboundHTLCErr *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_get_msg")] public static extern long InboundHTLCErr_get_msg(long _this_ptr);
+       // void InboundHTLCErr_set_msg(struct LDKInboundHTLCErr *NONNULL_PTR this_ptr, struct LDKStr val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_set_msg")] public static extern void InboundHTLCErr_set_msg(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKInboundHTLCErr InboundHTLCErr_new(uint16_t err_code_arg, struct LDKCVec_u8Z err_data_arg, struct LDKStr msg_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InboundHTLCErr_new")] public static extern long InboundHTLCErr_new(short _err_code_arg, long _err_data_arg, long _msg_arg);
+       // struct LDKCResult_PendingHTLCInfoInboundHTLCErrZ peel_payment_onion(const struct LDKUpdateAddHTLC *NONNULL_PTR msg, const struct LDKNodeSigner *NONNULL_PTR node_signer, const struct LDKLogger *NONNULL_PTR logger, uint32_t cur_height, bool accept_mpp_keysend, bool allow_skimmed_fees);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_peel_payment_onion")] public static extern long peel_payment_onion(long _msg, long _node_signer, long _logger, int _cur_height, bool _accept_mpp_keysend, bool _allow_skimmed_fees);
+       // void PendingHTLCRouting_free(struct LDKPendingHTLCRouting this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_free")] public static extern void PendingHTLCRouting_free(long _this_ptr);
+       // uint64_t PendingHTLCRouting_clone_ptr(LDKPendingHTLCRouting *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_clone_ptr")] public static extern long PendingHTLCRouting_clone_ptr(long _arg);
+       // struct LDKPendingHTLCRouting PendingHTLCRouting_clone(const struct LDKPendingHTLCRouting *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_clone")] public static extern long PendingHTLCRouting_clone(long _orig);
+       // struct LDKPendingHTLCRouting PendingHTLCRouting_forward(struct LDKOnionPacket onion_packet, uint64_t short_channel_id, struct LDKBlindedForward blinded);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_forward")] public static extern long PendingHTLCRouting_forward(long _onion_packet, long _short_channel_id, long _blinded);
+       // struct LDKPendingHTLCRouting PendingHTLCRouting_receive(struct LDKFinalOnionHopData payment_data, struct LDKCOption_CVec_u8ZZ payment_metadata, uint32_t incoming_cltv_expiry, struct LDKThirtyTwoBytes phantom_shared_secret, struct LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs, bool requires_blinded_error);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_receive")] public static extern long PendingHTLCRouting_receive(long _payment_data, long _payment_metadata, int _incoming_cltv_expiry, long _phantom_shared_secret, long _custom_tlvs, bool _requires_blinded_error);
+       // struct LDKPendingHTLCRouting PendingHTLCRouting_receive_keysend(struct LDKFinalOnionHopData payment_data, struct LDKThirtyTwoBytes payment_preimage, struct LDKCOption_CVec_u8ZZ payment_metadata, uint32_t incoming_cltv_expiry, struct LDKCVec_C2Tuple_u64CVec_u8ZZZ custom_tlvs);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_receive_keysend")] public static extern long PendingHTLCRouting_receive_keysend(long _payment_data, long _payment_preimage, long _payment_metadata, int _incoming_cltv_expiry, long _custom_tlvs);
+       // void BlindedForward_free(struct LDKBlindedForward this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_free")] public static extern void BlindedForward_free(long _this_obj);
+       // struct LDKPublicKey BlindedForward_get_inbound_blinding_point(const struct LDKBlindedForward *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_get_inbound_blinding_point")] public static extern long BlindedForward_get_inbound_blinding_point(long _this_ptr);
+       // void BlindedForward_set_inbound_blinding_point(struct LDKBlindedForward *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_set_inbound_blinding_point")] public static extern void BlindedForward_set_inbound_blinding_point(long _this_ptr, long _val);
+       // enum LDKBlindedFailure BlindedForward_get_failure(const struct LDKBlindedForward *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_get_failure")] public static extern BlindedFailure BlindedForward_get_failure(long _this_ptr);
+       // void BlindedForward_set_failure(struct LDKBlindedForward *NONNULL_PTR this_ptr, enum LDKBlindedFailure val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_set_failure")] public static extern void BlindedForward_set_failure(long _this_ptr, BlindedFailure _val);
+       // MUST_USE_RES struct LDKBlindedForward BlindedForward_new(struct LDKPublicKey inbound_blinding_point_arg, enum LDKBlindedFailure failure_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_new")] public static extern long BlindedForward_new(long _inbound_blinding_point_arg, BlindedFailure _failure_arg);
+       // uint64_t BlindedForward_clone_ptr(LDKBlindedForward *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_clone_ptr")] public static extern long BlindedForward_clone_ptr(long _arg);
+       // struct LDKBlindedForward BlindedForward_clone(const struct LDKBlindedForward *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_clone")] public static extern long BlindedForward_clone(long _orig);
+       // uint64_t BlindedForward_hash(const struct LDKBlindedForward *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_hash")] public static extern long BlindedForward_hash(long _o);
+       // bool BlindedForward_eq(const struct LDKBlindedForward *NONNULL_PTR a, const struct LDKBlindedForward *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_eq")] public static extern bool BlindedForward_eq(long _a, long _b);
+       // void PendingHTLCInfo_free(struct LDKPendingHTLCInfo this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_free")] public static extern void PendingHTLCInfo_free(long _this_obj);
+       // struct LDKPendingHTLCRouting PendingHTLCInfo_get_routing(const struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_get_routing")] public static extern long PendingHTLCInfo_get_routing(long _this_ptr);
+       // void PendingHTLCInfo_set_routing(struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr, struct LDKPendingHTLCRouting val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_set_routing")] public static extern void PendingHTLCInfo_set_routing(long _this_ptr, long _val);
+       // const uint8_t (*PendingHTLCInfo_get_incoming_shared_secret(const struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_get_incoming_shared_secret")] public static extern long PendingHTLCInfo_get_incoming_shared_secret(long _this_ptr);
+       // void PendingHTLCInfo_set_incoming_shared_secret(struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_set_incoming_shared_secret")] public static extern void PendingHTLCInfo_set_incoming_shared_secret(long _this_ptr, long _val);
+       // const uint8_t (*PendingHTLCInfo_get_payment_hash(const struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_get_payment_hash")] public static extern long PendingHTLCInfo_get_payment_hash(long _this_ptr);
+       // void PendingHTLCInfo_set_payment_hash(struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_set_payment_hash")] public static extern void PendingHTLCInfo_set_payment_hash(long _this_ptr, long _val);
+       // struct LDKCOption_u64Z PendingHTLCInfo_get_incoming_amt_msat(const struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_get_incoming_amt_msat")] public static extern long PendingHTLCInfo_get_incoming_amt_msat(long _this_ptr);
+       // void PendingHTLCInfo_set_incoming_amt_msat(struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_set_incoming_amt_msat")] public static extern void PendingHTLCInfo_set_incoming_amt_msat(long _this_ptr, long _val);
+       // uint64_t PendingHTLCInfo_get_outgoing_amt_msat(const struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_get_outgoing_amt_msat")] public static extern long PendingHTLCInfo_get_outgoing_amt_msat(long _this_ptr);
+       // void PendingHTLCInfo_set_outgoing_amt_msat(struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_set_outgoing_amt_msat")] public static extern void PendingHTLCInfo_set_outgoing_amt_msat(long _this_ptr, long _val);
+       // uint32_t PendingHTLCInfo_get_outgoing_cltv_value(const struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_get_outgoing_cltv_value")] public static extern int PendingHTLCInfo_get_outgoing_cltv_value(long _this_ptr);
+       // void PendingHTLCInfo_set_outgoing_cltv_value(struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_set_outgoing_cltv_value")] public static extern void PendingHTLCInfo_set_outgoing_cltv_value(long _this_ptr, int _val);
+       // struct LDKCOption_u64Z PendingHTLCInfo_get_skimmed_fee_msat(const struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_get_skimmed_fee_msat")] public static extern long PendingHTLCInfo_get_skimmed_fee_msat(long _this_ptr);
+       // void PendingHTLCInfo_set_skimmed_fee_msat(struct LDKPendingHTLCInfo *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_set_skimmed_fee_msat")] public static extern void PendingHTLCInfo_set_skimmed_fee_msat(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKPendingHTLCInfo PendingHTLCInfo_new(struct LDKPendingHTLCRouting routing_arg, struct LDKThirtyTwoBytes incoming_shared_secret_arg, struct LDKThirtyTwoBytes payment_hash_arg, struct LDKCOption_u64Z incoming_amt_msat_arg, uint64_t outgoing_amt_msat_arg, uint32_t outgoing_cltv_value_arg, struct LDKCOption_u64Z skimmed_fee_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_new")] public static extern long PendingHTLCInfo_new(long _routing_arg, long _incoming_shared_secret_arg, long _payment_hash_arg, long _incoming_amt_msat_arg, long _outgoing_amt_msat_arg, int _outgoing_cltv_value_arg, long _skimmed_fee_msat_arg);
+       // uint64_t PendingHTLCInfo_clone_ptr(LDKPendingHTLCInfo *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_clone_ptr")] public static extern long PendingHTLCInfo_clone_ptr(long _arg);
+       // struct LDKPendingHTLCInfo PendingHTLCInfo_clone(const struct LDKPendingHTLCInfo *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_clone")] public static extern long PendingHTLCInfo_clone(long _orig);
+       // enum LDKBlindedFailure BlindedFailure_clone(const enum LDKBlindedFailure *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedFailure_clone")] public static extern BlindedFailure BlindedFailure_clone(long _orig);
+       // enum LDKBlindedFailure BlindedFailure_from_introduction_node(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedFailure_from_introduction_node")] public static extern BlindedFailure BlindedFailure_from_introduction_node();
+       // enum LDKBlindedFailure BlindedFailure_from_blinded_node(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedFailure_from_blinded_node")] public static extern BlindedFailure BlindedFailure_from_blinded_node();
+       // uint64_t BlindedFailure_hash(const enum LDKBlindedFailure *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedFailure_hash")] public static extern long BlindedFailure_hash(long _o);
+       // bool BlindedFailure_eq(const enum LDKBlindedFailure *NONNULL_PTR a, const enum LDKBlindedFailure *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedFailure_eq")] public static extern bool BlindedFailure_eq(long _a, long _b);
        // void FailureCode_free(struct LDKFailureCode this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FailureCode_free")] public static extern void FailureCode_free(long _this_ptr);
        // uint64_t FailureCode_clone_ptr(LDKFailureCode *NONNULL_PTR arg);
@@ -6540,8 +7018,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_new")] public static extern long ChannelManager_new(long _fee_est, long _chain_monitor, long _tx_broadcaster, long _router, long _logger, long _entropy_source, long _node_signer, long _signer_provider, long _config, long _params, int _current_timestamp);
        // MUST_USE_RES struct LDKUserConfig ChannelManager_get_current_default_configuration(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_get_current_default_configuration")] public static extern long ChannelManager_get_current_default_configuration(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_ThirtyTwoBytesAPIErrorZ ChannelManager_create_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPublicKey their_network_key, uint64_t channel_value_satoshis, uint64_t push_msat, struct LDKU128 user_channel_id, struct LDKUserConfig override_config);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_create_channel")] public static extern long ChannelManager_create_channel(long _this_arg, long _their_network_key, long _channel_value_satoshis, long _push_msat, long _user_channel_id, long _override_config);
+       // MUST_USE_RES struct LDKCResult_ThirtyTwoBytesAPIErrorZ ChannelManager_create_channel(const struct LDKChannelManager *NONNULL_PTR this_arg, struct LDKPublicKey their_network_key, uint64_t channel_value_satoshis, uint64_t push_msat, struct LDKU128 user_channel_id, struct LDKCOption_ThirtyTwoBytesZ temporary_channel_id, struct LDKUserConfig override_config);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_create_channel")] public static extern long ChannelManager_create_channel(long _this_arg, long _their_network_key, long _channel_value_satoshis, long _push_msat, long _user_channel_id, long _temporary_channel_id, long _override_config);
        // MUST_USE_RES struct LDKCVec_ChannelDetailsZ ChannelManager_list_channels(const struct LDKChannelManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_list_channels")] public static extern long ChannelManager_list_channels(long _this_arg);
        // MUST_USE_RES struct LDKCVec_ChannelDetailsZ ChannelManager_list_usable_channels(const struct LDKChannelManager *NONNULL_PTR this_arg);
@@ -6670,6 +7148,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_write")] public static extern long PhantomRouteHints_write(long _obj);
        // struct LDKCResult_PhantomRouteHintsDecodeErrorZ PhantomRouteHints_read(struct LDKu8slice ser);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomRouteHints_read")] public static extern long PhantomRouteHints_read(long _ser);
+       // struct LDKCVec_u8Z BlindedForward_write(const struct LDKBlindedForward *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_write")] public static extern long BlindedForward_write(long _obj);
+       // struct LDKCResult_BlindedForwardDecodeErrorZ BlindedForward_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedForward_read")] public static extern long BlindedForward_read(long _ser);
+       // struct LDKCVec_u8Z PendingHTLCRouting_write(const struct LDKPendingHTLCRouting *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_write")] public static extern long PendingHTLCRouting_write(long _obj);
+       // struct LDKCResult_PendingHTLCRoutingDecodeErrorZ PendingHTLCRouting_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCRouting_read")] public static extern long PendingHTLCRouting_read(long _ser);
+       // struct LDKCVec_u8Z PendingHTLCInfo_write(const struct LDKPendingHTLCInfo *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_write")] public static extern long PendingHTLCInfo_write(long _obj);
+       // struct LDKCResult_PendingHTLCInfoDecodeErrorZ PendingHTLCInfo_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PendingHTLCInfo_read")] public static extern long PendingHTLCInfo_read(long _ser);
+       // struct LDKCVec_u8Z BlindedFailure_write(const enum LDKBlindedFailure *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedFailure_write")] public static extern long BlindedFailure_write(long _obj);
+       // struct LDKCResult_BlindedFailureDecodeErrorZ BlindedFailure_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedFailure_read")] public static extern long BlindedFailure_read(long _ser);
        // struct LDKCVec_u8Z ChannelManager_write(const struct LDKChannelManager *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManager_write")] public static extern long ChannelManager_write(long _obj);
        // struct LDKCVec_u8Z ChannelShutdownState_write(const enum LDKChannelShutdownState *NONNULL_PTR obj);
@@ -6718,6 +7212,144 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelManagerReadArgs_new")] public static extern long ChannelManagerReadArgs_new(long _entropy_source, long _node_signer, long _signer_provider, long _fee_estimator, long _chain_monitor, long _tx_broadcaster, long _router, long _logger, long _default_config, long _channel_monitors);
        // struct LDKCResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ C2Tuple_ThirtyTwoBytesChannelManagerZ_read(struct LDKu8slice ser, struct LDKChannelManagerReadArgs arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_C2Tuple_ThirtyTwoBytesChannelManagerZ_read")] public static extern long C2Tuple_ThirtyTwoBytesChannelManagerZ_read(long _ser, long _arg);
+       // void DelayedPaymentBasepoint_free(struct LDKDelayedPaymentBasepoint this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_free")] public static extern void DelayedPaymentBasepoint_free(long _this_obj);
+       // struct LDKPublicKey DelayedPaymentBasepoint_get_a(const struct LDKDelayedPaymentBasepoint *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_get_a")] public static extern long DelayedPaymentBasepoint_get_a(long _this_ptr);
+       // void DelayedPaymentBasepoint_set_a(struct LDKDelayedPaymentBasepoint *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_set_a")] public static extern void DelayedPaymentBasepoint_set_a(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKDelayedPaymentBasepoint DelayedPaymentBasepoint_new(struct LDKPublicKey a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_new")] public static extern long DelayedPaymentBasepoint_new(long _a_arg);
+       // bool DelayedPaymentBasepoint_eq(const struct LDKDelayedPaymentBasepoint *NONNULL_PTR a, const struct LDKDelayedPaymentBasepoint *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_eq")] public static extern bool DelayedPaymentBasepoint_eq(long _a, long _b);
+       // uint64_t DelayedPaymentBasepoint_clone_ptr(LDKDelayedPaymentBasepoint *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_clone_ptr")] public static extern long DelayedPaymentBasepoint_clone_ptr(long _arg);
+       // struct LDKDelayedPaymentBasepoint DelayedPaymentBasepoint_clone(const struct LDKDelayedPaymentBasepoint *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_clone")] public static extern long DelayedPaymentBasepoint_clone(long _orig);
+       // uint64_t DelayedPaymentBasepoint_hash(const struct LDKDelayedPaymentBasepoint *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_hash")] public static extern long DelayedPaymentBasepoint_hash(long _o);
+       // MUST_USE_RES struct LDKPublicKey DelayedPaymentBasepoint_to_public_key(const struct LDKDelayedPaymentBasepoint *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_to_public_key")] public static extern long DelayedPaymentBasepoint_to_public_key(long _this_arg);
+       // struct LDKCVec_u8Z DelayedPaymentBasepoint_write(const struct LDKDelayedPaymentBasepoint *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_write")] public static extern long DelayedPaymentBasepoint_write(long _obj);
+       // struct LDKCResult_DelayedPaymentBasepointDecodeErrorZ DelayedPaymentBasepoint_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentBasepoint_read")] public static extern long DelayedPaymentBasepoint_read(long _ser);
+       // void DelayedPaymentKey_free(struct LDKDelayedPaymentKey this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_free")] public static extern void DelayedPaymentKey_free(long _this_obj);
+       // struct LDKPublicKey DelayedPaymentKey_get_a(const struct LDKDelayedPaymentKey *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_get_a")] public static extern long DelayedPaymentKey_get_a(long _this_ptr);
+       // void DelayedPaymentKey_set_a(struct LDKDelayedPaymentKey *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_set_a")] public static extern void DelayedPaymentKey_set_a(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKDelayedPaymentKey DelayedPaymentKey_new(struct LDKPublicKey a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_new")] public static extern long DelayedPaymentKey_new(long _a_arg);
+       // bool DelayedPaymentKey_eq(const struct LDKDelayedPaymentKey *NONNULL_PTR a, const struct LDKDelayedPaymentKey *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_eq")] public static extern bool DelayedPaymentKey_eq(long _a, long _b);
+       // uint64_t DelayedPaymentKey_clone_ptr(LDKDelayedPaymentKey *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_clone_ptr")] public static extern long DelayedPaymentKey_clone_ptr(long _arg);
+       // struct LDKDelayedPaymentKey DelayedPaymentKey_clone(const struct LDKDelayedPaymentKey *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_clone")] public static extern long DelayedPaymentKey_clone(long _orig);
+       // MUST_USE_RES struct LDKDelayedPaymentKey DelayedPaymentKey_from_basepoint(const struct LDKDelayedPaymentBasepoint *NONNULL_PTR countersignatory_basepoint, struct LDKPublicKey per_commitment_point);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_from_basepoint")] public static extern long DelayedPaymentKey_from_basepoint(long _countersignatory_basepoint, long _per_commitment_point);
+       // MUST_USE_RES struct LDKDelayedPaymentKey DelayedPaymentKey_from_secret_key(const uint8_t (*sk)[32]);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_from_secret_key")] public static extern long DelayedPaymentKey_from_secret_key(long _sk);
+       // MUST_USE_RES struct LDKPublicKey DelayedPaymentKey_to_public_key(const struct LDKDelayedPaymentKey *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_to_public_key")] public static extern long DelayedPaymentKey_to_public_key(long _this_arg);
+       // struct LDKCVec_u8Z DelayedPaymentKey_write(const struct LDKDelayedPaymentKey *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_write")] public static extern long DelayedPaymentKey_write(long _obj);
+       // struct LDKCResult_DelayedPaymentKeyDecodeErrorZ DelayedPaymentKey_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentKey_read")] public static extern long DelayedPaymentKey_read(long _ser);
+       // void HtlcBasepoint_free(struct LDKHtlcBasepoint this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_free")] public static extern void HtlcBasepoint_free(long _this_obj);
+       // struct LDKPublicKey HtlcBasepoint_get_a(const struct LDKHtlcBasepoint *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_get_a")] public static extern long HtlcBasepoint_get_a(long _this_ptr);
+       // void HtlcBasepoint_set_a(struct LDKHtlcBasepoint *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_set_a")] public static extern void HtlcBasepoint_set_a(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKHtlcBasepoint HtlcBasepoint_new(struct LDKPublicKey a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_new")] public static extern long HtlcBasepoint_new(long _a_arg);
+       // bool HtlcBasepoint_eq(const struct LDKHtlcBasepoint *NONNULL_PTR a, const struct LDKHtlcBasepoint *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_eq")] public static extern bool HtlcBasepoint_eq(long _a, long _b);
+       // uint64_t HtlcBasepoint_clone_ptr(LDKHtlcBasepoint *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_clone_ptr")] public static extern long HtlcBasepoint_clone_ptr(long _arg);
+       // struct LDKHtlcBasepoint HtlcBasepoint_clone(const struct LDKHtlcBasepoint *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_clone")] public static extern long HtlcBasepoint_clone(long _orig);
+       // uint64_t HtlcBasepoint_hash(const struct LDKHtlcBasepoint *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_hash")] public static extern long HtlcBasepoint_hash(long _o);
+       // MUST_USE_RES struct LDKPublicKey HtlcBasepoint_to_public_key(const struct LDKHtlcBasepoint *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_to_public_key")] public static extern long HtlcBasepoint_to_public_key(long _this_arg);
+       // struct LDKCVec_u8Z HtlcBasepoint_write(const struct LDKHtlcBasepoint *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_write")] public static extern long HtlcBasepoint_write(long _obj);
+       // struct LDKCResult_HtlcBasepointDecodeErrorZ HtlcBasepoint_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcBasepoint_read")] public static extern long HtlcBasepoint_read(long _ser);
+       // void HtlcKey_free(struct LDKHtlcKey this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_free")] public static extern void HtlcKey_free(long _this_obj);
+       // struct LDKPublicKey HtlcKey_get_a(const struct LDKHtlcKey *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_get_a")] public static extern long HtlcKey_get_a(long _this_ptr);
+       // void HtlcKey_set_a(struct LDKHtlcKey *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_set_a")] public static extern void HtlcKey_set_a(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKHtlcKey HtlcKey_new(struct LDKPublicKey a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_new")] public static extern long HtlcKey_new(long _a_arg);
+       // bool HtlcKey_eq(const struct LDKHtlcKey *NONNULL_PTR a, const struct LDKHtlcKey *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_eq")] public static extern bool HtlcKey_eq(long _a, long _b);
+       // uint64_t HtlcKey_clone_ptr(LDKHtlcKey *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_clone_ptr")] public static extern long HtlcKey_clone_ptr(long _arg);
+       // struct LDKHtlcKey HtlcKey_clone(const struct LDKHtlcKey *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_clone")] public static extern long HtlcKey_clone(long _orig);
+       // MUST_USE_RES struct LDKHtlcKey HtlcKey_from_basepoint(const struct LDKHtlcBasepoint *NONNULL_PTR countersignatory_basepoint, struct LDKPublicKey per_commitment_point);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_from_basepoint")] public static extern long HtlcKey_from_basepoint(long _countersignatory_basepoint, long _per_commitment_point);
+       // MUST_USE_RES struct LDKHtlcKey HtlcKey_from_secret_key(const uint8_t (*sk)[32]);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_from_secret_key")] public static extern long HtlcKey_from_secret_key(long _sk);
+       // MUST_USE_RES struct LDKPublicKey HtlcKey_to_public_key(const struct LDKHtlcKey *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_to_public_key")] public static extern long HtlcKey_to_public_key(long _this_arg);
+       // struct LDKCVec_u8Z HtlcKey_write(const struct LDKHtlcKey *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_write")] public static extern long HtlcKey_write(long _obj);
+       // struct LDKCResult_HtlcKeyDecodeErrorZ HtlcKey_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HtlcKey_read")] public static extern long HtlcKey_read(long _ser);
+       // void RevocationBasepoint_free(struct LDKRevocationBasepoint this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_free")] public static extern void RevocationBasepoint_free(long _this_obj);
+       // struct LDKPublicKey RevocationBasepoint_get_a(const struct LDKRevocationBasepoint *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_get_a")] public static extern long RevocationBasepoint_get_a(long _this_ptr);
+       // void RevocationBasepoint_set_a(struct LDKRevocationBasepoint *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_set_a")] public static extern void RevocationBasepoint_set_a(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKRevocationBasepoint RevocationBasepoint_new(struct LDKPublicKey a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_new")] public static extern long RevocationBasepoint_new(long _a_arg);
+       // bool RevocationBasepoint_eq(const struct LDKRevocationBasepoint *NONNULL_PTR a, const struct LDKRevocationBasepoint *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_eq")] public static extern bool RevocationBasepoint_eq(long _a, long _b);
+       // uint64_t RevocationBasepoint_clone_ptr(LDKRevocationBasepoint *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_clone_ptr")] public static extern long RevocationBasepoint_clone_ptr(long _arg);
+       // struct LDKRevocationBasepoint RevocationBasepoint_clone(const struct LDKRevocationBasepoint *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_clone")] public static extern long RevocationBasepoint_clone(long _orig);
+       // uint64_t RevocationBasepoint_hash(const struct LDKRevocationBasepoint *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_hash")] public static extern long RevocationBasepoint_hash(long _o);
+       // MUST_USE_RES struct LDKPublicKey RevocationBasepoint_to_public_key(const struct LDKRevocationBasepoint *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_to_public_key")] public static extern long RevocationBasepoint_to_public_key(long _this_arg);
+       // struct LDKCVec_u8Z RevocationBasepoint_write(const struct LDKRevocationBasepoint *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_write")] public static extern long RevocationBasepoint_write(long _obj);
+       // struct LDKCResult_RevocationBasepointDecodeErrorZ RevocationBasepoint_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationBasepoint_read")] public static extern long RevocationBasepoint_read(long _ser);
+       // void RevocationKey_free(struct LDKRevocationKey this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_free")] public static extern void RevocationKey_free(long _this_obj);
+       // struct LDKPublicKey RevocationKey_get_a(const struct LDKRevocationKey *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_get_a")] public static extern long RevocationKey_get_a(long _this_ptr);
+       // void RevocationKey_set_a(struct LDKRevocationKey *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_set_a")] public static extern void RevocationKey_set_a(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKRevocationKey RevocationKey_new(struct LDKPublicKey a_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_new")] public static extern long RevocationKey_new(long _a_arg);
+       // bool RevocationKey_eq(const struct LDKRevocationKey *NONNULL_PTR a, const struct LDKRevocationKey *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_eq")] public static extern bool RevocationKey_eq(long _a, long _b);
+       // uint64_t RevocationKey_clone_ptr(LDKRevocationKey *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_clone_ptr")] public static extern long RevocationKey_clone_ptr(long _arg);
+       // struct LDKRevocationKey RevocationKey_clone(const struct LDKRevocationKey *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_clone")] public static extern long RevocationKey_clone(long _orig);
+       // uint64_t RevocationKey_hash(const struct LDKRevocationKey *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_hash")] public static extern long RevocationKey_hash(long _o);
+       // MUST_USE_RES struct LDKRevocationKey RevocationKey_from_basepoint(const struct LDKRevocationBasepoint *NONNULL_PTR countersignatory_basepoint, struct LDKPublicKey per_commitment_point);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_from_basepoint")] public static extern long RevocationKey_from_basepoint(long _countersignatory_basepoint, long _per_commitment_point);
+       // MUST_USE_RES struct LDKPublicKey RevocationKey_to_public_key(const struct LDKRevocationKey *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_to_public_key")] public static extern long RevocationKey_to_public_key(long _this_arg);
+       // struct LDKCVec_u8Z RevocationKey_write(const struct LDKRevocationKey *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_write")] public static extern long RevocationKey_write(long _obj);
+       // struct LDKCResult_RevocationKeyDecodeErrorZ RevocationKey_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevocationKey_read")] public static extern long RevocationKey_read(long _ser);
        // void ExpandedKey_free(struct LDKExpandedKey this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ExpandedKey_free")] public static extern void ExpandedKey_free(long _this_obj);
        // MUST_USE_RES struct LDKExpandedKey ExpandedKey_new(const uint8_t (*key_material)[32]);
@@ -6746,6 +7378,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DecodeError_io")] public static extern long DecodeError_io(IOError _a);
        // struct LDKDecodeError DecodeError_unsupported_compression(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DecodeError_unsupported_compression")] public static extern long DecodeError_unsupported_compression();
+       // uint64_t DecodeError_hash(const struct LDKDecodeError *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DecodeError_hash")] public static extern long DecodeError_hash(long _o);
        // bool DecodeError_eq(const struct LDKDecodeError *NONNULL_PTR a, const struct LDKDecodeError *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DecodeError_eq")] public static extern bool DecodeError_eq(long _a, long _b);
        // void Init_free(struct LDKInit this_obj);
@@ -6768,6 +7402,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_clone_ptr")] public static extern long Init_clone_ptr(long _arg);
        // struct LDKInit Init_clone(const struct LDKInit *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_clone")] public static extern long Init_clone(long _orig);
+       // uint64_t Init_hash(const struct LDKInit *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_hash")] public static extern long Init_hash(long _o);
        // bool Init_eq(const struct LDKInit *NONNULL_PTR a, const struct LDKInit *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Init_eq")] public static extern bool Init_eq(long _a, long _b);
        // void ErrorMessage_free(struct LDKErrorMessage this_obj);
@@ -6786,6 +7422,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_clone_ptr")] public static extern long ErrorMessage_clone_ptr(long _arg);
        // struct LDKErrorMessage ErrorMessage_clone(const struct LDKErrorMessage *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_clone")] public static extern long ErrorMessage_clone(long _orig);
+       // uint64_t ErrorMessage_hash(const struct LDKErrorMessage *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_hash")] public static extern long ErrorMessage_hash(long _o);
        // bool ErrorMessage_eq(const struct LDKErrorMessage *NONNULL_PTR a, const struct LDKErrorMessage *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorMessage_eq")] public static extern bool ErrorMessage_eq(long _a, long _b);
        // void WarningMessage_free(struct LDKWarningMessage this_obj);
@@ -6804,6 +7442,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_clone_ptr")] public static extern long WarningMessage_clone_ptr(long _arg);
        // struct LDKWarningMessage WarningMessage_clone(const struct LDKWarningMessage *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_clone")] public static extern long WarningMessage_clone(long _orig);
+       // uint64_t WarningMessage_hash(const struct LDKWarningMessage *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_hash")] public static extern long WarningMessage_hash(long _o);
        // bool WarningMessage_eq(const struct LDKWarningMessage *NONNULL_PTR a, const struct LDKWarningMessage *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WarningMessage_eq")] public static extern bool WarningMessage_eq(long _a, long _b);
        // void Ping_free(struct LDKPing this_obj);
@@ -6822,6 +7462,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_clone_ptr")] public static extern long Ping_clone_ptr(long _arg);
        // struct LDKPing Ping_clone(const struct LDKPing *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_clone")] public static extern long Ping_clone(long _orig);
+       // uint64_t Ping_hash(const struct LDKPing *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_hash")] public static extern long Ping_hash(long _o);
        // bool Ping_eq(const struct LDKPing *NONNULL_PTR a, const struct LDKPing *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_eq")] public static extern bool Ping_eq(long _a, long _b);
        // void Pong_free(struct LDKPong this_obj);
@@ -6836,6 +7478,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_clone_ptr")] public static extern long Pong_clone_ptr(long _arg);
        // struct LDKPong Pong_clone(const struct LDKPong *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_clone")] public static extern long Pong_clone(long _orig);
+       // uint64_t Pong_hash(const struct LDKPong *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_hash")] public static extern long Pong_hash(long _o);
        // bool Pong_eq(const struct LDKPong *NONNULL_PTR a, const struct LDKPong *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Pong_eq")] public static extern bool Pong_eq(long _a, long _b);
        // void OpenChannel_free(struct LDKOpenChannel this_obj);
@@ -6926,6 +7570,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_clone_ptr")] public static extern long OpenChannel_clone_ptr(long _arg);
        // struct LDKOpenChannel OpenChannel_clone(const struct LDKOpenChannel *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_clone")] public static extern long OpenChannel_clone(long _orig);
+       // uint64_t OpenChannel_hash(const struct LDKOpenChannel *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_hash")] public static extern long OpenChannel_hash(long _o);
        // bool OpenChannel_eq(const struct LDKOpenChannel *NONNULL_PTR a, const struct LDKOpenChannel *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannel_eq")] public static extern bool OpenChannel_eq(long _a, long _b);
        // void OpenChannelV2_free(struct LDKOpenChannelV2 this_obj);
@@ -7024,6 +7670,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_clone_ptr")] public static extern long OpenChannelV2_clone_ptr(long _arg);
        // struct LDKOpenChannelV2 OpenChannelV2_clone(const struct LDKOpenChannelV2 *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_clone")] public static extern long OpenChannelV2_clone(long _orig);
+       // uint64_t OpenChannelV2_hash(const struct LDKOpenChannelV2 *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_hash")] public static extern long OpenChannelV2_hash(long _o);
        // bool OpenChannelV2_eq(const struct LDKOpenChannelV2 *NONNULL_PTR a, const struct LDKOpenChannelV2 *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OpenChannelV2_eq")] public static extern bool OpenChannelV2_eq(long _a, long _b);
        // void AcceptChannel_free(struct LDKAcceptChannel this_obj);
@@ -7098,6 +7746,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_clone_ptr")] public static extern long AcceptChannel_clone_ptr(long _arg);
        // struct LDKAcceptChannel AcceptChannel_clone(const struct LDKAcceptChannel *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_clone")] public static extern long AcceptChannel_clone(long _orig);
+       // uint64_t AcceptChannel_hash(const struct LDKAcceptChannel *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_hash")] public static extern long AcceptChannel_hash(long _o);
        // bool AcceptChannel_eq(const struct LDKAcceptChannel *NONNULL_PTR a, const struct LDKAcceptChannel *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_eq")] public static extern bool AcceptChannel_eq(long _a, long _b);
        // void AcceptChannelV2_free(struct LDKAcceptChannelV2 this_obj);
@@ -7180,6 +7830,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_clone_ptr")] public static extern long AcceptChannelV2_clone_ptr(long _arg);
        // struct LDKAcceptChannelV2 AcceptChannelV2_clone(const struct LDKAcceptChannelV2 *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_clone")] public static extern long AcceptChannelV2_clone(long _orig);
+       // uint64_t AcceptChannelV2_hash(const struct LDKAcceptChannelV2 *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_hash")] public static extern long AcceptChannelV2_hash(long _o);
        // bool AcceptChannelV2_eq(const struct LDKAcceptChannelV2 *NONNULL_PTR a, const struct LDKAcceptChannelV2 *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_eq")] public static extern bool AcceptChannelV2_eq(long _a, long _b);
        // void FundingCreated_free(struct LDKFundingCreated this_obj);
@@ -7206,6 +7858,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_clone_ptr")] public static extern long FundingCreated_clone_ptr(long _arg);
        // struct LDKFundingCreated FundingCreated_clone(const struct LDKFundingCreated *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_clone")] public static extern long FundingCreated_clone(long _orig);
+       // uint64_t FundingCreated_hash(const struct LDKFundingCreated *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_hash")] public static extern long FundingCreated_hash(long _o);
        // bool FundingCreated_eq(const struct LDKFundingCreated *NONNULL_PTR a, const struct LDKFundingCreated *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingCreated_eq")] public static extern bool FundingCreated_eq(long _a, long _b);
        // void FundingSigned_free(struct LDKFundingSigned this_obj);
@@ -7224,6 +7878,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_clone_ptr")] public static extern long FundingSigned_clone_ptr(long _arg);
        // struct LDKFundingSigned FundingSigned_clone(const struct LDKFundingSigned *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_clone")] public static extern long FundingSigned_clone(long _orig);
+       // uint64_t FundingSigned_hash(const struct LDKFundingSigned *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_hash")] public static extern long FundingSigned_hash(long _o);
        // bool FundingSigned_eq(const struct LDKFundingSigned *NONNULL_PTR a, const struct LDKFundingSigned *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FundingSigned_eq")] public static extern bool FundingSigned_eq(long _a, long _b);
        // void ChannelReady_free(struct LDKChannelReady this_obj);
@@ -7246,8 +7902,102 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_clone_ptr")] public static extern long ChannelReady_clone_ptr(long _arg);
        // struct LDKChannelReady ChannelReady_clone(const struct LDKChannelReady *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_clone")] public static extern long ChannelReady_clone(long _orig);
+       // uint64_t ChannelReady_hash(const struct LDKChannelReady *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_hash")] public static extern long ChannelReady_hash(long _o);
        // bool ChannelReady_eq(const struct LDKChannelReady *NONNULL_PTR a, const struct LDKChannelReady *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReady_eq")] public static extern bool ChannelReady_eq(long _a, long _b);
+       // void Stfu_free(struct LDKStfu this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_free")] public static extern void Stfu_free(long _this_obj);
+       // const uint8_t (*Stfu_get_channel_id(const struct LDKStfu *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_get_channel_id")] public static extern long Stfu_get_channel_id(long _this_ptr);
+       // void Stfu_set_channel_id(struct LDKStfu *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_set_channel_id")] public static extern void Stfu_set_channel_id(long _this_ptr, long _val);
+       // uint8_t Stfu_get_initiator(const struct LDKStfu *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_get_initiator")] public static extern byte Stfu_get_initiator(long _this_ptr);
+       // void Stfu_set_initiator(struct LDKStfu *NONNULL_PTR this_ptr, uint8_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_set_initiator")] public static extern void Stfu_set_initiator(long _this_ptr, byte _val);
+       // MUST_USE_RES struct LDKStfu Stfu_new(struct LDKThirtyTwoBytes channel_id_arg, uint8_t initiator_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_new")] public static extern long Stfu_new(long _channel_id_arg, byte _initiator_arg);
+       // uint64_t Stfu_clone_ptr(LDKStfu *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_clone_ptr")] public static extern long Stfu_clone_ptr(long _arg);
+       // struct LDKStfu Stfu_clone(const struct LDKStfu *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_clone")] public static extern long Stfu_clone(long _orig);
+       // bool Stfu_eq(const struct LDKStfu *NONNULL_PTR a, const struct LDKStfu *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_eq")] public static extern bool Stfu_eq(long _a, long _b);
+       // void Splice_free(struct LDKSplice this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_free")] public static extern void Splice_free(long _this_obj);
+       // const uint8_t (*Splice_get_channel_id(const struct LDKSplice *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_get_channel_id")] public static extern long Splice_get_channel_id(long _this_ptr);
+       // void Splice_set_channel_id(struct LDKSplice *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_set_channel_id")] public static extern void Splice_set_channel_id(long _this_ptr, long _val);
+       // const uint8_t (*Splice_get_chain_hash(const struct LDKSplice *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_get_chain_hash")] public static extern long Splice_get_chain_hash(long _this_ptr);
+       // void Splice_set_chain_hash(struct LDKSplice *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_set_chain_hash")] public static extern void Splice_set_chain_hash(long _this_ptr, long _val);
+       // int64_t Splice_get_relative_satoshis(const struct LDKSplice *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_get_relative_satoshis")] public static extern long Splice_get_relative_satoshis(long _this_ptr);
+       // void Splice_set_relative_satoshis(struct LDKSplice *NONNULL_PTR this_ptr, int64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_set_relative_satoshis")] public static extern void Splice_set_relative_satoshis(long _this_ptr, long _val);
+       // uint32_t Splice_get_funding_feerate_perkw(const struct LDKSplice *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_get_funding_feerate_perkw")] public static extern int Splice_get_funding_feerate_perkw(long _this_ptr);
+       // void Splice_set_funding_feerate_perkw(struct LDKSplice *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_set_funding_feerate_perkw")] public static extern void Splice_set_funding_feerate_perkw(long _this_ptr, int _val);
+       // uint32_t Splice_get_locktime(const struct LDKSplice *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_get_locktime")] public static extern int Splice_get_locktime(long _this_ptr);
+       // void Splice_set_locktime(struct LDKSplice *NONNULL_PTR this_ptr, uint32_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_set_locktime")] public static extern void Splice_set_locktime(long _this_ptr, int _val);
+       // struct LDKPublicKey Splice_get_funding_pubkey(const struct LDKSplice *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_get_funding_pubkey")] public static extern long Splice_get_funding_pubkey(long _this_ptr);
+       // void Splice_set_funding_pubkey(struct LDKSplice *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_set_funding_pubkey")] public static extern void Splice_set_funding_pubkey(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKSplice Splice_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKThirtyTwoBytes chain_hash_arg, int64_t relative_satoshis_arg, uint32_t funding_feerate_perkw_arg, uint32_t locktime_arg, struct LDKPublicKey funding_pubkey_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_new")] public static extern long Splice_new(long _channel_id_arg, long _chain_hash_arg, long _relative_satoshis_arg, int _funding_feerate_perkw_arg, int _locktime_arg, long _funding_pubkey_arg);
+       // uint64_t Splice_clone_ptr(LDKSplice *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_clone_ptr")] public static extern long Splice_clone_ptr(long _arg);
+       // struct LDKSplice Splice_clone(const struct LDKSplice *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_clone")] public static extern long Splice_clone(long _orig);
+       // bool Splice_eq(const struct LDKSplice *NONNULL_PTR a, const struct LDKSplice *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_eq")] public static extern bool Splice_eq(long _a, long _b);
+       // void SpliceAck_free(struct LDKSpliceAck this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_free")] public static extern void SpliceAck_free(long _this_obj);
+       // const uint8_t (*SpliceAck_get_channel_id(const struct LDKSpliceAck *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_get_channel_id")] public static extern long SpliceAck_get_channel_id(long _this_ptr);
+       // void SpliceAck_set_channel_id(struct LDKSpliceAck *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_set_channel_id")] public static extern void SpliceAck_set_channel_id(long _this_ptr, long _val);
+       // const uint8_t (*SpliceAck_get_chain_hash(const struct LDKSpliceAck *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_get_chain_hash")] public static extern long SpliceAck_get_chain_hash(long _this_ptr);
+       // void SpliceAck_set_chain_hash(struct LDKSpliceAck *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_set_chain_hash")] public static extern void SpliceAck_set_chain_hash(long _this_ptr, long _val);
+       // int64_t SpliceAck_get_relative_satoshis(const struct LDKSpliceAck *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_get_relative_satoshis")] public static extern long SpliceAck_get_relative_satoshis(long _this_ptr);
+       // void SpliceAck_set_relative_satoshis(struct LDKSpliceAck *NONNULL_PTR this_ptr, int64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_set_relative_satoshis")] public static extern void SpliceAck_set_relative_satoshis(long _this_ptr, long _val);
+       // struct LDKPublicKey SpliceAck_get_funding_pubkey(const struct LDKSpliceAck *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_get_funding_pubkey")] public static extern long SpliceAck_get_funding_pubkey(long _this_ptr);
+       // void SpliceAck_set_funding_pubkey(struct LDKSpliceAck *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_set_funding_pubkey")] public static extern void SpliceAck_set_funding_pubkey(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKSpliceAck SpliceAck_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKThirtyTwoBytes chain_hash_arg, int64_t relative_satoshis_arg, struct LDKPublicKey funding_pubkey_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_new")] public static extern long SpliceAck_new(long _channel_id_arg, long _chain_hash_arg, long _relative_satoshis_arg, long _funding_pubkey_arg);
+       // uint64_t SpliceAck_clone_ptr(LDKSpliceAck *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_clone_ptr")] public static extern long SpliceAck_clone_ptr(long _arg);
+       // struct LDKSpliceAck SpliceAck_clone(const struct LDKSpliceAck *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_clone")] public static extern long SpliceAck_clone(long _orig);
+       // bool SpliceAck_eq(const struct LDKSpliceAck *NONNULL_PTR a, const struct LDKSpliceAck *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_eq")] public static extern bool SpliceAck_eq(long _a, long _b);
+       // void SpliceLocked_free(struct LDKSpliceLocked this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_free")] public static extern void SpliceLocked_free(long _this_obj);
+       // const uint8_t (*SpliceLocked_get_channel_id(const struct LDKSpliceLocked *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_get_channel_id")] public static extern long SpliceLocked_get_channel_id(long _this_ptr);
+       // void SpliceLocked_set_channel_id(struct LDKSpliceLocked *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_set_channel_id")] public static extern void SpliceLocked_set_channel_id(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKSpliceLocked SpliceLocked_new(struct LDKThirtyTwoBytes channel_id_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_new")] public static extern long SpliceLocked_new(long _channel_id_arg);
+       // uint64_t SpliceLocked_clone_ptr(LDKSpliceLocked *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_clone_ptr")] public static extern long SpliceLocked_clone_ptr(long _arg);
+       // struct LDKSpliceLocked SpliceLocked_clone(const struct LDKSpliceLocked *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_clone")] public static extern long SpliceLocked_clone(long _orig);
+       // bool SpliceLocked_eq(const struct LDKSpliceLocked *NONNULL_PTR a, const struct LDKSpliceLocked *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_eq")] public static extern bool SpliceLocked_eq(long _a, long _b);
        // void TxAddInput_free(struct LDKTxAddInput this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_free")] public static extern void TxAddInput_free(long _this_obj);
        // const uint8_t (*TxAddInput_get_channel_id(const struct LDKTxAddInput *NONNULL_PTR this_ptr))[32];
@@ -7276,6 +8026,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_clone_ptr")] public static extern long TxAddInput_clone_ptr(long _arg);
        // struct LDKTxAddInput TxAddInput_clone(const struct LDKTxAddInput *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_clone")] public static extern long TxAddInput_clone(long _orig);
+       // uint64_t TxAddInput_hash(const struct LDKTxAddInput *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_hash")] public static extern long TxAddInput_hash(long _o);
        // bool TxAddInput_eq(const struct LDKTxAddInput *NONNULL_PTR a, const struct LDKTxAddInput *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_eq")] public static extern bool TxAddInput_eq(long _a, long _b);
        // void TxAddOutput_free(struct LDKTxAddOutput this_obj);
@@ -7292,7 +8044,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_get_sats")] public static extern long TxAddOutput_get_sats(long _this_ptr);
        // void TxAddOutput_set_sats(struct LDKTxAddOutput *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_set_sats")] public static extern void TxAddOutput_set_sats(long _this_ptr, long _val);
-       // struct LDKu8slice TxAddOutput_get_script(const struct LDKTxAddOutput *NONNULL_PTR this_ptr);
+       // struct LDKCVec_u8Z TxAddOutput_get_script(const struct LDKTxAddOutput *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_get_script")] public static extern long TxAddOutput_get_script(long _this_ptr);
        // void TxAddOutput_set_script(struct LDKTxAddOutput *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_set_script")] public static extern void TxAddOutput_set_script(long _this_ptr, long _val);
@@ -7302,6 +8054,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_clone_ptr")] public static extern long TxAddOutput_clone_ptr(long _arg);
        // struct LDKTxAddOutput TxAddOutput_clone(const struct LDKTxAddOutput *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_clone")] public static extern long TxAddOutput_clone(long _orig);
+       // uint64_t TxAddOutput_hash(const struct LDKTxAddOutput *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_hash")] public static extern long TxAddOutput_hash(long _o);
        // bool TxAddOutput_eq(const struct LDKTxAddOutput *NONNULL_PTR a, const struct LDKTxAddOutput *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddOutput_eq")] public static extern bool TxAddOutput_eq(long _a, long _b);
        // void TxRemoveInput_free(struct LDKTxRemoveInput this_obj);
@@ -7320,6 +8074,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_clone_ptr")] public static extern long TxRemoveInput_clone_ptr(long _arg);
        // struct LDKTxRemoveInput TxRemoveInput_clone(const struct LDKTxRemoveInput *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_clone")] public static extern long TxRemoveInput_clone(long _orig);
+       // uint64_t TxRemoveInput_hash(const struct LDKTxRemoveInput *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_hash")] public static extern long TxRemoveInput_hash(long _o);
        // bool TxRemoveInput_eq(const struct LDKTxRemoveInput *NONNULL_PTR a, const struct LDKTxRemoveInput *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveInput_eq")] public static extern bool TxRemoveInput_eq(long _a, long _b);
        // void TxRemoveOutput_free(struct LDKTxRemoveOutput this_obj);
@@ -7338,6 +8094,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_clone_ptr")] public static extern long TxRemoveOutput_clone_ptr(long _arg);
        // struct LDKTxRemoveOutput TxRemoveOutput_clone(const struct LDKTxRemoveOutput *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_clone")] public static extern long TxRemoveOutput_clone(long _orig);
+       // uint64_t TxRemoveOutput_hash(const struct LDKTxRemoveOutput *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_hash")] public static extern long TxRemoveOutput_hash(long _o);
        // bool TxRemoveOutput_eq(const struct LDKTxRemoveOutput *NONNULL_PTR a, const struct LDKTxRemoveOutput *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxRemoveOutput_eq")] public static extern bool TxRemoveOutput_eq(long _a, long _b);
        // void TxComplete_free(struct LDKTxComplete this_obj);
@@ -7352,6 +8110,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_clone_ptr")] public static extern long TxComplete_clone_ptr(long _arg);
        // struct LDKTxComplete TxComplete_clone(const struct LDKTxComplete *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_clone")] public static extern long TxComplete_clone(long _orig);
+       // uint64_t TxComplete_hash(const struct LDKTxComplete *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_hash")] public static extern long TxComplete_hash(long _o);
        // bool TxComplete_eq(const struct LDKTxComplete *NONNULL_PTR a, const struct LDKTxComplete *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxComplete_eq")] public static extern bool TxComplete_eq(long _a, long _b);
        // void TxSignatures_free(struct LDKTxSignatures this_obj);
@@ -7374,6 +8134,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_clone_ptr")] public static extern long TxSignatures_clone_ptr(long _arg);
        // struct LDKTxSignatures TxSignatures_clone(const struct LDKTxSignatures *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_clone")] public static extern long TxSignatures_clone(long _orig);
+       // uint64_t TxSignatures_hash(const struct LDKTxSignatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_hash")] public static extern long TxSignatures_hash(long _o);
        // bool TxSignatures_eq(const struct LDKTxSignatures *NONNULL_PTR a, const struct LDKTxSignatures *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxSignatures_eq")] public static extern bool TxSignatures_eq(long _a, long _b);
        // void TxInitRbf_free(struct LDKTxInitRbf this_obj);
@@ -7400,6 +8162,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_clone_ptr")] public static extern long TxInitRbf_clone_ptr(long _arg);
        // struct LDKTxInitRbf TxInitRbf_clone(const struct LDKTxInitRbf *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_clone")] public static extern long TxInitRbf_clone(long _orig);
+       // uint64_t TxInitRbf_hash(const struct LDKTxInitRbf *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_hash")] public static extern long TxInitRbf_hash(long _o);
        // bool TxInitRbf_eq(const struct LDKTxInitRbf *NONNULL_PTR a, const struct LDKTxInitRbf *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxInitRbf_eq")] public static extern bool TxInitRbf_eq(long _a, long _b);
        // void TxAckRbf_free(struct LDKTxAckRbf this_obj);
@@ -7418,6 +8182,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_clone_ptr")] public static extern long TxAckRbf_clone_ptr(long _arg);
        // struct LDKTxAckRbf TxAckRbf_clone(const struct LDKTxAckRbf *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_clone")] public static extern long TxAckRbf_clone(long _orig);
+       // uint64_t TxAckRbf_hash(const struct LDKTxAckRbf *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_hash")] public static extern long TxAckRbf_hash(long _o);
        // bool TxAckRbf_eq(const struct LDKTxAckRbf *NONNULL_PTR a, const struct LDKTxAckRbf *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAckRbf_eq")] public static extern bool TxAckRbf_eq(long _a, long _b);
        // void TxAbort_free(struct LDKTxAbort this_obj);
@@ -7436,6 +8202,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_clone_ptr")] public static extern long TxAbort_clone_ptr(long _arg);
        // struct LDKTxAbort TxAbort_clone(const struct LDKTxAbort *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_clone")] public static extern long TxAbort_clone(long _orig);
+       // uint64_t TxAbort_hash(const struct LDKTxAbort *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_hash")] public static extern long TxAbort_hash(long _o);
        // bool TxAbort_eq(const struct LDKTxAbort *NONNULL_PTR a, const struct LDKTxAbort *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAbort_eq")] public static extern bool TxAbort_eq(long _a, long _b);
        // void Shutdown_free(struct LDKShutdown this_obj);
@@ -7444,7 +8212,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_get_channel_id")] public static extern long Shutdown_get_channel_id(long _this_ptr);
        // void Shutdown_set_channel_id(struct LDKShutdown *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_set_channel_id")] public static extern void Shutdown_set_channel_id(long _this_ptr, long _val);
-       // struct LDKu8slice Shutdown_get_scriptpubkey(const struct LDKShutdown *NONNULL_PTR this_ptr);
+       // struct LDKCVec_u8Z Shutdown_get_scriptpubkey(const struct LDKShutdown *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_get_scriptpubkey")] public static extern long Shutdown_get_scriptpubkey(long _this_ptr);
        // void Shutdown_set_scriptpubkey(struct LDKShutdown *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_set_scriptpubkey")] public static extern void Shutdown_set_scriptpubkey(long _this_ptr, long _val);
@@ -7454,6 +8222,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_clone_ptr")] public static extern long Shutdown_clone_ptr(long _arg);
        // struct LDKShutdown Shutdown_clone(const struct LDKShutdown *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_clone")] public static extern long Shutdown_clone(long _orig);
+       // uint64_t Shutdown_hash(const struct LDKShutdown *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_hash")] public static extern long Shutdown_hash(long _o);
        // bool Shutdown_eq(const struct LDKShutdown *NONNULL_PTR a, const struct LDKShutdown *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Shutdown_eq")] public static extern bool Shutdown_eq(long _a, long _b);
        // void ClosingSignedFeeRange_free(struct LDKClosingSignedFeeRange this_obj);
@@ -7472,6 +8242,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_clone_ptr")] public static extern long ClosingSignedFeeRange_clone_ptr(long _arg);
        // struct LDKClosingSignedFeeRange ClosingSignedFeeRange_clone(const struct LDKClosingSignedFeeRange *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_clone")] public static extern long ClosingSignedFeeRange_clone(long _orig);
+       // uint64_t ClosingSignedFeeRange_hash(const struct LDKClosingSignedFeeRange *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_hash")] public static extern long ClosingSignedFeeRange_hash(long _o);
        // bool ClosingSignedFeeRange_eq(const struct LDKClosingSignedFeeRange *NONNULL_PTR a, const struct LDKClosingSignedFeeRange *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSignedFeeRange_eq")] public static extern bool ClosingSignedFeeRange_eq(long _a, long _b);
        // void ClosingSigned_free(struct LDKClosingSigned this_obj);
@@ -7498,6 +8270,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_clone_ptr")] public static extern long ClosingSigned_clone_ptr(long _arg);
        // struct LDKClosingSigned ClosingSigned_clone(const struct LDKClosingSigned *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_clone")] public static extern long ClosingSigned_clone(long _orig);
+       // uint64_t ClosingSigned_hash(const struct LDKClosingSigned *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_hash")] public static extern long ClosingSigned_hash(long _o);
        // bool ClosingSigned_eq(const struct LDKClosingSigned *NONNULL_PTR a, const struct LDKClosingSigned *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClosingSigned_eq")] public static extern bool ClosingSigned_eq(long _a, long _b);
        // void UpdateAddHTLC_free(struct LDKUpdateAddHTLC this_obj);
@@ -7526,10 +8300,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_skimmed_fee_msat")] public static extern long UpdateAddHTLC_get_skimmed_fee_msat(long _this_ptr);
        // void UpdateAddHTLC_set_skimmed_fee_msat(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, struct LDKCOption_u64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_skimmed_fee_msat")] public static extern void UpdateAddHTLC_set_skimmed_fee_msat(long _this_ptr, long _val);
+       // struct LDKOnionPacket UpdateAddHTLC_get_onion_routing_packet(const struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_onion_routing_packet")] public static extern long UpdateAddHTLC_get_onion_routing_packet(long _this_ptr);
+       // void UpdateAddHTLC_set_onion_routing_packet(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, struct LDKOnionPacket val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_onion_routing_packet")] public static extern void UpdateAddHTLC_set_onion_routing_packet(long _this_ptr, long _val);
+       // struct LDKPublicKey UpdateAddHTLC_get_blinding_point(const struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_get_blinding_point")] public static extern long UpdateAddHTLC_get_blinding_point(long _this_ptr);
+       // void UpdateAddHTLC_set_blinding_point(struct LDKUpdateAddHTLC *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_set_blinding_point")] public static extern void UpdateAddHTLC_set_blinding_point(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKUpdateAddHTLC UpdateAddHTLC_new(struct LDKThirtyTwoBytes channel_id_arg, uint64_t htlc_id_arg, uint64_t amount_msat_arg, struct LDKThirtyTwoBytes payment_hash_arg, uint32_t cltv_expiry_arg, struct LDKCOption_u64Z skimmed_fee_msat_arg, struct LDKOnionPacket onion_routing_packet_arg, struct LDKPublicKey blinding_point_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_new")] public static extern long UpdateAddHTLC_new(long _channel_id_arg, long _htlc_id_arg, long _amount_msat_arg, long _payment_hash_arg, int _cltv_expiry_arg, long _skimmed_fee_msat_arg, long _onion_routing_packet_arg, long _blinding_point_arg);
        // uint64_t UpdateAddHTLC_clone_ptr(LDKUpdateAddHTLC *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_clone_ptr")] public static extern long UpdateAddHTLC_clone_ptr(long _arg);
        // struct LDKUpdateAddHTLC UpdateAddHTLC_clone(const struct LDKUpdateAddHTLC *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_clone")] public static extern long UpdateAddHTLC_clone(long _orig);
+       // uint64_t UpdateAddHTLC_hash(const struct LDKUpdateAddHTLC *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_hash")] public static extern long UpdateAddHTLC_hash(long _o);
        // bool UpdateAddHTLC_eq(const struct LDKUpdateAddHTLC *NONNULL_PTR a, const struct LDKUpdateAddHTLC *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_eq")] public static extern bool UpdateAddHTLC_eq(long _a, long _b);
        // void OnionMessage_free(struct LDKOnionMessage this_obj);
@@ -7548,6 +8334,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_clone_ptr")] public static extern long OnionMessage_clone_ptr(long _arg);
        // struct LDKOnionMessage OnionMessage_clone(const struct LDKOnionMessage *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_clone")] public static extern long OnionMessage_clone(long _orig);
+       // uint64_t OnionMessage_hash(const struct LDKOnionMessage *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_hash")] public static extern long OnionMessage_hash(long _o);
        // bool OnionMessage_eq(const struct LDKOnionMessage *NONNULL_PTR a, const struct LDKOnionMessage *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_eq")] public static extern bool OnionMessage_eq(long _a, long _b);
        // void UpdateFulfillHTLC_free(struct LDKUpdateFulfillHTLC this_obj);
@@ -7570,6 +8358,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_clone_ptr")] public static extern long UpdateFulfillHTLC_clone_ptr(long _arg);
        // struct LDKUpdateFulfillHTLC UpdateFulfillHTLC_clone(const struct LDKUpdateFulfillHTLC *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_clone")] public static extern long UpdateFulfillHTLC_clone(long _orig);
+       // uint64_t UpdateFulfillHTLC_hash(const struct LDKUpdateFulfillHTLC *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_hash")] public static extern long UpdateFulfillHTLC_hash(long _o);
        // bool UpdateFulfillHTLC_eq(const struct LDKUpdateFulfillHTLC *NONNULL_PTR a, const struct LDKUpdateFulfillHTLC *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_eq")] public static extern bool UpdateFulfillHTLC_eq(long _a, long _b);
        // void UpdateFailHTLC_free(struct LDKUpdateFailHTLC this_obj);
@@ -7586,6 +8376,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_clone_ptr")] public static extern long UpdateFailHTLC_clone_ptr(long _arg);
        // struct LDKUpdateFailHTLC UpdateFailHTLC_clone(const struct LDKUpdateFailHTLC *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_clone")] public static extern long UpdateFailHTLC_clone(long _orig);
+       // uint64_t UpdateFailHTLC_hash(const struct LDKUpdateFailHTLC *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_hash")] public static extern long UpdateFailHTLC_hash(long _o);
        // bool UpdateFailHTLC_eq(const struct LDKUpdateFailHTLC *NONNULL_PTR a, const struct LDKUpdateFailHTLC *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailHTLC_eq")] public static extern bool UpdateFailHTLC_eq(long _a, long _b);
        // void UpdateFailMalformedHTLC_free(struct LDKUpdateFailMalformedHTLC this_obj);
@@ -7606,6 +8398,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_clone_ptr")] public static extern long UpdateFailMalformedHTLC_clone_ptr(long _arg);
        // struct LDKUpdateFailMalformedHTLC UpdateFailMalformedHTLC_clone(const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_clone")] public static extern long UpdateFailMalformedHTLC_clone(long _orig);
+       // uint64_t UpdateFailMalformedHTLC_hash(const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_hash")] public static extern long UpdateFailMalformedHTLC_hash(long _o);
        // bool UpdateFailMalformedHTLC_eq(const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR a, const struct LDKUpdateFailMalformedHTLC *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFailMalformedHTLC_eq")] public static extern bool UpdateFailMalformedHTLC_eq(long _a, long _b);
        // void CommitmentSigned_free(struct LDKCommitmentSigned this_obj);
@@ -7628,6 +8422,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_clone_ptr")] public static extern long CommitmentSigned_clone_ptr(long _arg);
        // struct LDKCommitmentSigned CommitmentSigned_clone(const struct LDKCommitmentSigned *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_clone")] public static extern long CommitmentSigned_clone(long _orig);
+       // uint64_t CommitmentSigned_hash(const struct LDKCommitmentSigned *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_hash")] public static extern long CommitmentSigned_hash(long _o);
        // bool CommitmentSigned_eq(const struct LDKCommitmentSigned *NONNULL_PTR a, const struct LDKCommitmentSigned *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentSigned_eq")] public static extern bool CommitmentSigned_eq(long _a, long _b);
        // void RevokeAndACK_free(struct LDKRevokeAndACK this_obj);
@@ -7650,6 +8446,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_clone_ptr")] public static extern long RevokeAndACK_clone_ptr(long _arg);
        // struct LDKRevokeAndACK RevokeAndACK_clone(const struct LDKRevokeAndACK *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_clone")] public static extern long RevokeAndACK_clone(long _orig);
+       // uint64_t RevokeAndACK_hash(const struct LDKRevokeAndACK *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_hash")] public static extern long RevokeAndACK_hash(long _o);
        // bool RevokeAndACK_eq(const struct LDKRevokeAndACK *NONNULL_PTR a, const struct LDKRevokeAndACK *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RevokeAndACK_eq")] public static extern bool RevokeAndACK_eq(long _a, long _b);
        // void UpdateFee_free(struct LDKUpdateFee this_obj);
@@ -7668,6 +8466,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_clone_ptr")] public static extern long UpdateFee_clone_ptr(long _arg);
        // struct LDKUpdateFee UpdateFee_clone(const struct LDKUpdateFee *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_clone")] public static extern long UpdateFee_clone(long _orig);
+       // uint64_t UpdateFee_hash(const struct LDKUpdateFee *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_hash")] public static extern long UpdateFee_hash(long _o);
        // bool UpdateFee_eq(const struct LDKUpdateFee *NONNULL_PTR a, const struct LDKUpdateFee *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFee_eq")] public static extern bool UpdateFee_eq(long _a, long _b);
        // void ChannelReestablish_free(struct LDKChannelReestablish this_obj);
@@ -7702,6 +8502,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_clone_ptr")] public static extern long ChannelReestablish_clone_ptr(long _arg);
        // struct LDKChannelReestablish ChannelReestablish_clone(const struct LDKChannelReestablish *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_clone")] public static extern long ChannelReestablish_clone(long _orig);
+       // uint64_t ChannelReestablish_hash(const struct LDKChannelReestablish *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_hash")] public static extern long ChannelReestablish_hash(long _o);
        // bool ChannelReestablish_eq(const struct LDKChannelReestablish *NONNULL_PTR a, const struct LDKChannelReestablish *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelReestablish_eq")] public static extern bool ChannelReestablish_eq(long _a, long _b);
        // void AnnouncementSignatures_free(struct LDKAnnouncementSignatures this_obj);
@@ -7728,6 +8530,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_clone_ptr")] public static extern long AnnouncementSignatures_clone_ptr(long _arg);
        // struct LDKAnnouncementSignatures AnnouncementSignatures_clone(const struct LDKAnnouncementSignatures *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_clone")] public static extern long AnnouncementSignatures_clone(long _orig);
+       // uint64_t AnnouncementSignatures_hash(const struct LDKAnnouncementSignatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_hash")] public static extern long AnnouncementSignatures_hash(long _o);
        // bool AnnouncementSignatures_eq(const struct LDKAnnouncementSignatures *NONNULL_PTR a, const struct LDKAnnouncementSignatures *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AnnouncementSignatures_eq")] public static extern bool AnnouncementSignatures_eq(long _a, long _b);
        // void SocketAddress_free(struct LDKSocketAddress this_ptr);
@@ -7746,6 +8550,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_onion_v3")] public static extern long SocketAddress_onion_v3(long _ed25519_pubkey, short _checksum, byte _version, short _port);
        // struct LDKSocketAddress SocketAddress_hostname(struct LDKHostname hostname, uint16_t port);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_hostname")] public static extern long SocketAddress_hostname(long _hostname, short _port);
+       // uint64_t SocketAddress_hash(const struct LDKSocketAddress *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_hash")] public static extern long SocketAddress_hash(long _o);
        // bool SocketAddress_eq(const struct LDKSocketAddress *NONNULL_PTR a, const struct LDKSocketAddress *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddress_eq")] public static extern bool SocketAddress_eq(long _a, long _b);
        // struct LDKCVec_u8Z SocketAddress_write(const struct LDKSocketAddress *NONNULL_PTR obj);
@@ -7762,6 +8568,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddressParseError_invalid_port")] public static extern SocketAddressParseError SocketAddressParseError_invalid_port();
        // enum LDKSocketAddressParseError SocketAddressParseError_invalid_onion_v3(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddressParseError_invalid_onion_v3")] public static extern SocketAddressParseError SocketAddressParseError_invalid_onion_v3();
+       // uint64_t SocketAddressParseError_hash(const enum LDKSocketAddressParseError *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddressParseError_hash")] public static extern long SocketAddressParseError_hash(long _o);
        // bool SocketAddressParseError_eq(const enum LDKSocketAddressParseError *NONNULL_PTR a, const enum LDKSocketAddressParseError *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SocketAddressParseError_eq")] public static extern bool SocketAddressParseError_eq(long _a, long _b);
        // struct LDKCResult_SocketAddressSocketAddressParseErrorZ parse_onion_address(struct LDKStr host, uint16_t port);
@@ -7814,6 +8622,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_clone_ptr")] public static extern long UnsignedNodeAnnouncement_clone_ptr(long _arg);
        // struct LDKUnsignedNodeAnnouncement UnsignedNodeAnnouncement_clone(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_clone")] public static extern long UnsignedNodeAnnouncement_clone(long _orig);
+       // uint64_t UnsignedNodeAnnouncement_hash(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_hash")] public static extern long UnsignedNodeAnnouncement_hash(long _o);
        // bool UnsignedNodeAnnouncement_eq(const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR a, const struct LDKUnsignedNodeAnnouncement *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedNodeAnnouncement_eq")] public static extern bool UnsignedNodeAnnouncement_eq(long _a, long _b);
        // void NodeAnnouncement_free(struct LDKNodeAnnouncement this_obj);
@@ -7832,6 +8642,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_clone_ptr")] public static extern long NodeAnnouncement_clone_ptr(long _arg);
        // struct LDKNodeAnnouncement NodeAnnouncement_clone(const struct LDKNodeAnnouncement *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_clone")] public static extern long NodeAnnouncement_clone(long _orig);
+       // uint64_t NodeAnnouncement_hash(const struct LDKNodeAnnouncement *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_hash")] public static extern long NodeAnnouncement_hash(long _o);
        // bool NodeAnnouncement_eq(const struct LDKNodeAnnouncement *NONNULL_PTR a, const struct LDKNodeAnnouncement *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAnnouncement_eq")] public static extern bool NodeAnnouncement_eq(long _a, long _b);
        // void UnsignedChannelAnnouncement_free(struct LDKUnsignedChannelAnnouncement this_obj);
@@ -7874,6 +8686,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_clone_ptr")] public static extern long UnsignedChannelAnnouncement_clone_ptr(long _arg);
        // struct LDKUnsignedChannelAnnouncement UnsignedChannelAnnouncement_clone(const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_clone")] public static extern long UnsignedChannelAnnouncement_clone(long _orig);
+       // uint64_t UnsignedChannelAnnouncement_hash(const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_hash")] public static extern long UnsignedChannelAnnouncement_hash(long _o);
        // bool UnsignedChannelAnnouncement_eq(const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR a, const struct LDKUnsignedChannelAnnouncement *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelAnnouncement_eq")] public static extern bool UnsignedChannelAnnouncement_eq(long _a, long _b);
        // void ChannelAnnouncement_free(struct LDKChannelAnnouncement this_obj);
@@ -7904,6 +8718,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_clone_ptr")] public static extern long ChannelAnnouncement_clone_ptr(long _arg);
        // struct LDKChannelAnnouncement ChannelAnnouncement_clone(const struct LDKChannelAnnouncement *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_clone")] public static extern long ChannelAnnouncement_clone(long _orig);
+       // uint64_t ChannelAnnouncement_hash(const struct LDKChannelAnnouncement *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_hash")] public static extern long ChannelAnnouncement_hash(long _o);
        // bool ChannelAnnouncement_eq(const struct LDKChannelAnnouncement *NONNULL_PTR a, const struct LDKChannelAnnouncement *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelAnnouncement_eq")] public static extern bool ChannelAnnouncement_eq(long _a, long _b);
        // void UnsignedChannelUpdate_free(struct LDKUnsignedChannelUpdate this_obj);
@@ -7954,6 +8770,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_clone_ptr")] public static extern long UnsignedChannelUpdate_clone_ptr(long _arg);
        // struct LDKUnsignedChannelUpdate UnsignedChannelUpdate_clone(const struct LDKUnsignedChannelUpdate *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_clone")] public static extern long UnsignedChannelUpdate_clone(long _orig);
+       // uint64_t UnsignedChannelUpdate_hash(const struct LDKUnsignedChannelUpdate *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_hash")] public static extern long UnsignedChannelUpdate_hash(long _o);
        // bool UnsignedChannelUpdate_eq(const struct LDKUnsignedChannelUpdate *NONNULL_PTR a, const struct LDKUnsignedChannelUpdate *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UnsignedChannelUpdate_eq")] public static extern bool UnsignedChannelUpdate_eq(long _a, long _b);
        // void ChannelUpdate_free(struct LDKChannelUpdate this_obj);
@@ -7972,6 +8790,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_clone_ptr")] public static extern long ChannelUpdate_clone_ptr(long _arg);
        // struct LDKChannelUpdate ChannelUpdate_clone(const struct LDKChannelUpdate *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_clone")] public static extern long ChannelUpdate_clone(long _orig);
+       // uint64_t ChannelUpdate_hash(const struct LDKChannelUpdate *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_hash")] public static extern long ChannelUpdate_hash(long _o);
        // bool ChannelUpdate_eq(const struct LDKChannelUpdate *NONNULL_PTR a, const struct LDKChannelUpdate *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelUpdate_eq")] public static extern bool ChannelUpdate_eq(long _a, long _b);
        // void QueryChannelRange_free(struct LDKQueryChannelRange this_obj);
@@ -7994,6 +8814,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_clone_ptr")] public static extern long QueryChannelRange_clone_ptr(long _arg);
        // struct LDKQueryChannelRange QueryChannelRange_clone(const struct LDKQueryChannelRange *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_clone")] public static extern long QueryChannelRange_clone(long _orig);
+       // uint64_t QueryChannelRange_hash(const struct LDKQueryChannelRange *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_hash")] public static extern long QueryChannelRange_hash(long _o);
        // bool QueryChannelRange_eq(const struct LDKQueryChannelRange *NONNULL_PTR a, const struct LDKQueryChannelRange *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryChannelRange_eq")] public static extern bool QueryChannelRange_eq(long _a, long _b);
        // void ReplyChannelRange_free(struct LDKReplyChannelRange this_obj);
@@ -8024,6 +8846,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_clone_ptr")] public static extern long ReplyChannelRange_clone_ptr(long _arg);
        // struct LDKReplyChannelRange ReplyChannelRange_clone(const struct LDKReplyChannelRange *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_clone")] public static extern long ReplyChannelRange_clone(long _orig);
+       // uint64_t ReplyChannelRange_hash(const struct LDKReplyChannelRange *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_hash")] public static extern long ReplyChannelRange_hash(long _o);
        // bool ReplyChannelRange_eq(const struct LDKReplyChannelRange *NONNULL_PTR a, const struct LDKReplyChannelRange *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyChannelRange_eq")] public static extern bool ReplyChannelRange_eq(long _a, long _b);
        // void QueryShortChannelIds_free(struct LDKQueryShortChannelIds this_obj);
@@ -8042,6 +8866,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_clone_ptr")] public static extern long QueryShortChannelIds_clone_ptr(long _arg);
        // struct LDKQueryShortChannelIds QueryShortChannelIds_clone(const struct LDKQueryShortChannelIds *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_clone")] public static extern long QueryShortChannelIds_clone(long _orig);
+       // uint64_t QueryShortChannelIds_hash(const struct LDKQueryShortChannelIds *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_hash")] public static extern long QueryShortChannelIds_hash(long _o);
        // bool QueryShortChannelIds_eq(const struct LDKQueryShortChannelIds *NONNULL_PTR a, const struct LDKQueryShortChannelIds *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_QueryShortChannelIds_eq")] public static extern bool QueryShortChannelIds_eq(long _a, long _b);
        // void ReplyShortChannelIdsEnd_free(struct LDKReplyShortChannelIdsEnd this_obj);
@@ -8060,6 +8886,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_clone_ptr")] public static extern long ReplyShortChannelIdsEnd_clone_ptr(long _arg);
        // struct LDKReplyShortChannelIdsEnd ReplyShortChannelIdsEnd_clone(const struct LDKReplyShortChannelIdsEnd *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_clone")] public static extern long ReplyShortChannelIdsEnd_clone(long _orig);
+       // uint64_t ReplyShortChannelIdsEnd_hash(const struct LDKReplyShortChannelIdsEnd *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_hash")] public static extern long ReplyShortChannelIdsEnd_hash(long _o);
        // bool ReplyShortChannelIdsEnd_eq(const struct LDKReplyShortChannelIdsEnd *NONNULL_PTR a, const struct LDKReplyShortChannelIdsEnd *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReplyShortChannelIdsEnd_eq")] public static extern bool ReplyShortChannelIdsEnd_eq(long _a, long _b);
        // void GossipTimestampFilter_free(struct LDKGossipTimestampFilter this_obj);
@@ -8082,6 +8910,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_clone_ptr")] public static extern long GossipTimestampFilter_clone_ptr(long _arg);
        // struct LDKGossipTimestampFilter GossipTimestampFilter_clone(const struct LDKGossipTimestampFilter *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_clone")] public static extern long GossipTimestampFilter_clone(long _orig);
+       // uint64_t GossipTimestampFilter_hash(const struct LDKGossipTimestampFilter *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_hash")] public static extern long GossipTimestampFilter_hash(long _o);
        // bool GossipTimestampFilter_eq(const struct LDKGossipTimestampFilter *NONNULL_PTR a, const struct LDKGossipTimestampFilter *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GossipTimestampFilter_eq")] public static extern bool GossipTimestampFilter_eq(long _a, long _b);
        // void ErrorAction_free(struct LDKErrorAction this_ptr);
@@ -8104,6 +8934,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorAction_send_error_message")] public static extern long ErrorAction_send_error_message(long _msg);
        // struct LDKErrorAction ErrorAction_send_warning_message(struct LDKWarningMessage msg, enum LDKLevel log_level);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorAction_send_warning_message")] public static extern long ErrorAction_send_warning_message(long _msg, Level _log_level);
+       // uint64_t ErrorAction_hash(const struct LDKErrorAction *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ErrorAction_hash")] public static extern long ErrorAction_hash(long _o);
        // void LightningError_free(struct LDKLightningError this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_LightningError_free")] public static extern void LightningError_free(long _this_obj);
        // struct LDKStr LightningError_get_err(const struct LDKLightningError *NONNULL_PTR this_ptr);
@@ -8152,6 +8984,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_clone_ptr")] public static extern long CommitmentUpdate_clone_ptr(long _arg);
        // struct LDKCommitmentUpdate CommitmentUpdate_clone(const struct LDKCommitmentUpdate *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_clone")] public static extern long CommitmentUpdate_clone(long _orig);
+       // uint64_t CommitmentUpdate_hash(const struct LDKCommitmentUpdate *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_hash")] public static extern long CommitmentUpdate_hash(long _o);
        // bool CommitmentUpdate_eq(const struct LDKCommitmentUpdate *NONNULL_PTR a, const struct LDKCommitmentUpdate *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CommitmentUpdate_eq")] public static extern bool CommitmentUpdate_eq(long _a, long _b);
        // void ChannelMessageHandler_free(struct LDKChannelMessageHandler this_ptr);
@@ -8160,6 +8994,44 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RoutingMessageHandler_free")] public static extern void RoutingMessageHandler_free(long _this_ptr);
        // void OnionMessageHandler_free(struct LDKOnionMessageHandler this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessageHandler_free")] public static extern void OnionMessageHandler_free(long _this_ptr);
+       // void FinalOnionHopData_free(struct LDKFinalOnionHopData this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_free")] public static extern void FinalOnionHopData_free(long _this_obj);
+       // const uint8_t (*FinalOnionHopData_get_payment_secret(const struct LDKFinalOnionHopData *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_get_payment_secret")] public static extern long FinalOnionHopData_get_payment_secret(long _this_ptr);
+       // void FinalOnionHopData_set_payment_secret(struct LDKFinalOnionHopData *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_set_payment_secret")] public static extern void FinalOnionHopData_set_payment_secret(long _this_ptr, long _val);
+       // uint64_t FinalOnionHopData_get_total_msat(const struct LDKFinalOnionHopData *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_get_total_msat")] public static extern long FinalOnionHopData_get_total_msat(long _this_ptr);
+       // void FinalOnionHopData_set_total_msat(struct LDKFinalOnionHopData *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_set_total_msat")] public static extern void FinalOnionHopData_set_total_msat(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKFinalOnionHopData FinalOnionHopData_new(struct LDKThirtyTwoBytes payment_secret_arg, uint64_t total_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_new")] public static extern long FinalOnionHopData_new(long _payment_secret_arg, long _total_msat_arg);
+       // uint64_t FinalOnionHopData_clone_ptr(LDKFinalOnionHopData *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_clone_ptr")] public static extern long FinalOnionHopData_clone_ptr(long _arg);
+       // struct LDKFinalOnionHopData FinalOnionHopData_clone(const struct LDKFinalOnionHopData *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_clone")] public static extern long FinalOnionHopData_clone(long _orig);
+       // void OnionPacket_free(struct LDKOnionPacket this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_free")] public static extern void OnionPacket_free(long _this_obj);
+       // uint8_t OnionPacket_get_version(const struct LDKOnionPacket *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_get_version")] public static extern byte OnionPacket_get_version(long _this_ptr);
+       // void OnionPacket_set_version(struct LDKOnionPacket *NONNULL_PTR this_ptr, uint8_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_set_version")] public static extern void OnionPacket_set_version(long _this_ptr, byte _val);
+       // struct LDKCResult_PublicKeySecp256k1ErrorZ OnionPacket_get_public_key(const struct LDKOnionPacket *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_get_public_key")] public static extern long OnionPacket_get_public_key(long _this_ptr);
+       // void OnionPacket_set_public_key(struct LDKOnionPacket *NONNULL_PTR this_ptr, struct LDKCResult_PublicKeySecp256k1ErrorZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_set_public_key")] public static extern void OnionPacket_set_public_key(long _this_ptr, long _val);
+       // const uint8_t (*OnionPacket_get_hmac(const struct LDKOnionPacket *NONNULL_PTR this_ptr))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_get_hmac")] public static extern long OnionPacket_get_hmac(long _this_ptr);
+       // void OnionPacket_set_hmac(struct LDKOnionPacket *NONNULL_PTR this_ptr, struct LDKThirtyTwoBytes val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_set_hmac")] public static extern void OnionPacket_set_hmac(long _this_ptr, long _val);
+       // uint64_t OnionPacket_clone_ptr(LDKOnionPacket *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_clone_ptr")] public static extern long OnionPacket_clone_ptr(long _arg);
+       // struct LDKOnionPacket OnionPacket_clone(const struct LDKOnionPacket *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_clone")] public static extern long OnionPacket_clone(long _orig);
+       // uint64_t OnionPacket_hash(const struct LDKOnionPacket *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_hash")] public static extern long OnionPacket_hash(long _o);
+       // bool OnionPacket_eq(const struct LDKOnionPacket *NONNULL_PTR a, const struct LDKOnionPacket *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_eq")] public static extern bool OnionPacket_eq(long _a, long _b);
        // struct LDKCVec_u8Z AcceptChannel_write(const struct LDKAcceptChannel *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannel_write")] public static extern long AcceptChannel_write(long _obj);
        // struct LDKCResult_AcceptChannelDecodeErrorZ AcceptChannel_read(struct LDKu8slice ser);
@@ -8168,6 +9040,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_write")] public static extern long AcceptChannelV2_write(long _obj);
        // struct LDKCResult_AcceptChannelV2DecodeErrorZ AcceptChannelV2_read(struct LDKu8slice ser);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_AcceptChannelV2_read")] public static extern long AcceptChannelV2_read(long _ser);
+       // struct LDKCVec_u8Z Stfu_write(const struct LDKStfu *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_write")] public static extern long Stfu_write(long _obj);
+       // struct LDKCResult_StfuDecodeErrorZ Stfu_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Stfu_read")] public static extern long Stfu_read(long _ser);
+       // struct LDKCVec_u8Z Splice_write(const struct LDKSplice *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_write")] public static extern long Splice_write(long _obj);
+       // struct LDKCResult_SpliceDecodeErrorZ Splice_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Splice_read")] public static extern long Splice_read(long _ser);
+       // struct LDKCVec_u8Z SpliceAck_write(const struct LDKSpliceAck *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_write")] public static extern long SpliceAck_write(long _obj);
+       // struct LDKCResult_SpliceAckDecodeErrorZ SpliceAck_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceAck_read")] public static extern long SpliceAck_read(long _ser);
+       // struct LDKCVec_u8Z SpliceLocked_write(const struct LDKSpliceLocked *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_write")] public static extern long SpliceLocked_write(long _obj);
+       // struct LDKCResult_SpliceLockedDecodeErrorZ SpliceLocked_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpliceLocked_read")] public static extern long SpliceLocked_read(long _ser);
        // struct LDKCVec_u8Z TxAddInput_write(const struct LDKTxAddInput *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxAddInput_write")] public static extern long TxAddInput_write(long _obj);
        // struct LDKCResult_TxAddInputDecodeErrorZ TxAddInput_read(struct LDKu8slice ser);
@@ -8272,6 +9160,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_write")] public static extern long UpdateFulfillHTLC_write(long _obj);
        // struct LDKCResult_UpdateFulfillHTLCDecodeErrorZ UpdateFulfillHTLC_read(struct LDKu8slice ser);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateFulfillHTLC_read")] public static extern long UpdateFulfillHTLC_read(long _ser);
+       // struct LDKCVec_u8Z OnionPacket_write(const struct LDKOnionPacket *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_write")] public static extern long OnionPacket_write(long _obj);
+       // struct LDKCResult_OnionPacketDecodeErrorZ OnionPacket_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionPacket_read")] public static extern long OnionPacket_read(long _ser);
        // struct LDKCVec_u8Z UpdateAddHTLC_write(const struct LDKUpdateAddHTLC *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_UpdateAddHTLC_write")] public static extern long UpdateAddHTLC_write(long _obj);
        // struct LDKCResult_UpdateAddHTLCDecodeErrorZ UpdateAddHTLC_read(struct LDKu8slice ser);
@@ -8280,6 +9172,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_read")] public static extern long OnionMessage_read(long _ser);
        // struct LDKCVec_u8Z OnionMessage_write(const struct LDKOnionMessage *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessage_write")] public static extern long OnionMessage_write(long _obj);
+       // struct LDKCVec_u8Z FinalOnionHopData_write(const struct LDKFinalOnionHopData *NONNULL_PTR obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_write")] public static extern long FinalOnionHopData_write(long _obj);
+       // struct LDKCResult_FinalOnionHopDataDecodeErrorZ FinalOnionHopData_read(struct LDKu8slice ser);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FinalOnionHopData_read")] public static extern long FinalOnionHopData_read(long _ser);
        // struct LDKCVec_u8Z Ping_write(const struct LDKPing *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Ping_write")] public static extern long Ping_write(long _obj);
        // struct LDKCResult_PingDecodeErrorZ Ping_read(struct LDKu8slice ser);
@@ -8348,6 +9244,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_IgnoringMessageHandler_free")] public static extern void IgnoringMessageHandler_free(long _this_obj);
        // MUST_USE_RES struct LDKIgnoringMessageHandler IgnoringMessageHandler_new(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_IgnoringMessageHandler_new")] public static extern long IgnoringMessageHandler_new();
+       // struct LDKEventsProvider IgnoringMessageHandler_as_EventsProvider(const struct LDKIgnoringMessageHandler *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_IgnoringMessageHandler_as_EventsProvider")] public static extern long IgnoringMessageHandler_as_EventsProvider(long _this_arg);
        // struct LDKMessageSendEventsProvider IgnoringMessageHandler_as_MessageSendEventsProvider(const struct LDKIgnoringMessageHandler *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_IgnoringMessageHandler_as_MessageSendEventsProvider")] public static extern long IgnoringMessageHandler_as_MessageSendEventsProvider(long _this_arg);
        // struct LDKRoutingMessageHandler IgnoringMessageHandler_as_RoutingMessageHandler(const struct LDKIgnoringMessageHandler *NONNULL_PTR this_arg);
@@ -8474,35 +9372,31 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CounterpartyCommitmentSecrets_read")] public static extern long CounterpartyCommitmentSecrets_read(long _ser);
        // struct LDKSecretKey derive_private_key(struct LDKPublicKey per_commitment_point, const uint8_t (*base_secret)[32]);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_derive_private_key")] public static extern long derive_private_key(long _per_commitment_point, long _base_secret);
-       // struct LDKPublicKey derive_public_key(struct LDKPublicKey per_commitment_point, struct LDKPublicKey base_point);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_derive_public_key")] public static extern long derive_public_key(long _per_commitment_point, long _base_point);
        // struct LDKSecretKey derive_private_revocation_key(const uint8_t (*per_commitment_secret)[32], const uint8_t (*countersignatory_revocation_base_secret)[32]);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_derive_private_revocation_key")] public static extern long derive_private_revocation_key(long _per_commitment_secret, long _countersignatory_revocation_base_secret);
-       // struct LDKPublicKey derive_public_revocation_key(struct LDKPublicKey per_commitment_point, struct LDKPublicKey countersignatory_revocation_base_point);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_derive_public_revocation_key")] public static extern long derive_public_revocation_key(long _per_commitment_point, long _countersignatory_revocation_base_point);
        // void TxCreationKeys_free(struct LDKTxCreationKeys this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_free")] public static extern void TxCreationKeys_free(long _this_obj);
        // struct LDKPublicKey TxCreationKeys_get_per_commitment_point(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_per_commitment_point")] public static extern long TxCreationKeys_get_per_commitment_point(long _this_ptr);
        // void TxCreationKeys_set_per_commitment_point(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_per_commitment_point")] public static extern void TxCreationKeys_set_per_commitment_point(long _this_ptr, long _val);
-       // struct LDKPublicKey TxCreationKeys_get_revocation_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
+       // struct LDKRevocationKey TxCreationKeys_get_revocation_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_revocation_key")] public static extern long TxCreationKeys_get_revocation_key(long _this_ptr);
-       // void TxCreationKeys_set_revocation_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void TxCreationKeys_set_revocation_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKRevocationKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_revocation_key")] public static extern void TxCreationKeys_set_revocation_key(long _this_ptr, long _val);
-       // struct LDKPublicKey TxCreationKeys_get_broadcaster_htlc_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
+       // struct LDKHtlcKey TxCreationKeys_get_broadcaster_htlc_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_broadcaster_htlc_key")] public static extern long TxCreationKeys_get_broadcaster_htlc_key(long _this_ptr);
-       // void TxCreationKeys_set_broadcaster_htlc_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void TxCreationKeys_set_broadcaster_htlc_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKHtlcKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_broadcaster_htlc_key")] public static extern void TxCreationKeys_set_broadcaster_htlc_key(long _this_ptr, long _val);
-       // struct LDKPublicKey TxCreationKeys_get_countersignatory_htlc_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
+       // struct LDKHtlcKey TxCreationKeys_get_countersignatory_htlc_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_countersignatory_htlc_key")] public static extern long TxCreationKeys_get_countersignatory_htlc_key(long _this_ptr);
-       // void TxCreationKeys_set_countersignatory_htlc_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void TxCreationKeys_set_countersignatory_htlc_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKHtlcKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_countersignatory_htlc_key")] public static extern void TxCreationKeys_set_countersignatory_htlc_key(long _this_ptr, long _val);
-       // struct LDKPublicKey TxCreationKeys_get_broadcaster_delayed_payment_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
+       // struct LDKDelayedPaymentKey TxCreationKeys_get_broadcaster_delayed_payment_key(const struct LDKTxCreationKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_get_broadcaster_delayed_payment_key")] public static extern long TxCreationKeys_get_broadcaster_delayed_payment_key(long _this_ptr);
-       // void TxCreationKeys_set_broadcaster_delayed_payment_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void TxCreationKeys_set_broadcaster_delayed_payment_key(struct LDKTxCreationKeys *NONNULL_PTR this_ptr, struct LDKDelayedPaymentKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_set_broadcaster_delayed_payment_key")] public static extern void TxCreationKeys_set_broadcaster_delayed_payment_key(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKTxCreationKeys TxCreationKeys_new(struct LDKPublicKey per_commitment_point_arg, struct LDKPublicKey revocation_key_arg, struct LDKPublicKey broadcaster_htlc_key_arg, struct LDKPublicKey countersignatory_htlc_key_arg, struct LDKPublicKey broadcaster_delayed_payment_key_arg);
+       // MUST_USE_RES struct LDKTxCreationKeys TxCreationKeys_new(struct LDKPublicKey per_commitment_point_arg, struct LDKRevocationKey revocation_key_arg, struct LDKHtlcKey broadcaster_htlc_key_arg, struct LDKHtlcKey countersignatory_htlc_key_arg, struct LDKDelayedPaymentKey broadcaster_delayed_payment_key_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_new")] public static extern long TxCreationKeys_new(long _per_commitment_point_arg, long _revocation_key_arg, long _broadcaster_htlc_key_arg, long _countersignatory_htlc_key_arg, long _broadcaster_delayed_payment_key_arg);
        // bool TxCreationKeys_eq(const struct LDKTxCreationKeys *NONNULL_PTR a, const struct LDKTxCreationKeys *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_eq")] public static extern bool TxCreationKeys_eq(long _a, long _b);
@@ -8520,23 +9414,23 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_funding_pubkey")] public static extern long ChannelPublicKeys_get_funding_pubkey(long _this_ptr);
        // void ChannelPublicKeys_set_funding_pubkey(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_funding_pubkey")] public static extern void ChannelPublicKeys_set_funding_pubkey(long _this_ptr, long _val);
-       // struct LDKPublicKey ChannelPublicKeys_get_revocation_basepoint(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
+       // struct LDKRevocationBasepoint ChannelPublicKeys_get_revocation_basepoint(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_revocation_basepoint")] public static extern long ChannelPublicKeys_get_revocation_basepoint(long _this_ptr);
-       // void ChannelPublicKeys_set_revocation_basepoint(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void ChannelPublicKeys_set_revocation_basepoint(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKRevocationBasepoint val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_revocation_basepoint")] public static extern void ChannelPublicKeys_set_revocation_basepoint(long _this_ptr, long _val);
        // struct LDKPublicKey ChannelPublicKeys_get_payment_point(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_payment_point")] public static extern long ChannelPublicKeys_get_payment_point(long _this_ptr);
        // void ChannelPublicKeys_set_payment_point(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_payment_point")] public static extern void ChannelPublicKeys_set_payment_point(long _this_ptr, long _val);
-       // struct LDKPublicKey ChannelPublicKeys_get_delayed_payment_basepoint(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
+       // struct LDKDelayedPaymentBasepoint ChannelPublicKeys_get_delayed_payment_basepoint(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_delayed_payment_basepoint")] public static extern long ChannelPublicKeys_get_delayed_payment_basepoint(long _this_ptr);
-       // void ChannelPublicKeys_set_delayed_payment_basepoint(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void ChannelPublicKeys_set_delayed_payment_basepoint(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKDelayedPaymentBasepoint val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_delayed_payment_basepoint")] public static extern void ChannelPublicKeys_set_delayed_payment_basepoint(long _this_ptr, long _val);
-       // struct LDKPublicKey ChannelPublicKeys_get_htlc_basepoint(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
+       // struct LDKHtlcBasepoint ChannelPublicKeys_get_htlc_basepoint(const struct LDKChannelPublicKeys *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_get_htlc_basepoint")] public static extern long ChannelPublicKeys_get_htlc_basepoint(long _this_ptr);
-       // void ChannelPublicKeys_set_htlc_basepoint(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void ChannelPublicKeys_set_htlc_basepoint(struct LDKChannelPublicKeys *NONNULL_PTR this_ptr, struct LDKHtlcBasepoint val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_set_htlc_basepoint")] public static extern void ChannelPublicKeys_set_htlc_basepoint(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKChannelPublicKeys ChannelPublicKeys_new(struct LDKPublicKey funding_pubkey_arg, struct LDKPublicKey revocation_basepoint_arg, struct LDKPublicKey payment_point_arg, struct LDKPublicKey delayed_payment_basepoint_arg, struct LDKPublicKey htlc_basepoint_arg);
+       // MUST_USE_RES struct LDKChannelPublicKeys ChannelPublicKeys_new(struct LDKPublicKey funding_pubkey_arg, struct LDKRevocationBasepoint revocation_basepoint_arg, struct LDKPublicKey payment_point_arg, struct LDKDelayedPaymentBasepoint delayed_payment_basepoint_arg, struct LDKHtlcBasepoint htlc_basepoint_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_new")] public static extern long ChannelPublicKeys_new(long _funding_pubkey_arg, long _revocation_basepoint_arg, long _payment_point_arg, long _delayed_payment_basepoint_arg, long _htlc_basepoint_arg);
        // uint64_t ChannelPublicKeys_clone_ptr(LDKChannelPublicKeys *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_clone_ptr")] public static extern long ChannelPublicKeys_clone_ptr(long _arg);
@@ -8550,11 +9444,11 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_write")] public static extern long ChannelPublicKeys_write(long _obj);
        // struct LDKCResult_ChannelPublicKeysDecodeErrorZ ChannelPublicKeys_read(struct LDKu8slice ser);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelPublicKeys_read")] public static extern long ChannelPublicKeys_read(long _ser);
-       // MUST_USE_RES struct LDKTxCreationKeys TxCreationKeys_derive_new(struct LDKPublicKey per_commitment_point, struct LDKPublicKey broadcaster_delayed_payment_base, struct LDKPublicKey broadcaster_htlc_base, struct LDKPublicKey countersignatory_revocation_base, struct LDKPublicKey countersignatory_htlc_base);
+       // MUST_USE_RES struct LDKTxCreationKeys TxCreationKeys_derive_new(struct LDKPublicKey per_commitment_point, const struct LDKDelayedPaymentBasepoint *NONNULL_PTR broadcaster_delayed_payment_base, const struct LDKHtlcBasepoint *NONNULL_PTR broadcaster_htlc_base, const struct LDKRevocationBasepoint *NONNULL_PTR countersignatory_revocation_base, const struct LDKHtlcBasepoint *NONNULL_PTR countersignatory_htlc_base);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_derive_new")] public static extern long TxCreationKeys_derive_new(long _per_commitment_point, long _broadcaster_delayed_payment_base, long _broadcaster_htlc_base, long _countersignatory_revocation_base, long _countersignatory_htlc_base);
        // MUST_USE_RES struct LDKTxCreationKeys TxCreationKeys_from_channel_static_keys(struct LDKPublicKey per_commitment_point, const struct LDKChannelPublicKeys *NONNULL_PTR broadcaster_keys, const struct LDKChannelPublicKeys *NONNULL_PTR countersignatory_keys);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TxCreationKeys_from_channel_static_keys")] public static extern long TxCreationKeys_from_channel_static_keys(long _per_commitment_point, long _broadcaster_keys, long _countersignatory_keys);
-       // struct LDKCVec_u8Z get_revokeable_redeemscript(struct LDKPublicKey revocation_key, uint16_t contest_delay, struct LDKPublicKey broadcaster_delayed_payment_key);
+       // struct LDKCVec_u8Z get_revokeable_redeemscript(const struct LDKRevocationKey *NONNULL_PTR revocation_key, uint16_t contest_delay, const struct LDKDelayedPaymentKey *NONNULL_PTR broadcaster_delayed_payment_key);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_revokeable_redeemscript")] public static extern long get_revokeable_redeemscript(long _revocation_key, short _contest_delay, long _broadcaster_delayed_payment_key);
        // struct LDKCVec_u8Z get_counterparty_payment_script(const struct LDKChannelTypeFeatures *NONNULL_PTR channel_type_features, struct LDKPublicKey payment_key);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_counterparty_payment_script")] public static extern long get_counterparty_payment_script(long _channel_type_features, long _payment_key);
@@ -8596,7 +9490,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_get_htlc_redeemscript")] public static extern long get_htlc_redeemscript(long _htlc, long _channel_type_features, long _keys);
        // struct LDKCVec_u8Z make_funding_redeemscript(struct LDKPublicKey broadcaster, struct LDKPublicKey countersignatory);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_make_funding_redeemscript")] public static extern long make_funding_redeemscript(long _broadcaster, long _countersignatory);
-       // struct LDKTransaction build_htlc_transaction(const uint8_t (*commitment_txid)[32], uint32_t feerate_per_kw, uint16_t contest_delay, const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc, const struct LDKChannelTypeFeatures *NONNULL_PTR channel_type_features, struct LDKPublicKey broadcaster_delayed_payment_key, struct LDKPublicKey revocation_key);
+       // struct LDKTransaction build_htlc_transaction(const uint8_t (*commitment_txid)[32], uint32_t feerate_per_kw, uint16_t contest_delay, const struct LDKHTLCOutputInCommitment *NONNULL_PTR htlc, const struct LDKChannelTypeFeatures *NONNULL_PTR channel_type_features, const struct LDKDelayedPaymentKey *NONNULL_PTR broadcaster_delayed_payment_key, const struct LDKRevocationKey *NONNULL_PTR revocation_key);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_htlc_transaction")] public static extern long build_htlc_transaction(long _commitment_txid, int _feerate_per_kw, short _contest_delay, long _htlc, long _channel_type_features, long _broadcaster_delayed_payment_key, long _revocation_key);
        // struct LDKWitness build_htlc_input_witness(struct LDKECDSASignature local_sig, struct LDKECDSASignature remote_sig, struct LDKCOption_ThirtyTwoBytesZ preimage, struct LDKu8slice redeem_script, const struct LDKChannelTypeFeatures *NONNULL_PTR channel_type_features);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_build_htlc_input_witness")] public static extern long build_htlc_input_witness(long _local_sig, long _remote_sig, long _preimage, long _redeem_script, long _channel_type_features);
@@ -8864,6 +9758,24 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_clone_ptr")] public static extern long ChannelTypeFeatures_clone_ptr(long _arg);
        // struct LDKChannelTypeFeatures ChannelTypeFeatures_clone(const struct LDKChannelTypeFeatures *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_clone")] public static extern long ChannelTypeFeatures_clone(long _orig);
+       // uint64_t InitFeatures_hash(const struct LDKInitFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_hash")] public static extern long InitFeatures_hash(long _o);
+       // uint64_t NodeFeatures_hash(const struct LDKNodeFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_hash")] public static extern long NodeFeatures_hash(long _o);
+       // uint64_t ChannelFeatures_hash(const struct LDKChannelFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelFeatures_hash")] public static extern long ChannelFeatures_hash(long _o);
+       // uint64_t Bolt11InvoiceFeatures_hash(const struct LDKBolt11InvoiceFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11InvoiceFeatures_hash")] public static extern long Bolt11InvoiceFeatures_hash(long _o);
+       // uint64_t OfferFeatures_hash(const struct LDKOfferFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OfferFeatures_hash")] public static extern long OfferFeatures_hash(long _o);
+       // uint64_t InvoiceRequestFeatures_hash(const struct LDKInvoiceRequestFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequestFeatures_hash")] public static extern long InvoiceRequestFeatures_hash(long _o);
+       // uint64_t Bolt12InvoiceFeatures_hash(const struct LDKBolt12InvoiceFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12InvoiceFeatures_hash")] public static extern long Bolt12InvoiceFeatures_hash(long _o);
+       // uint64_t BlindedHopFeatures_hash(const struct LDKBlindedHopFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedHopFeatures_hash")] public static extern long BlindedHopFeatures_hash(long _o);
+       // uint64_t ChannelTypeFeatures_hash(const struct LDKChannelTypeFeatures *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_hash")] public static extern long ChannelTypeFeatures_hash(long _o);
        // void InitFeatures_free(struct LDKInitFeatures this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_free")] public static extern void InitFeatures_free(long _this_obj);
        // void NodeFeatures_free(struct LDKNodeFeatures this_obj);
@@ -9258,6 +10170,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_requires_anchors_zero_fee_htlc_tx")] public static extern bool NodeFeatures_requires_anchors_zero_fee_htlc_tx(long _this_arg);
        // MUST_USE_RES bool ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(const struct LDKChannelTypeFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx")] public static extern bool ChannelTypeFeatures_requires_anchors_zero_fee_htlc_tx(long _this_arg);
+       // void InitFeatures_set_route_blinding_optional(struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_route_blinding_optional")] public static extern void InitFeatures_set_route_blinding_optional(long _this_arg);
+       // void InitFeatures_set_route_blinding_required(struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_route_blinding_required")] public static extern void InitFeatures_set_route_blinding_required(long _this_arg);
+       // MUST_USE_RES bool InitFeatures_supports_route_blinding(const struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_supports_route_blinding")] public static extern bool InitFeatures_supports_route_blinding(long _this_arg);
+       // void NodeFeatures_set_route_blinding_optional(struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_set_route_blinding_optional")] public static extern void NodeFeatures_set_route_blinding_optional(long _this_arg);
+       // void NodeFeatures_set_route_blinding_required(struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_set_route_blinding_required")] public static extern void NodeFeatures_set_route_blinding_required(long _this_arg);
+       // MUST_USE_RES bool NodeFeatures_supports_route_blinding(const struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_supports_route_blinding")] public static extern bool NodeFeatures_supports_route_blinding(long _this_arg);
+       // MUST_USE_RES bool InitFeatures_requires_route_blinding(const struct LDKInitFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_requires_route_blinding")] public static extern bool InitFeatures_requires_route_blinding(long _this_arg);
+       // MUST_USE_RES bool NodeFeatures_requires_route_blinding(const struct LDKNodeFeatures *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeFeatures_requires_route_blinding")] public static extern bool NodeFeatures_requires_route_blinding(long _this_arg);
        // void InitFeatures_set_shutdown_any_segwit_optional(struct LDKInitFeatures *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InitFeatures_set_shutdown_any_segwit_optional")] public static extern void InitFeatures_set_shutdown_any_segwit_optional(long _this_arg);
        // void InitFeatures_set_shutdown_any_segwit_required(struct LDKInitFeatures *NONNULL_PTR this_arg);
@@ -9404,7 +10332,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_eq")] public static extern bool ShutdownScript_eq(long _a, long _b);
        // void InvalidShutdownScript_free(struct LDKInvalidShutdownScript this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_free")] public static extern void InvalidShutdownScript_free(long _this_obj);
-       // struct LDKu8slice InvalidShutdownScript_get_script(const struct LDKInvalidShutdownScript *NONNULL_PTR this_ptr);
+       // struct LDKCVec_u8Z InvalidShutdownScript_get_script(const struct LDKInvalidShutdownScript *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_get_script")] public static extern long InvalidShutdownScript_get_script(long _this_ptr);
        // void InvalidShutdownScript_set_script(struct LDKInvalidShutdownScript *NONNULL_PTR this_ptr, struct LDKCVec_u8Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvalidShutdownScript_set_script")] public static extern void InvalidShutdownScript_set_script(long _this_ptr, long _val);
@@ -9422,8 +10350,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_new_p2wpkh")] public static extern long ShutdownScript_new_p2wpkh(long _pubkey_hash);
        // MUST_USE_RES struct LDKShutdownScript ShutdownScript_new_p2wsh(const uint8_t (*script_hash)[32]);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_new_p2wsh")] public static extern long ShutdownScript_new_p2wsh(long _script_hash);
-       // MUST_USE_RES struct LDKCResult_ShutdownScriptInvalidShutdownScriptZ ShutdownScript_new_witness_program(struct LDKWitnessVersion version, struct LDKu8slice program);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_new_witness_program")] public static extern long ShutdownScript_new_witness_program(byte _version, long _program);
+       // MUST_USE_RES struct LDKCResult_ShutdownScriptInvalidShutdownScriptZ ShutdownScript_new_witness_program(struct LDKWitnessProgram witness_program);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_new_witness_program")] public static extern long ShutdownScript_new_witness_program(long _witness_program);
        // MUST_USE_RES struct LDKCVec_u8Z ShutdownScript_into_inner(struct LDKShutdownScript this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ShutdownScript_into_inner")] public static extern long ShutdownScript_into_inner(long _this_arg);
        // MUST_USE_RES struct LDKPublicKey ShutdownScript_as_legacy_pubkey(const struct LDKShutdownScript *NONNULL_PTR this_arg);
@@ -9554,6 +10482,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_supports_chain")] public static extern bool Offer_supports_chain(long _this_arg, long _chain);
        // MUST_USE_RES bool Offer_is_expired(const struct LDKOffer *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_is_expired")] public static extern bool Offer_is_expired(long _this_arg);
+       // MUST_USE_RES bool Offer_is_expired_no_std(const struct LDKOffer *NONNULL_PTR this_arg, uint64_t duration_since_epoch);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_is_expired_no_std")] public static extern bool Offer_is_expired_no_std(long _this_arg, long _duration_since_epoch);
        // MUST_USE_RES bool Offer_is_valid_quantity(const struct LDKOffer *NONNULL_PTR this_arg, uint64_t quantity);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Offer_is_valid_quantity")] public static extern bool Offer_is_valid_quantity(long _this_arg, long _quantity);
        // MUST_USE_RES bool Offer_expects_quantity(const struct LDKOffer *NONNULL_PTR this_arg);
@@ -9892,6 +10822,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InvoiceRequest_write")] public static extern long InvoiceRequest_write(long _obj);
        // void TaggedHash_free(struct LDKTaggedHash this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TaggedHash_free")] public static extern void TaggedHash_free(long _this_obj);
+       // uint64_t TaggedHash_clone_ptr(LDKTaggedHash *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TaggedHash_clone_ptr")] public static extern long TaggedHash_clone_ptr(long _arg);
+       // struct LDKTaggedHash TaggedHash_clone(const struct LDKTaggedHash *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TaggedHash_clone")] public static extern long TaggedHash_clone(long _orig);
+       // MUST_USE_RES const uint8_t (*TaggedHash_as_digest(const struct LDKTaggedHash *NONNULL_PTR this_arg))[32];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TaggedHash_as_digest")] public static extern long TaggedHash_as_digest(long _this_arg);
+       // MUST_USE_RES struct LDKStr TaggedHash_tag(const struct LDKTaggedHash *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TaggedHash_tag")] public static extern long TaggedHash_tag(long _this_arg);
+       // MUST_USE_RES struct LDKThirtyTwoBytes TaggedHash_merkle_root(const struct LDKTaggedHash *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_TaggedHash_merkle_root")] public static extern long TaggedHash_merkle_root(long _this_arg);
        // void Bolt12ParseError_free(struct LDKBolt12ParseError this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt12ParseError_free")] public static extern void Bolt12ParseError_free(long _this_obj);
        // uint64_t Bolt12ParseError_clone_ptr(LDKBolt12ParseError *NONNULL_PTR arg);
@@ -9966,6 +10906,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_absolute_expiry")] public static extern long Refund_absolute_expiry(long _this_arg);
        // MUST_USE_RES bool Refund_is_expired(const struct LDKRefund *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_is_expired")] public static extern bool Refund_is_expired(long _this_arg);
+       // MUST_USE_RES bool Refund_is_expired_no_std(const struct LDKRefund *NONNULL_PTR this_arg, uint64_t duration_since_epoch);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_is_expired_no_std")] public static extern bool Refund_is_expired_no_std(long _this_arg, long _duration_since_epoch);
        // MUST_USE_RES struct LDKPrintableString Refund_issuer(const struct LDKRefund *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Refund_issuer")] public static extern long Refund_issuer(long _this_arg);
        // MUST_USE_RES struct LDKCVec_BlindedPathZ Refund_paths(const struct LDKRefund *NONNULL_PTR this_arg);
@@ -10028,6 +10970,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_from_pubkey")] public static extern long NodeId_from_pubkey(long _pubkey);
        // MUST_USE_RES struct LDKu8slice NodeId_as_slice(const struct LDKNodeId *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_as_slice")] public static extern long NodeId_as_slice(long _this_arg);
+       // MUST_USE_RES const uint8_t (*NodeId_as_array(const struct LDKNodeId *NONNULL_PTR this_arg))[33];
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_as_array")] public static extern long NodeId_as_array(long _this_arg);
        // MUST_USE_RES struct LDKCResult_PublicKeySecp256k1ErrorZ NodeId_as_pubkey(const struct LDKNodeId *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeId_as_pubkey")] public static extern long NodeId_as_pubkey(long _this_arg);
        // uint64_t NodeId_hash(const struct LDKNodeId *NONNULL_PTR o);
@@ -10168,8 +11112,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DirectedChannelInfo_clone")] public static extern long DirectedChannelInfo_clone(long _orig);
        // MUST_USE_RES struct LDKChannelInfo DirectedChannelInfo_channel(const struct LDKDirectedChannelInfo *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DirectedChannelInfo_channel")] public static extern long DirectedChannelInfo_channel(long _this_arg);
-       // MUST_USE_RES uint64_t DirectedChannelInfo_htlc_maximum_msat(const struct LDKDirectedChannelInfo *NONNULL_PTR this_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DirectedChannelInfo_htlc_maximum_msat")] public static extern long DirectedChannelInfo_htlc_maximum_msat(long _this_arg);
        // MUST_USE_RES struct LDKEffectiveCapacity DirectedChannelInfo_effective_capacity(const struct LDKDirectedChannelInfo *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DirectedChannelInfo_effective_capacity")] public static extern long DirectedChannelInfo_effective_capacity(long _this_arg);
        // void EffectiveCapacity_free(struct LDKEffectiveCapacity this_ptr);
@@ -10264,6 +11206,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_clone_ptr")] public static extern long NodeAlias_clone_ptr(long _arg);
        // struct LDKNodeAlias NodeAlias_clone(const struct LDKNodeAlias *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_clone")] public static extern long NodeAlias_clone(long _orig);
+       // uint64_t NodeAlias_hash(const struct LDKNodeAlias *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_hash")] public static extern long NodeAlias_hash(long _o);
        // bool NodeAlias_eq(const struct LDKNodeAlias *NONNULL_PTR a, const struct LDKNodeAlias *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_NodeAlias_eq")] public static extern bool NodeAlias_eq(long _a, long _b);
        // struct LDKCVec_u8Z NodeAlias_write(const struct LDKNodeAlias *NONNULL_PTR obj);
@@ -10342,10 +11286,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReadOnlyNetworkGraph_get_addresses")] public static extern long ReadOnlyNetworkGraph_get_addresses(long _this_arg, long _pubkey);
        // void DefaultRouter_free(struct LDKDefaultRouter this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultRouter_free")] public static extern void DefaultRouter_free(long _this_obj);
-       // MUST_USE_RES struct LDKDefaultRouter DefaultRouter_new(const struct LDKNetworkGraph *NONNULL_PTR network_graph, struct LDKLogger logger, struct LDKThirtyTwoBytes random_seed_bytes, struct LDKLockableScore scorer, struct LDKProbabilisticScoringFeeParameters score_params);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultRouter_new")] public static extern long DefaultRouter_new(long _network_graph, long _logger, long _random_seed_bytes, long _scorer, long _score_params);
+       // MUST_USE_RES struct LDKDefaultRouter DefaultRouter_new(const struct LDKNetworkGraph *NONNULL_PTR network_graph, struct LDKLogger logger, struct LDKEntropySource entropy_source, struct LDKLockableScore scorer, struct LDKProbabilisticScoringFeeParameters score_params);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultRouter_new")] public static extern long DefaultRouter_new(long _network_graph, long _logger, long _entropy_source, long _scorer, long _score_params);
        // struct LDKRouter DefaultRouter_as_Router(const struct LDKDefaultRouter *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultRouter_as_Router")] public static extern long DefaultRouter_as_Router(long _this_arg);
+       // struct LDKMessageRouter DefaultRouter_as_MessageRouter(const struct LDKDefaultRouter *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultRouter_as_MessageRouter")] public static extern long DefaultRouter_as_MessageRouter(long _this_arg);
        // void Router_free(struct LDKRouter this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Router_free")] public static extern void Router_free(long _this_ptr);
        // void ScorerAccountingForInFlightHtlcs_free(struct LDKScorerAccountingForInFlightHtlcs this_obj);
@@ -10558,8 +11504,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_get_previously_failed_channels")] public static extern long PaymentParameters_get_previously_failed_channels(long _this_ptr);
        // void PaymentParameters_set_previously_failed_channels(struct LDKPaymentParameters *NONNULL_PTR this_ptr, struct LDKCVec_u64Z val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_set_previously_failed_channels")] public static extern void PaymentParameters_set_previously_failed_channels(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKPaymentParameters PaymentParameters_new(struct LDKPayee payee_arg, struct LDKCOption_u64Z expiry_time_arg, uint32_t max_total_cltv_expiry_delta_arg, uint8_t max_path_count_arg, uint8_t max_channel_saturation_power_of_half_arg, struct LDKCVec_u64Z previously_failed_channels_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_new")] public static extern long PaymentParameters_new(long _payee_arg, long _expiry_time_arg, int _max_total_cltv_expiry_delta_arg, byte _max_path_count_arg, byte _max_channel_saturation_power_of_half_arg, long _previously_failed_channels_arg);
+       // struct LDKCVec_u64Z PaymentParameters_get_previously_failed_blinded_path_idxs(const struct LDKPaymentParameters *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_get_previously_failed_blinded_path_idxs")] public static extern long PaymentParameters_get_previously_failed_blinded_path_idxs(long _this_ptr);
+       // void PaymentParameters_set_previously_failed_blinded_path_idxs(struct LDKPaymentParameters *NONNULL_PTR this_ptr, struct LDKCVec_u64Z val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_set_previously_failed_blinded_path_idxs")] public static extern void PaymentParameters_set_previously_failed_blinded_path_idxs(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKPaymentParameters PaymentParameters_new(struct LDKPayee payee_arg, struct LDKCOption_u64Z expiry_time_arg, uint32_t max_total_cltv_expiry_delta_arg, uint8_t max_path_count_arg, uint8_t max_channel_saturation_power_of_half_arg, struct LDKCVec_u64Z previously_failed_channels_arg, struct LDKCVec_u64Z previously_failed_blinded_path_idxs_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_new")] public static extern long PaymentParameters_new(long _payee_arg, long _expiry_time_arg, int _max_total_cltv_expiry_delta_arg, byte _max_path_count_arg, byte _max_channel_saturation_power_of_half_arg, long _previously_failed_channels_arg, long _previously_failed_blinded_path_idxs_arg);
        // uint64_t PaymentParameters_clone_ptr(LDKPaymentParameters *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentParameters_clone_ptr")] public static extern long PaymentParameters_clone_ptr(long _arg);
        // struct LDKPaymentParameters PaymentParameters_clone(const struct LDKPaymentParameters *NONNULL_PTR orig);
@@ -10654,6 +11604,68 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_write")] public static extern long RouteHintHop_write(long _obj);
        // struct LDKCResult_RouteHintHopDecodeErrorZ RouteHintHop_read(struct LDKu8slice ser);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RouteHintHop_read")] public static extern long RouteHintHop_read(long _ser);
+       // void FirstHopCandidate_free(struct LDKFirstHopCandidate this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FirstHopCandidate_free")] public static extern void FirstHopCandidate_free(long _this_obj);
+       // uint64_t FirstHopCandidate_clone_ptr(LDKFirstHopCandidate *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FirstHopCandidate_clone_ptr")] public static extern long FirstHopCandidate_clone_ptr(long _arg);
+       // struct LDKFirstHopCandidate FirstHopCandidate_clone(const struct LDKFirstHopCandidate *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_FirstHopCandidate_clone")] public static extern long FirstHopCandidate_clone(long _orig);
+       // void PublicHopCandidate_free(struct LDKPublicHopCandidate this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PublicHopCandidate_free")] public static extern void PublicHopCandidate_free(long _this_obj);
+       // uint64_t PublicHopCandidate_get_short_channel_id(const struct LDKPublicHopCandidate *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PublicHopCandidate_get_short_channel_id")] public static extern long PublicHopCandidate_get_short_channel_id(long _this_ptr);
+       // void PublicHopCandidate_set_short_channel_id(struct LDKPublicHopCandidate *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PublicHopCandidate_set_short_channel_id")] public static extern void PublicHopCandidate_set_short_channel_id(long _this_ptr, long _val);
+       // uint64_t PublicHopCandidate_clone_ptr(LDKPublicHopCandidate *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PublicHopCandidate_clone_ptr")] public static extern long PublicHopCandidate_clone_ptr(long _arg);
+       // struct LDKPublicHopCandidate PublicHopCandidate_clone(const struct LDKPublicHopCandidate *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PublicHopCandidate_clone")] public static extern long PublicHopCandidate_clone(long _orig);
+       // void PrivateHopCandidate_free(struct LDKPrivateHopCandidate this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrivateHopCandidate_free")] public static extern void PrivateHopCandidate_free(long _this_obj);
+       // uint64_t PrivateHopCandidate_clone_ptr(LDKPrivateHopCandidate *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrivateHopCandidate_clone_ptr")] public static extern long PrivateHopCandidate_clone_ptr(long _arg);
+       // struct LDKPrivateHopCandidate PrivateHopCandidate_clone(const struct LDKPrivateHopCandidate *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PrivateHopCandidate_clone")] public static extern long PrivateHopCandidate_clone(long _orig);
+       // void BlindedPathCandidate_free(struct LDKBlindedPathCandidate this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPathCandidate_free")] public static extern void BlindedPathCandidate_free(long _this_obj);
+       // uint64_t BlindedPathCandidate_clone_ptr(LDKBlindedPathCandidate *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPathCandidate_clone_ptr")] public static extern long BlindedPathCandidate_clone_ptr(long _arg);
+       // struct LDKBlindedPathCandidate BlindedPathCandidate_clone(const struct LDKBlindedPathCandidate *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPathCandidate_clone")] public static extern long BlindedPathCandidate_clone(long _orig);
+       // void OneHopBlindedPathCandidate_free(struct LDKOneHopBlindedPathCandidate this_obj);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OneHopBlindedPathCandidate_free")] public static extern void OneHopBlindedPathCandidate_free(long _this_obj);
+       // uint64_t OneHopBlindedPathCandidate_clone_ptr(LDKOneHopBlindedPathCandidate *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OneHopBlindedPathCandidate_clone_ptr")] public static extern long OneHopBlindedPathCandidate_clone_ptr(long _arg);
+       // struct LDKOneHopBlindedPathCandidate OneHopBlindedPathCandidate_clone(const struct LDKOneHopBlindedPathCandidate *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OneHopBlindedPathCandidate_clone")] public static extern long OneHopBlindedPathCandidate_clone(long _orig);
+       // void CandidateRouteHop_free(struct LDKCandidateRouteHop this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_free")] public static extern void CandidateRouteHop_free(long _this_ptr);
+       // uint64_t CandidateRouteHop_clone_ptr(LDKCandidateRouteHop *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_clone_ptr")] public static extern long CandidateRouteHop_clone_ptr(long _arg);
+       // struct LDKCandidateRouteHop CandidateRouteHop_clone(const struct LDKCandidateRouteHop *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_clone")] public static extern long CandidateRouteHop_clone(long _orig);
+       // struct LDKCandidateRouteHop CandidateRouteHop_first_hop(struct LDKFirstHopCandidate a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_first_hop")] public static extern long CandidateRouteHop_first_hop(long _a);
+       // struct LDKCandidateRouteHop CandidateRouteHop_public_hop(struct LDKPublicHopCandidate a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_public_hop")] public static extern long CandidateRouteHop_public_hop(long _a);
+       // struct LDKCandidateRouteHop CandidateRouteHop_private_hop(struct LDKPrivateHopCandidate a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_private_hop")] public static extern long CandidateRouteHop_private_hop(long _a);
+       // struct LDKCandidateRouteHop CandidateRouteHop_blinded(struct LDKBlindedPathCandidate a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_blinded")] public static extern long CandidateRouteHop_blinded(long _a);
+       // struct LDKCandidateRouteHop CandidateRouteHop_one_hop_blinded(struct LDKOneHopBlindedPathCandidate a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_one_hop_blinded")] public static extern long CandidateRouteHop_one_hop_blinded(long _a);
+       // MUST_USE_RES struct LDKCOption_u64Z CandidateRouteHop_globally_unique_short_channel_id(const struct LDKCandidateRouteHop *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_globally_unique_short_channel_id")] public static extern long CandidateRouteHop_globally_unique_short_channel_id(long _this_arg);
+       // MUST_USE_RES uint32_t CandidateRouteHop_cltv_expiry_delta(const struct LDKCandidateRouteHop *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_cltv_expiry_delta")] public static extern int CandidateRouteHop_cltv_expiry_delta(long _this_arg);
+       // MUST_USE_RES uint64_t CandidateRouteHop_htlc_minimum_msat(const struct LDKCandidateRouteHop *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_htlc_minimum_msat")] public static extern long CandidateRouteHop_htlc_minimum_msat(long _this_arg);
+       // MUST_USE_RES struct LDKRoutingFees CandidateRouteHop_fees(const struct LDKCandidateRouteHop *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_fees")] public static extern long CandidateRouteHop_fees(long _this_arg);
+       // MUST_USE_RES struct LDKNodeId CandidateRouteHop_source(const struct LDKCandidateRouteHop *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_source")] public static extern long CandidateRouteHop_source(long _this_arg);
+       // MUST_USE_RES struct LDKNodeId CandidateRouteHop_target(const struct LDKCandidateRouteHop *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_CandidateRouteHop_target")] public static extern long CandidateRouteHop_target(long _this_arg);
        // struct LDKCResult_RouteLightningErrorZ find_route(struct LDKPublicKey our_node_pubkey, const struct LDKRouteParameters *NONNULL_PTR route_params, const struct LDKNetworkGraph *NONNULL_PTR network_graph, struct LDKCVec_ChannelDetailsZ *first_hops, struct LDKLogger logger, const struct LDKScoreLookUp *NONNULL_PTR scorer, const struct LDKProbabilisticScoringFeeParameters *NONNULL_PTR score_params, const uint8_t (*random_seed_bytes)[32]);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_find_route")] public static extern long find_route(long _our_node_pubkey, long _route_params, long _network_graph, long _first_hops, long _logger, long _scorer, long _score_params, long _random_seed_bytes);
        // struct LDKCResult_RouteLightningErrorZ build_route_from_hops(struct LDKPublicKey our_node_pubkey, struct LDKCVec_PublicKeyZ hops, const struct LDKRouteParameters *NONNULL_PTR route_params, const struct LDKNetworkGraph *NONNULL_PTR network_graph, struct LDKLogger logger, const uint8_t (*random_seed_bytes)[32]);
@@ -10838,9 +11850,9 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_output")] public static extern long DelayedPaymentOutputDescriptor_get_output(long _this_ptr);
        // void DelayedPaymentOutputDescriptor_set_output(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKTxOut val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_output")] public static extern void DelayedPaymentOutputDescriptor_set_output(long _this_ptr, long _val);
-       // struct LDKPublicKey DelayedPaymentOutputDescriptor_get_revocation_pubkey(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr);
+       // struct LDKRevocationKey DelayedPaymentOutputDescriptor_get_revocation_pubkey(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_revocation_pubkey")] public static extern long DelayedPaymentOutputDescriptor_get_revocation_pubkey(long _this_ptr);
-       // void DelayedPaymentOutputDescriptor_set_revocation_pubkey(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKPublicKey val);
+       // void DelayedPaymentOutputDescriptor_set_revocation_pubkey(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, struct LDKRevocationKey val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_revocation_pubkey")] public static extern void DelayedPaymentOutputDescriptor_set_revocation_pubkey(long _this_ptr, long _val);
        // const uint8_t (*DelayedPaymentOutputDescriptor_get_channel_keys_id(const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr))[32];
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_channel_keys_id")] public static extern long DelayedPaymentOutputDescriptor_get_channel_keys_id(long _this_ptr);
@@ -10850,7 +11862,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_get_channel_value_satoshis")] public static extern long DelayedPaymentOutputDescriptor_get_channel_value_satoshis(long _this_ptr);
        // void DelayedPaymentOutputDescriptor_set_channel_value_satoshis(struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_set_channel_value_satoshis")] public static extern void DelayedPaymentOutputDescriptor_set_channel_value_satoshis(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKDelayedPaymentOutputDescriptor DelayedPaymentOutputDescriptor_new(struct LDKOutPoint outpoint_arg, struct LDKPublicKey per_commitment_point_arg, uint16_t to_self_delay_arg, struct LDKTxOut output_arg, struct LDKPublicKey revocation_pubkey_arg, struct LDKThirtyTwoBytes channel_keys_id_arg, uint64_t channel_value_satoshis_arg);
+       // MUST_USE_RES struct LDKDelayedPaymentOutputDescriptor DelayedPaymentOutputDescriptor_new(struct LDKOutPoint outpoint_arg, struct LDKPublicKey per_commitment_point_arg, uint16_t to_self_delay_arg, struct LDKTxOut output_arg, struct LDKRevocationKey revocation_pubkey_arg, struct LDKThirtyTwoBytes channel_keys_id_arg, uint64_t channel_value_satoshis_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_new")] public static extern long DelayedPaymentOutputDescriptor_new(long _outpoint_arg, long _per_commitment_point_arg, short _to_self_delay_arg, long _output_arg, long _revocation_pubkey_arg, long _channel_keys_id_arg, long _channel_value_satoshis_arg);
        // uint64_t DelayedPaymentOutputDescriptor_clone_ptr(LDKDelayedPaymentOutputDescriptor *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DelayedPaymentOutputDescriptor_clone_ptr")] public static extern long DelayedPaymentOutputDescriptor_clone_ptr(long _arg);
@@ -10898,7 +11910,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_eq")] public static extern bool StaticPaymentOutputDescriptor_eq(long _a, long _b);
        // MUST_USE_RES struct LDKCOption_CVec_u8ZZ StaticPaymentOutputDescriptor_witness_script(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_witness_script")] public static extern long StaticPaymentOutputDescriptor_witness_script(long _this_arg);
-       // MUST_USE_RES uintptr_t StaticPaymentOutputDescriptor_max_witness_length(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_arg);
+       // MUST_USE_RES uint64_t StaticPaymentOutputDescriptor_max_witness_length(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_max_witness_length")] public static extern long StaticPaymentOutputDescriptor_max_witness_length(long _this_arg);
        // struct LDKCVec_u8Z StaticPaymentOutputDescriptor_write(const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_StaticPaymentOutputDescriptor_write")] public static extern long StaticPaymentOutputDescriptor_write(long _obj);
@@ -10910,8 +11922,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_clone_ptr")] public static extern long SpendableOutputDescriptor_clone_ptr(long _arg);
        // struct LDKSpendableOutputDescriptor SpendableOutputDescriptor_clone(const struct LDKSpendableOutputDescriptor *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_clone")] public static extern long SpendableOutputDescriptor_clone(long _orig);
-       // struct LDKSpendableOutputDescriptor SpendableOutputDescriptor_static_output(struct LDKOutPoint outpoint, struct LDKTxOut output);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_static_output")] public static extern long SpendableOutputDescriptor_static_output(long _outpoint, long _output);
+       // struct LDKSpendableOutputDescriptor SpendableOutputDescriptor_static_output(struct LDKOutPoint outpoint, struct LDKTxOut output, struct LDKThirtyTwoBytes channel_keys_id);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_static_output")] public static extern long SpendableOutputDescriptor_static_output(long _outpoint, long _output, long _channel_keys_id);
        // struct LDKSpendableOutputDescriptor SpendableOutputDescriptor_delayed_payment_output(struct LDKDelayedPaymentOutputDescriptor a);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_delayed_payment_output")] public static extern long SpendableOutputDescriptor_delayed_payment_output(long _a);
        // struct LDKSpendableOutputDescriptor SpendableOutputDescriptor_static_payment_output(struct LDKStaticPaymentOutputDescriptor a);
@@ -10924,7 +11936,7 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_write")] public static extern long SpendableOutputDescriptor_write(long _obj);
        // struct LDKCResult_SpendableOutputDescriptorDecodeErrorZ SpendableOutputDescriptor_read(struct LDKu8slice ser);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_read")] public static extern long SpendableOutputDescriptor_read(long _ser);
-       // MUST_USE_RES struct LDKCResult_C2Tuple_CVec_u8ZusizeZNoneZ SpendableOutputDescriptor_create_spendable_outputs_psbt(struct LDKCVec_SpendableOutputDescriptorZ descriptors, struct LDKCVec_TxOutZ outputs, struct LDKCVec_u8Z change_destination_script, uint32_t feerate_sat_per_1000_weight, struct LDKCOption_u32Z locktime);
+       // MUST_USE_RES struct LDKCResult_C2Tuple_CVec_u8Zu64ZNoneZ SpendableOutputDescriptor_create_spendable_outputs_psbt(struct LDKCVec_SpendableOutputDescriptorZ descriptors, struct LDKCVec_TxOutZ outputs, struct LDKCVec_u8Z change_destination_script, uint32_t feerate_sat_per_1000_weight, struct LDKCOption_u32Z locktime);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SpendableOutputDescriptor_create_spendable_outputs_psbt")] public static extern long SpendableOutputDescriptor_create_spendable_outputs_psbt(long _descriptors, long _outputs, long _change_destination_script, int _feerate_sat_per_1000_weight, long _locktime);
        // void ChannelDerivationParameters_free(struct LDKChannelDerivationParameters this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelDerivationParameters_free")] public static extern void ChannelDerivationParameters_free(long _this_obj);
@@ -11008,14 +12020,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_HTLCDescriptor_derive_channel_signer")] public static extern long HTLCDescriptor_derive_channel_signer(long _this_arg, long _signer_provider);
        // void ChannelSigner_free(struct LDKChannelSigner this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ChannelSigner_free")] public static extern void ChannelSigner_free(long _this_ptr);
-       // void EcdsaChannelSigner_free(struct LDKEcdsaChannelSigner this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_free")] public static extern void EcdsaChannelSigner_free(long _this_ptr);
-       // uint64_t WriteableEcdsaChannelSigner_clone_ptr(LDKWriteableEcdsaChannelSigner *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_clone_ptr")] public static extern long WriteableEcdsaChannelSigner_clone_ptr(long _arg);
-       // struct LDKWriteableEcdsaChannelSigner WriteableEcdsaChannelSigner_clone(const struct LDKWriteableEcdsaChannelSigner *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_clone")] public static extern long WriteableEcdsaChannelSigner_clone(long _orig);
-       // void WriteableEcdsaChannelSigner_free(struct LDKWriteableEcdsaChannelSigner this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_free")] public static extern void WriteableEcdsaChannelSigner_free(long _this_ptr);
        // enum LDKRecipient Recipient_clone(const enum LDKRecipient *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Recipient_clone")] public static extern Recipient Recipient_clone(long _orig);
        // enum LDKRecipient Recipient_node(void);
@@ -11074,9 +12078,9 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_get_channel_parameters")] public static extern long InMemorySigner_get_channel_parameters(long _this_arg);
        // MUST_USE_RES struct LDKChannelTypeFeatures InMemorySigner_channel_type_features(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_channel_type_features")] public static extern long InMemorySigner_channel_type_features(long _this_arg);
-       // MUST_USE_RES struct LDKCResult_CVec_CVec_u8ZZNoneZ InMemorySigner_sign_counterparty_payment_input(const struct LDKInMemorySigner *NONNULL_PTR this_arg, struct LDKTransaction spend_tx, uintptr_t input_idx, const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR descriptor);
+       // MUST_USE_RES struct LDKCResult_WitnessNoneZ InMemorySigner_sign_counterparty_payment_input(const struct LDKInMemorySigner *NONNULL_PTR this_arg, struct LDKTransaction spend_tx, uintptr_t input_idx, const struct LDKStaticPaymentOutputDescriptor *NONNULL_PTR descriptor);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_sign_counterparty_payment_input")] public static extern long InMemorySigner_sign_counterparty_payment_input(long _this_arg, long _spend_tx, long _input_idx, long _descriptor);
-       // MUST_USE_RES struct LDKCResult_CVec_CVec_u8ZZNoneZ InMemorySigner_sign_dynamic_p2wsh_input(const struct LDKInMemorySigner *NONNULL_PTR this_arg, struct LDKTransaction spend_tx, uintptr_t input_idx, const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR descriptor);
+       // MUST_USE_RES struct LDKCResult_WitnessNoneZ InMemorySigner_sign_dynamic_p2wsh_input(const struct LDKInMemorySigner *NONNULL_PTR this_arg, struct LDKTransaction spend_tx, uintptr_t input_idx, const struct LDKDelayedPaymentOutputDescriptor *NONNULL_PTR descriptor);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_sign_dynamic_p2wsh_input")] public static extern long InMemorySigner_sign_dynamic_p2wsh_input(long _this_arg, long _spend_tx, long _input_idx, long _descriptor);
        // struct LDKEntropySource InMemorySigner_as_EntropySource(const struct LDKInMemorySigner *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_InMemorySigner_as_EntropySource")] public static extern long InMemorySigner_as_EntropySource(long _this_arg);
@@ -11126,14 +12130,22 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_get_node_secret_key")] public static extern long PhantomKeysManager_get_node_secret_key(long _this_arg);
        // MUST_USE_RES struct LDKSecretKey PhantomKeysManager_get_phantom_node_secret_key(const struct LDKPhantomKeysManager *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PhantomKeysManager_get_phantom_node_secret_key")] public static extern long PhantomKeysManager_get_phantom_node_secret_key(long _this_arg);
+       // void EcdsaChannelSigner_free(struct LDKEcdsaChannelSigner this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_EcdsaChannelSigner_free")] public static extern void EcdsaChannelSigner_free(long _this_ptr);
+       // uint64_t WriteableEcdsaChannelSigner_clone_ptr(LDKWriteableEcdsaChannelSigner *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_clone_ptr")] public static extern long WriteableEcdsaChannelSigner_clone_ptr(long _arg);
+       // struct LDKWriteableEcdsaChannelSigner WriteableEcdsaChannelSigner_clone(const struct LDKWriteableEcdsaChannelSigner *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_clone")] public static extern long WriteableEcdsaChannelSigner_clone(long _orig);
+       // void WriteableEcdsaChannelSigner_free(struct LDKWriteableEcdsaChannelSigner this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_WriteableEcdsaChannelSigner_free")] public static extern void WriteableEcdsaChannelSigner_free(long _this_ptr);
        // void OnionMessenger_free(struct LDKOnionMessenger this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessenger_free")] public static extern void OnionMessenger_free(long _this_obj);
        // void MessageRouter_free(struct LDKMessageRouter this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageRouter_free")] public static extern void MessageRouter_free(long _this_ptr);
        // void DefaultMessageRouter_free(struct LDKDefaultMessageRouter this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultMessageRouter_free")] public static extern void DefaultMessageRouter_free(long _this_obj);
-       // MUST_USE_RES struct LDKDefaultMessageRouter DefaultMessageRouter_new(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultMessageRouter_new")] public static extern long DefaultMessageRouter_new();
+       // MUST_USE_RES struct LDKDefaultMessageRouter DefaultMessageRouter_new(const struct LDKNetworkGraph *NONNULL_PTR network_graph, struct LDKEntropySource entropy_source);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultMessageRouter_new")] public static extern long DefaultMessageRouter_new(long _network_graph, long _entropy_source);
        // struct LDKMessageRouter DefaultMessageRouter_as_MessageRouter(const struct LDKDefaultMessageRouter *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_DefaultMessageRouter_as_MessageRouter")] public static extern long DefaultMessageRouter_as_MessageRouter(long _this_arg);
        // void OnionMessagePath_free(struct LDKOnionMessagePath this_obj);
@@ -11146,12 +12158,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_get_destination")] public static extern long OnionMessagePath_get_destination(long _this_ptr);
        // void OnionMessagePath_set_destination(struct LDKOnionMessagePath *NONNULL_PTR this_ptr, struct LDKDestination val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_set_destination")] public static extern void OnionMessagePath_set_destination(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKOnionMessagePath OnionMessagePath_new(struct LDKCVec_PublicKeyZ intermediate_nodes_arg, struct LDKDestination destination_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_new")] public static extern long OnionMessagePath_new(long _intermediate_nodes_arg, long _destination_arg);
+       // struct LDKCOption_CVec_SocketAddressZZ OnionMessagePath_get_first_node_addresses(const struct LDKOnionMessagePath *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_get_first_node_addresses")] public static extern long OnionMessagePath_get_first_node_addresses(long _this_ptr);
+       // void OnionMessagePath_set_first_node_addresses(struct LDKOnionMessagePath *NONNULL_PTR this_ptr, struct LDKCOption_CVec_SocketAddressZZ val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_set_first_node_addresses")] public static extern void OnionMessagePath_set_first_node_addresses(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKOnionMessagePath OnionMessagePath_new(struct LDKCVec_PublicKeyZ intermediate_nodes_arg, struct LDKDestination destination_arg, struct LDKCOption_CVec_SocketAddressZZ first_node_addresses_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_new")] public static extern long OnionMessagePath_new(long _intermediate_nodes_arg, long _destination_arg, long _first_node_addresses_arg);
        // uint64_t OnionMessagePath_clone_ptr(LDKOnionMessagePath *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_clone_ptr")] public static extern long OnionMessagePath_clone_ptr(long _arg);
        // struct LDKOnionMessagePath OnionMessagePath_clone(const struct LDKOnionMessagePath *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_clone")] public static extern long OnionMessagePath_clone(long _orig);
+       // MUST_USE_RES struct LDKPublicKey OnionMessagePath_first_node(const struct LDKOnionMessagePath *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessagePath_first_node")] public static extern long OnionMessagePath_first_node(long _this_arg);
        // void Destination_free(struct LDKDestination this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Destination_free")] public static extern void Destination_free(long _this_ptr);
        // uint64_t Destination_clone_ptr(LDKDestination *NONNULL_PTR arg);
@@ -11162,6 +12180,18 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Destination_node")] public static extern long Destination_node(long _a);
        // struct LDKDestination Destination_blinded_path(struct LDKBlindedPath a);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Destination_blinded_path")] public static extern long Destination_blinded_path(long _a);
+       // void SendSuccess_free(struct LDKSendSuccess this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendSuccess_free")] public static extern void SendSuccess_free(long _this_ptr);
+       // uint64_t SendSuccess_clone_ptr(LDKSendSuccess *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendSuccess_clone_ptr")] public static extern long SendSuccess_clone_ptr(long _arg);
+       // struct LDKSendSuccess SendSuccess_clone(const struct LDKSendSuccess *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendSuccess_clone")] public static extern long SendSuccess_clone(long _orig);
+       // struct LDKSendSuccess SendSuccess_buffered(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendSuccess_buffered")] public static extern long SendSuccess_buffered();
+       // struct LDKSendSuccess SendSuccess_buffered_awaiting_connection(struct LDKPublicKey a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendSuccess_buffered_awaiting_connection")] public static extern long SendSuccess_buffered_awaiting_connection(long _a);
+       // bool SendSuccess_eq(const struct LDKSendSuccess *NONNULL_PTR a, const struct LDKSendSuccess *NONNULL_PTR b);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendSuccess_eq")] public static extern bool SendSuccess_eq(long _a, long _b);
        // void SendError_free(struct LDKSendError this_ptr);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_free")] public static extern void SendError_free(long _this_ptr);
        // uint64_t SendError_clone_ptr(LDKSendError *NONNULL_PTR arg);
@@ -11174,8 +12204,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_too_big_packet")] public static extern long SendError_too_big_packet();
        // struct LDKSendError SendError_too_few_blinded_hops(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_too_few_blinded_hops")] public static extern long SendError_too_few_blinded_hops();
-       // struct LDKSendError SendError_invalid_first_hop(void);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_invalid_first_hop")] public static extern long SendError_invalid_first_hop();
+       // struct LDKSendError SendError_invalid_first_hop(struct LDKPublicKey a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_invalid_first_hop")] public static extern long SendError_invalid_first_hop(long _a);
+       // struct LDKSendError SendError_path_not_found(void);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_path_not_found")] public static extern long SendError_path_not_found();
        // struct LDKSendError SendError_invalid_message(void);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SendError_invalid_message")] public static extern long SendError_invalid_message();
        // struct LDKSendError SendError_buffer_full(void);
@@ -11198,14 +12230,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeeledOnion_forward")] public static extern long PeeledOnion_forward(long _a, long _b);
        // struct LDKPeeledOnion PeeledOnion_receive(struct LDKParsedOnionMessageContents a, struct LDKThirtyTwoBytes b, struct LDKBlindedPath c);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PeeledOnion_receive")] public static extern long PeeledOnion_receive(long _a, long _b, long _c);
-       // struct LDKCResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ create_onion_message(const struct LDKEntropySource *NONNULL_PTR entropy_source, const struct LDKNodeSigner *NONNULL_PTR node_signer, struct LDKOnionMessagePath path, struct LDKOnionMessageContents contents, struct LDKBlindedPath reply_path);
+       // struct LDKCResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ create_onion_message(const struct LDKEntropySource *NONNULL_PTR entropy_source, const struct LDKNodeSigner *NONNULL_PTR node_signer, struct LDKOnionMessagePath path, struct LDKOnionMessageContents contents, struct LDKBlindedPath reply_path);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_onion_message")] public static extern long create_onion_message(long _entropy_source, long _node_signer, long _path, long _contents, long _reply_path);
        // struct LDKCResult_PeeledOnionNoneZ peel_onion_message(const struct LDKOnionMessage *NONNULL_PTR msg, struct LDKNodeSigner node_signer, struct LDKLogger logger, struct LDKCustomOnionMessageHandler custom_handler);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_peel_onion_message")] public static extern long peel_onion_message(long _msg, long _node_signer, long _logger, long _custom_handler);
        // MUST_USE_RES struct LDKOnionMessenger OnionMessenger_new(struct LDKEntropySource entropy_source, struct LDKNodeSigner node_signer, struct LDKLogger logger, struct LDKMessageRouter message_router, struct LDKOffersMessageHandler offers_handler, struct LDKCustomOnionMessageHandler custom_handler);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessenger_new")] public static extern long OnionMessenger_new(long _entropy_source, long _node_signer, long _logger, long _message_router, long _offers_handler, long _custom_handler);
-       // MUST_USE_RES struct LDKCResult_NoneSendErrorZ OnionMessenger_send_onion_message(const struct LDKOnionMessenger *NONNULL_PTR this_arg, struct LDKOnionMessagePath path, struct LDKOnionMessageContents contents, struct LDKBlindedPath reply_path);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessenger_send_onion_message")] public static extern long OnionMessenger_send_onion_message(long _this_arg, long _path, long _contents, long _reply_path);
+       // MUST_USE_RES struct LDKCResult_SendSuccessSendErrorZ OnionMessenger_send_onion_message(const struct LDKOnionMessenger *NONNULL_PTR this_arg, struct LDKOnionMessageContents contents, struct LDKDestination destination, struct LDKBlindedPath reply_path);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessenger_send_onion_message")] public static extern long OnionMessenger_send_onion_message(long _this_arg, long _contents, long _destination, long _reply_path);
        // struct LDKOnionMessageHandler OnionMessenger_as_OnionMessageHandler(const struct LDKOnionMessenger *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OnionMessenger_as_OnionMessageHandler")] public static extern long OnionMessenger_as_OnionMessageHandler(long _this_arg);
        // void OffersMessageHandler_free(struct LDKOffersMessageHandler this_ptr);
@@ -11224,6 +12256,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_invoice_error")] public static extern long OffersMessage_invoice_error(long _a);
        // MUST_USE_RES bool OffersMessage_is_known_type(uint64_t tlv_type);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_is_known_type")] public static extern bool OffersMessage_is_known_type(long _tlv_type);
+       // struct LDKOnionMessageContents OffersMessage_as_OnionMessageContents(const struct LDKOffersMessage *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_as_OnionMessageContents")] public static extern long OffersMessage_as_OnionMessageContents(long _this_arg);
        // struct LDKCVec_u8Z OffersMessage_write(const struct LDKOffersMessage *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_OffersMessage_write")] public static extern long OffersMessage_write(long _obj);
        // struct LDKCResult_OffersMessageDecodeErrorZ OffersMessage_read(struct LDKu8slice ser, uint64_t arg_a, const struct LDKLogger *NONNULL_PTR arg_b);
@@ -11252,6 +12286,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_clone_ptr")] public static extern long Packet_clone_ptr(long _arg);
        // struct LDKPacket Packet_clone(const struct LDKPacket *NONNULL_PTR orig);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_clone")] public static extern long Packet_clone(long _orig);
+       // uint64_t Packet_hash(const struct LDKPacket *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_hash")] public static extern long Packet_hash(long _o);
        // bool Packet_eq(const struct LDKPacket *NONNULL_PTR a, const struct LDKPacket *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Packet_eq")] public static extern bool Packet_eq(long _a, long _b);
        // struct LDKCVec_u8Z Packet_write(const struct LDKPacket *NONNULL_PTR obj);
@@ -11326,6 +12362,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_new_for_message")] public static extern long BlindedPath_new_for_message(long _node_pks, long _entropy_source);
        // MUST_USE_RES struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ BlindedPath_one_hop_for_payment(struct LDKPublicKey payee_node_id, struct LDKReceiveTlvs payee_tlvs, const struct LDKEntropySource *NONNULL_PTR entropy_source);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_one_hop_for_payment")] public static extern long BlindedPath_one_hop_for_payment(long _payee_node_id, long _payee_tlvs, long _entropy_source);
+       // MUST_USE_RES struct LDKCResult_C2Tuple_BlindedPayInfoBlindedPathZNoneZ BlindedPath_new_for_payment(struct LDKCVec_ForwardNodeZ intermediate_nodes, struct LDKPublicKey payee_node_id, struct LDKReceiveTlvs payee_tlvs, uint64_t htlc_maximum_msat, const struct LDKEntropySource *NONNULL_PTR entropy_source);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_new_for_payment")] public static extern long BlindedPath_new_for_payment(long _intermediate_nodes, long _payee_node_id, long _payee_tlvs, long _htlc_maximum_msat, long _entropy_source);
        // struct LDKCVec_u8Z BlindedPath_write(const struct LDKBlindedPath *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_BlindedPath_write")] public static extern long BlindedPath_write(long _obj);
        // struct LDKCResult_BlindedPathDecodeErrorZ BlindedPath_read(struct LDKu8slice ser);
@@ -11434,8 +12472,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ForwardTlvs_write")] public static extern long ForwardTlvs_write(long _obj);
        // struct LDKCVec_u8Z ReceiveTlvs_write(const struct LDKReceiveTlvs *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_write")] public static extern long ReceiveTlvs_write(long _obj);
-       // struct LDKCResult_ReceiveTlvsDecodeErrorZ ReceiveTlvs_read(struct LDKu8slice ser);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ReceiveTlvs_read")] public static extern long ReceiveTlvs_read(long _ser);
        // struct LDKCVec_u8Z PaymentRelay_write(const struct LDKPaymentRelay *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentRelay_write")] public static extern long PaymentRelay_write(long _obj);
        // struct LDKCResult_PaymentRelayDecodeErrorZ PaymentRelay_read(struct LDKu8slice ser);
@@ -11456,6 +12492,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_spontaneous_payment")] public static extern long PaymentPurpose_spontaneous_payment(long _a);
        // bool PaymentPurpose_eq(const struct LDKPaymentPurpose *NONNULL_PTR a, const struct LDKPaymentPurpose *NONNULL_PTR b);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_eq")] public static extern bool PaymentPurpose_eq(long _a, long _b);
+       // MUST_USE_RES struct LDKCOption_ThirtyTwoBytesZ PaymentPurpose_preimage(const struct LDKPaymentPurpose *NONNULL_PTR this_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_preimage")] public static extern long PaymentPurpose_preimage(long _this_arg);
        // struct LDKCVec_u8Z PaymentPurpose_write(const struct LDKPaymentPurpose *NONNULL_PTR obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentPurpose_write")] public static extern long PaymentPurpose_write(long _obj);
        // struct LDKCResult_PaymentPurposeDecodeErrorZ PaymentPurpose_read(struct LDKu8slice ser);
@@ -11478,8 +12516,12 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_get_value_msat")] public static extern long ClaimedHTLC_get_value_msat(long _this_ptr);
        // void ClaimedHTLC_set_value_msat(struct LDKClaimedHTLC *NONNULL_PTR this_ptr, uint64_t val);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_set_value_msat")] public static extern void ClaimedHTLC_set_value_msat(long _this_ptr, long _val);
-       // MUST_USE_RES struct LDKClaimedHTLC ClaimedHTLC_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKU128 user_channel_id_arg, uint32_t cltv_expiry_arg, uint64_t value_msat_arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_new")] public static extern long ClaimedHTLC_new(long _channel_id_arg, long _user_channel_id_arg, int _cltv_expiry_arg, long _value_msat_arg);
+       // uint64_t ClaimedHTLC_get_counterparty_skimmed_fee_msat(const struct LDKClaimedHTLC *NONNULL_PTR this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_get_counterparty_skimmed_fee_msat")] public static extern long ClaimedHTLC_get_counterparty_skimmed_fee_msat(long _this_ptr);
+       // void ClaimedHTLC_set_counterparty_skimmed_fee_msat(struct LDKClaimedHTLC *NONNULL_PTR this_ptr, uint64_t val);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_set_counterparty_skimmed_fee_msat")] public static extern void ClaimedHTLC_set_counterparty_skimmed_fee_msat(long _this_ptr, long _val);
+       // MUST_USE_RES struct LDKClaimedHTLC ClaimedHTLC_new(struct LDKThirtyTwoBytes channel_id_arg, struct LDKU128 user_channel_id_arg, uint32_t cltv_expiry_arg, uint64_t value_msat_arg, uint64_t counterparty_skimmed_fee_msat_arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_new")] public static extern long ClaimedHTLC_new(long _channel_id_arg, long _user_channel_id_arg, int _cltv_expiry_arg, long _value_msat_arg, long _counterparty_skimmed_fee_msat_arg);
        // uint64_t ClaimedHTLC_clone_ptr(LDKClaimedHTLC *NONNULL_PTR arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ClaimedHTLC_clone_ptr")] public static extern long ClaimedHTLC_clone_ptr(long _arg);
        // struct LDKClaimedHTLC ClaimedHTLC_clone(const struct LDKClaimedHTLC *NONNULL_PTR orig);
@@ -11590,6 +12632,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_claimable")] public static extern long Event_payment_claimable(long _receiver_node_id, long _payment_hash, long _onion_fields, long _amount_msat, long _counterparty_skimmed_fee_msat, long _purpose, long _via_channel_id, long _via_user_channel_id, long _claim_deadline);
        // struct LDKEvent Event_payment_claimed(struct LDKPublicKey receiver_node_id, struct LDKThirtyTwoBytes payment_hash, uint64_t amount_msat, struct LDKPaymentPurpose purpose, struct LDKCVec_ClaimedHTLCZ htlcs, struct LDKCOption_u64Z sender_intended_total_msat);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_payment_claimed")] public static extern long Event_payment_claimed(long _receiver_node_id, long _payment_hash, long _amount_msat, long _purpose, long _htlcs, long _sender_intended_total_msat);
+       // struct LDKEvent Event_connection_needed(struct LDKPublicKey node_id, struct LDKCVec_SocketAddressZ addresses);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_connection_needed")] public static extern long Event_connection_needed(long _node_id, long _addresses);
        // struct LDKEvent Event_invoice_request_failed(struct LDKThirtyTwoBytes payment_id);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_invoice_request_failed")] public static extern long Event_invoice_request_failed(long _payment_id);
        // struct LDKEvent Event_payment_sent(struct LDKCOption_ThirtyTwoBytesZ payment_id, struct LDKThirtyTwoBytes payment_preimage, struct LDKThirtyTwoBytes payment_hash, struct LDKCOption_u64Z fee_paid_msat);
@@ -11616,8 +12660,8 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_channel_pending")] public static extern long Event_channel_pending(long _channel_id, long _user_channel_id, long _former_temporary_channel_id, long _counterparty_node_id, long _funding_txo);
        // struct LDKEvent Event_channel_ready(struct LDKThirtyTwoBytes channel_id, struct LDKU128 user_channel_id, struct LDKPublicKey counterparty_node_id, struct LDKChannelTypeFeatures channel_type);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_channel_ready")] public static extern long Event_channel_ready(long _channel_id, long _user_channel_id, long _counterparty_node_id, long _channel_type);
-       // struct LDKEvent Event_channel_closed(struct LDKThirtyTwoBytes channel_id, struct LDKU128 user_channel_id, struct LDKClosureReason reason, struct LDKPublicKey counterparty_node_id, struct LDKCOption_u64Z channel_capacity_sats);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_channel_closed")] public static extern long Event_channel_closed(long _channel_id, long _user_channel_id, long _reason, long _counterparty_node_id, long _channel_capacity_sats);
+       // struct LDKEvent Event_channel_closed(struct LDKThirtyTwoBytes channel_id, struct LDKU128 user_channel_id, struct LDKClosureReason reason, struct LDKPublicKey counterparty_node_id, struct LDKCOption_u64Z channel_capacity_sats, struct LDKOutPoint channel_funding_txo);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_channel_closed")] public static extern long Event_channel_closed(long _channel_id, long _user_channel_id, long _reason, long _counterparty_node_id, long _channel_capacity_sats, long _channel_funding_txo);
        // struct LDKEvent Event_discard_funding(struct LDKThirtyTwoBytes channel_id, struct LDKTransaction transaction);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Event_discard_funding")] public static extern long Event_discard_funding(long _channel_id, long _transaction);
        // struct LDKEvent Event_open_channel_request(struct LDKThirtyTwoBytes temporary_channel_id, struct LDKPublicKey counterparty_node_id, uint64_t funding_satoshis, uint64_t push_msat, struct LDKChannelTypeFeatures channel_type);
@@ -11650,6 +12694,14 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_funding_created")] public static extern long MessageSendEvent_send_funding_created(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_funding_signed(struct LDKPublicKey node_id, struct LDKFundingSigned msg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_funding_signed")] public static extern long MessageSendEvent_send_funding_signed(long _node_id, long _msg);
+       // struct LDKMessageSendEvent MessageSendEvent_send_stfu(struct LDKPublicKey node_id, struct LDKStfu msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_stfu")] public static extern long MessageSendEvent_send_stfu(long _node_id, long _msg);
+       // struct LDKMessageSendEvent MessageSendEvent_send_splice(struct LDKPublicKey node_id, struct LDKSplice msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_splice")] public static extern long MessageSendEvent_send_splice(long _node_id, long _msg);
+       // struct LDKMessageSendEvent MessageSendEvent_send_splice_ack(struct LDKPublicKey node_id, struct LDKSpliceAck msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_splice_ack")] public static extern long MessageSendEvent_send_splice_ack(long _node_id, long _msg);
+       // struct LDKMessageSendEvent MessageSendEvent_send_splice_locked(struct LDKPublicKey node_id, struct LDKSpliceLocked msg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_splice_locked")] public static extern long MessageSendEvent_send_splice_locked(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_add_input(struct LDKPublicKey node_id, struct LDKTxAddInput msg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_MessageSendEvent_send_tx_add_input")] public static extern long MessageSendEvent_send_tx_add_input(long _node_id, long _msg);
        // struct LDKMessageSendEvent MessageSendEvent_send_tx_add_output(struct LDKPublicKey node_id, struct LDKTxAddOutput msg);
@@ -12200,8 +13252,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Bolt11Invoice_amount_milli_satoshis")] public static extern long Bolt11Invoice_amount_milli_satoshis(long _this_arg);
        // MUST_USE_RES struct LDKCResult_DescriptionCreationErrorZ Description_new(struct LDKStr description);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Description_new")] public static extern long Description_new(long _description);
-       // MUST_USE_RES struct LDKStr Description_into_inner(struct LDKDescription this_arg);
+       // MUST_USE_RES struct LDKUntrustedString Description_into_inner(struct LDKDescription this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Description_into_inner")] public static extern long Description_into_inner(long _this_arg);
+       // struct LDKStr Description_to_str(const struct LDKDescription *NONNULL_PTR o);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Description_to_str")] public static extern long Description_to_str(long _o);
        // MUST_USE_RES struct LDKExpiryTime ExpiryTime_from_seconds(uint64_t seconds);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ExpiryTime_from_seconds")] public static extern long ExpiryTime_from_seconds(long _seconds);
        // MUST_USE_RES struct LDKExpiryTime ExpiryTime_from_duration(uint64_t duration);
@@ -12272,42 +13326,10 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignOrCreationError_eq")] public static extern bool SignOrCreationError_eq(long _a, long _b);
        // struct LDKStr SignOrCreationError_to_str(const struct LDKSignOrCreationError *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SignOrCreationError_to_str")] public static extern long SignOrCreationError_to_str(long _o);
-       // struct LDKCResult_ThirtyTwoBytesPaymentErrorZ pay_invoice(const struct LDKBolt11Invoice *NONNULL_PTR invoice, struct LDKRetry retry_strategy, const struct LDKChannelManager *NONNULL_PTR channelmanager);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_pay_invoice")] public static extern long pay_invoice(long _invoice, long _retry_strategy, long _channelmanager);
-       // struct LDKCResult_NonePaymentErrorZ pay_invoice_with_id(const struct LDKBolt11Invoice *NONNULL_PTR invoice, struct LDKThirtyTwoBytes payment_id, struct LDKRetry retry_strategy, const struct LDKChannelManager *NONNULL_PTR channelmanager);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_pay_invoice_with_id")] public static extern long pay_invoice_with_id(long _invoice, long _payment_id, long _retry_strategy, long _channelmanager);
-       // struct LDKCResult_ThirtyTwoBytesPaymentErrorZ pay_zero_value_invoice(const struct LDKBolt11Invoice *NONNULL_PTR invoice, uint64_t amount_msats, struct LDKRetry retry_strategy, const struct LDKChannelManager *NONNULL_PTR channelmanager);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_pay_zero_value_invoice")] public static extern long pay_zero_value_invoice(long _invoice, long _amount_msats, long _retry_strategy, long _channelmanager);
-       // struct LDKCResult_NonePaymentErrorZ pay_zero_value_invoice_with_id(const struct LDKBolt11Invoice *NONNULL_PTR invoice, uint64_t amount_msats, struct LDKThirtyTwoBytes payment_id, struct LDKRetry retry_strategy, const struct LDKChannelManager *NONNULL_PTR channelmanager);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_pay_zero_value_invoice_with_id")] public static extern long pay_zero_value_invoice_with_id(long _invoice, long _amount_msats, long _payment_id, long _retry_strategy, long _channelmanager);
-       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ preflight_probe_invoice(const struct LDKBolt11Invoice *NONNULL_PTR invoice, const struct LDKChannelManager *NONNULL_PTR channelmanager, struct LDKCOption_u64Z liquidity_limit_multiplier);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_preflight_probe_invoice")] public static extern long preflight_probe_invoice(long _invoice, long _channelmanager, long _liquidity_limit_multiplier);
-       // struct LDKCResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ preflight_probe_zero_value_invoice(const struct LDKBolt11Invoice *NONNULL_PTR invoice, uint64_t amount_msat, const struct LDKChannelManager *NONNULL_PTR channelmanager, struct LDKCOption_u64Z liquidity_limit_multiplier);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_preflight_probe_zero_value_invoice")] public static extern long preflight_probe_zero_value_invoice(long _invoice, long _amount_msat, long _channelmanager, long _liquidity_limit_multiplier);
-       // void PaymentError_free(struct LDKPaymentError this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentError_free")] public static extern void PaymentError_free(long _this_ptr);
-       // uint64_t PaymentError_clone_ptr(LDKPaymentError *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentError_clone_ptr")] public static extern long PaymentError_clone_ptr(long _arg);
-       // struct LDKPaymentError PaymentError_clone(const struct LDKPaymentError *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentError_clone")] public static extern long PaymentError_clone(long _orig);
-       // struct LDKPaymentError PaymentError_invoice(struct LDKStr a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentError_invoice")] public static extern long PaymentError_invoice(long _a);
-       // struct LDKPaymentError PaymentError_sending(enum LDKRetryableSendFailure a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentError_sending")] public static extern long PaymentError_sending(RetryableSendFailure _a);
-       // bool PaymentError_eq(const struct LDKPaymentError *NONNULL_PTR a, const struct LDKPaymentError *NONNULL_PTR b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_PaymentError_eq")] public static extern bool PaymentError_eq(long _a, long _b);
-       // void ProbingError_free(struct LDKProbingError this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbingError_free")] public static extern void ProbingError_free(long _this_ptr);
-       // uint64_t ProbingError_clone_ptr(LDKProbingError *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbingError_clone_ptr")] public static extern long ProbingError_clone_ptr(long _arg);
-       // struct LDKProbingError ProbingError_clone(const struct LDKProbingError *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbingError_clone")] public static extern long ProbingError_clone(long _orig);
-       // struct LDKProbingError ProbingError_invoice(struct LDKStr a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbingError_invoice")] public static extern long ProbingError_invoice(long _a);
-       // struct LDKProbingError ProbingError_sending(struct LDKProbeSendFailure a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbingError_sending")] public static extern long ProbingError_sending(long _a);
-       // bool ProbingError_eq(const struct LDKProbingError *NONNULL_PTR a, const struct LDKProbingError *NONNULL_PTR b);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_ProbingError_eq")] public static extern bool ProbingError_eq(long _a, long _b);
+       // struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ payment_parameters_from_zero_amount_invoice(const struct LDKBolt11Invoice *NONNULL_PTR invoice, uint64_t amount_msat);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_payment_parameters_from_zero_amount_invoice")] public static extern long payment_parameters_from_zero_amount_invoice(long _invoice, long _amount_msat);
+       // struct LDKCResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ payment_parameters_from_invoice(const struct LDKBolt11Invoice *NONNULL_PTR invoice);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_payment_parameters_from_invoice")] public static extern long payment_parameters_from_invoice(long _invoice);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ create_phantom_invoice(struct LDKCOption_u64Z amt_msat, struct LDKCOption_ThirtyTwoBytesZ payment_hash, struct LDKStr description, uint32_t invoice_expiry_delta_secs, struct LDKCVec_PhantomRouteHintsZ phantom_route_hints, struct LDKEntropySource entropy_source, struct LDKNodeSigner node_signer, struct LDKLogger logger, enum LDKCurrency network, struct LDKCOption_u16Z min_final_cltv_expiry_delta, uint64_t duration_since_epoch);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_create_phantom_invoice")] public static extern long create_phantom_invoice(long _amt_msat, long _payment_hash, long _description, int _invoice_expiry_delta_secs, long _phantom_route_hints, long _entropy_source, long _node_signer, long _logger, Currency _network, long _min_final_cltv_expiry_delta, long _duration_since_epoch);
        // struct LDKCResult_Bolt11InvoiceSignOrCreationErrorZ create_phantom_invoice_with_description_hash(struct LDKCOption_u64Z amt_msat, struct LDKCOption_ThirtyTwoBytesZ payment_hash, uint32_t invoice_expiry_delta_secs, struct LDKSha256 description_hash, struct LDKCVec_PhantomRouteHintsZ phantom_route_hints, struct LDKEntropySource entropy_source, struct LDKNodeSigner node_signer, struct LDKLogger logger, enum LDKCurrency network, struct LDKCOption_u16Z min_final_cltv_expiry_delta, uint64_t duration_since_epoch);
@@ -12340,6 +13362,16 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_Currency_to_str")] public static extern long Currency_to_str(long _o);
        // struct LDKStr SiPrefix_to_str(const enum LDKSiPrefix *NONNULL_PTR o);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_SiPrefix_to_str")] public static extern long SiPrefix_to_str(long _o);
+       // void GraphSyncError_free(struct LDKGraphSyncError this_ptr);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_free")] public static extern void GraphSyncError_free(long _this_ptr);
+       // uint64_t GraphSyncError_clone_ptr(LDKGraphSyncError *NONNULL_PTR arg);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_clone_ptr")] public static extern long GraphSyncError_clone_ptr(long _arg);
+       // struct LDKGraphSyncError GraphSyncError_clone(const struct LDKGraphSyncError *NONNULL_PTR orig);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_clone")] public static extern long GraphSyncError_clone(long _orig);
+       // struct LDKGraphSyncError GraphSyncError_decode_error(struct LDKDecodeError a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_decode_error")] public static extern long GraphSyncError_decode_error(long _a);
+       // struct LDKGraphSyncError GraphSyncError_lightning_error(struct LDKLightningError a);
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_lightning_error")] public static extern long GraphSyncError_lightning_error(long _a);
        // void RapidGossipSync_free(struct LDKRapidGossipSync this_obj);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_free")] public static extern void RapidGossipSync_free(long _this_obj);
        // MUST_USE_RES struct LDKRapidGossipSync RapidGossipSync_new(const struct LDKNetworkGraph *NONNULL_PTR network_graph, struct LDKLogger logger);
@@ -12352,16 +13384,6 @@ internal class bindings {
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_update_network_graph_no_std")] public static extern long RapidGossipSync_update_network_graph_no_std(long _this_arg, long _update_data, long _current_time_unix);
        // MUST_USE_RES bool RapidGossipSync_is_initial_sync_complete(const struct LDKRapidGossipSync *NONNULL_PTR this_arg);
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_RapidGossipSync_is_initial_sync_complete")] public static extern bool RapidGossipSync_is_initial_sync_complete(long _this_arg);
-       // void GraphSyncError_free(struct LDKGraphSyncError this_ptr);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_free")] public static extern void GraphSyncError_free(long _this_ptr);
-       // uint64_t GraphSyncError_clone_ptr(LDKGraphSyncError *NONNULL_PTR arg);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_clone_ptr")] public static extern long GraphSyncError_clone_ptr(long _arg);
-       // struct LDKGraphSyncError GraphSyncError_clone(const struct LDKGraphSyncError *NONNULL_PTR orig);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_clone")] public static extern long GraphSyncError_clone(long _orig);
-       // struct LDKGraphSyncError GraphSyncError_decode_error(struct LDKDecodeError a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_decode_error")] public static extern long GraphSyncError_decode_error(long _a);
-       // struct LDKGraphSyncError GraphSyncError_lightning_error(struct LDKLightningError a);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_GraphSyncError_lightning_error")] public static extern long GraphSyncError_lightning_error(long _a);
 
        static long c_callback_l_l(int obj_ptr, int fn_id, long a) {
                if (obj_ptr >= js_objs.Count) {
@@ -12411,153 +13433,160 @@ internal class bindings {
                                        Environment.Exit(44);
                                }
                                return ((LDKEcdsaChannelSigner)obj).sign_channel_announcement_with_funding_key(a);
-                       case 35:
+                       case 36:
                                if (!(obj is LDKNodeSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKNodeSigner)obj).sign_bolt12_invoice_request(a);
-                       case 36:
+                       case 37:
                                if (!(obj is LDKNodeSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKNodeSigner)obj).sign_bolt12_invoice(a);
-                       case 37:
+                       case 38:
                                if (!(obj is LDKNodeSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKNodeSigner)obj).sign_gossip_message(a);
-                       case 40:
+                       case 41:
                                if (!(obj is LDKSignerProvider)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSignerProvider in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKSignerProvider)obj).read_chan_signer(a);
-                       case 57:
-                               if (!(obj is LDKPersister)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKPersister in l_l");
-                                       Console.Error.Flush();
-                                       Environment.Exit(44);
+                       case 42:
+                               if (!(obj is LDKSignerProvider)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKSignerProvider in l_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKSignerProvider)obj).get_destination_script(a);
+                       case 62:
+                               if (!(obj is LDKPersister)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKPersister in l_l");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
                                }
                                return ((LDKPersister)obj).persist_manager(a);
-                       case 58:
+                       case 63:
                                if (!(obj is LDKPersister)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKPersister in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKPersister)obj).persist_graph(a);
-                       case 59:
+                       case 64:
                                if (!(obj is LDKPersister)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKPersister in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKPersister)obj).persist_scorer(a);
-                       case 105:
+                       case 114:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKChannelMessageHandler)obj).provided_init_features(a);
-                       case 107:
+                       case 116:
                                if (!(obj is LDKOffersMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOffersMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKOffersMessageHandler)obj).handle_message(a);
-                       case 109:
+                       case 118:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).handle_node_announcement(a);
-                       case 110:
+                       case 119:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).handle_channel_announcement(a);
-                       case 111:
+                       case 120:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).handle_channel_update(a);
-                       case 112:
+                       case 121:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).get_next_channel_announcement(a);
-                       case 113:
+                       case 122:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).get_next_node_announcement(a);
-                       case 121:
+                       case 130:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).provided_init_features(a);
-                       case 123:
+                       case 133:
                                if (!(obj is LDKOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKOnionMessageHandler)obj).next_onion_message_for_peer(a);
-                       case 127:
+                       case 138:
                                if (!(obj is LDKOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKOnionMessageHandler)obj).provided_init_features(a);
-                       case 132:
+                       case 143:
                                if (!(obj is LDKCustomMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKCustomMessageHandler)obj).provided_init_features(a);
-                       case 133:
+                       case 144:
                                if (!(obj is LDKCustomOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomOnionMessageHandler in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKCustomOnionMessageHandler)obj).handle_custom_message(a);
-                       case 143:
+                       case 153:
                                if (!(obj is LDKCoinSelectionSource)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCoinSelectionSource in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               return ((LDKCoinSelectionSource)obj).sign_tx(a);
-                       case 146:
+                               return ((LDKCoinSelectionSource)obj).sign_psbt(a);
+                       case 156:
                                if (!(obj is LDKWalletSource)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKWalletSource in l_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               return ((LDKWalletSource)obj).sign_tx(a);
+                               return ((LDKWalletSource)obj).sign_psbt(a);
                        default:
                                Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_l");
                                Console.Error.Flush();
@@ -12566,8 +13595,9 @@ internal class bindings {
                }
        }
        public delegate long l_l_callback(int obj_ptr, int fn_id, long a);
+       static l_l_callback l_l_callback_inst = c_callback_l_l;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_l_invoker")] public static extern int register_l_l_invoker(l_l_callback callee);
-       static int _run_l_l_registration = register_l_l_invoker(c_callback_l_l);
+       static int _run_l_l_registration = register_l_l_invoker(l_l_callback_inst);
        static long c_callback_l_ll(int obj_ptr, int fn_id, long a, long b) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_ll");
@@ -12588,20 +13618,13 @@ internal class bindings {
                                        Environment.Exit(44);
                                }
                                return ((LDKChannelSigner)obj).validate_holder_commitment(a, b);
-                       case 5:
-                               if (!(obj is LDKEcdsaChannelSigner)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_ll");
-                                       Console.Error.Flush();
-                                       Environment.Exit(44);
-                               }
-                               return ((LDKEcdsaChannelSigner)obj).sign_counterparty_commitment(a, b);
-                       case 6:
-                               if (!(obj is LDKEcdsaChannelSigner)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_ll");
+                       case 3:
+                               if (!(obj is LDKChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelSigner in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               return ((LDKEcdsaChannelSigner)obj).validate_counterparty_revocation(a, b);
+                               return ((LDKChannelSigner)obj).validate_counterparty_revocation(a, b);
                        case 13:
                                if (!(obj is LDKEcdsaChannelSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_ll");
@@ -12609,70 +13632,77 @@ internal class bindings {
                                        Environment.Exit(44);
                                }
                                return ((LDKEcdsaChannelSigner)obj).sign_holder_anchor_input(a, b);
-                       case 25:
+                       case 26:
                                if (!(obj is LDKUtxoLookup)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKUtxoLookup in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKUtxoLookup)obj).get_utxo(a, b);
-                       case 26:
+                       case 27:
                                if (!(obj is LDKWatch)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKWatch in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKWatch)obj).watch_channel(a, b);
-                       case 39:
+                       case 40:
                                if (!(obj is LDKSignerProvider)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSignerProvider in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKSignerProvider)obj).derive_channel_signer(a, b);
-                       case 56:
+                       case 46:
+                               if (!(obj is LDKMessageRouter)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKMessageRouter in l_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKMessageRouter)obj).create_blinded_paths(a, b);
+                       case 61:
                                if (!(obj is LDKKVStore)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKKVStore in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKKVStore)obj).list(a, b);
-                       case 115:
+                       case 124:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).handle_reply_channel_range(a, b);
-                       case 116:
+                       case 125:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).handle_reply_short_channel_ids_end(a, b);
-                       case 117:
+                       case 126:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).handle_query_channel_range(a, b);
-                       case 118:
+                       case 127:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).handle_query_short_channel_ids(a, b);
-                       case 129:
+                       case 140:
                                if (!(obj is LDKCustomMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomMessageHandler in l_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKCustomMessageHandler)obj).handle_custom_message(a, b);
-                       case 134:
+                       case 145:
                                if (!(obj is LDKCustomOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomOnionMessageHandler in l_ll");
                                        Console.Error.Flush();
@@ -12687,8 +13717,9 @@ internal class bindings {
                }
        }
        public delegate long l_ll_callback(int obj_ptr, int fn_id, long a, long b);
+       static l_ll_callback l_ll_callback_inst = c_callback_l_ll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_ll_invoker")] public static extern int register_l_ll_invoker(l_ll_callback callee);
-       static int _run_l_ll_registration = register_l_ll_invoker(c_callback_l_ll);
+       static int _run_l_ll_registration = register_l_ll_invoker(l_ll_callback_inst);
        static long c_callback_l_(int obj_ptr, int fn_id) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_");
@@ -12702,7 +13733,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 3:
+                       case 4:
                                if (!(obj is LDKChannelSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelSigner in l_");
                                        Console.Error.Flush();
@@ -12716,182 +13747,189 @@ internal class bindings {
                                        Environment.Exit(44);
                                }
                                return ((LDKWriteableEcdsaChannelSigner)obj).write();
-                       case 21:
+                       case 22:
                                if (!(obj is LDKLockableScore)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKLockableScore in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKLockableScore)obj).read_lock();
-                       case 22:
+                       case 23:
                                if (!(obj is LDKLockableScore)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKLockableScore in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKLockableScore)obj).write_lock();
-                       case 23:
+                       case 24:
                                if (!(obj is LDKWriteableScore)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKWriteableScore in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKWriteableScore)obj).write();
-                       case 28:
+                       case 29:
                                if (!(obj is LDKWatch)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKWatch in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKWatch)obj).release_pending_monitor_events();
-                       case 30:
+                       case 31:
                                if (!(obj is LDKEntropySource)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKEntropySource in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKEntropySource)obj).get_secure_random_bytes();
-                       case 31:
+                       case 32:
                                if (!(obj is LDKNodeSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKNodeSigner)obj).get_inbound_payment_key_material();
-                       case 41:
-                               if (!(obj is LDKSignerProvider)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKSignerProvider in l_");
-                                       Console.Error.Flush();
-                                       Environment.Exit(44);
-                               }
-                               return ((LDKSignerProvider)obj).get_destination_script();
-                       case 42:
+                       case 43:
                                if (!(obj is LDKSignerProvider)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSignerProvider in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKSignerProvider)obj).get_shutdown_scriptpubkey();
-                       case 47:
+                       case 51:
                                if (!(obj is LDKType)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKType in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKType)obj).debug_str();
-                       case 48:
+                       case 52:
                                if (!(obj is LDKType)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKType in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKType)obj).write();
-                       case 49:
+                       case 53:
                                if (!(obj is LDKOnionMessageContents)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageContents in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKOnionMessageContents)obj).tlv_type();
-                       case 50:
+                       case 54:
                                if (!(obj is LDKOnionMessageContents)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageContents in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKOnionMessageContents)obj).write();
-                       case 69:
+                       case 55:
+                               if (!(obj is LDKOnionMessageContents)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageContents in l_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKOnionMessageContents)obj).debug_str();
+                       case 74:
                                if (!(obj is LDKConfirm)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKConfirm in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKConfirm)obj).get_relevant_txids();
-                       case 72:
+                       case 77:
                                if (!(obj is LDKMessageSendEventsProvider)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKMessageSendEventsProvider in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKMessageSendEventsProvider)obj).get_and_clear_pending_msg_events();
-                       case 104:
+                       case 113:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKChannelMessageHandler)obj).provided_node_features();
-                       case 106:
+                       case 115:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKChannelMessageHandler)obj).get_chain_hashes();
-                       case 108:
+                       case 117:
                                if (!(obj is LDKOffersMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOffersMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKOffersMessageHandler)obj).release_pending_messages();
-                       case 120:
+                       case 129:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).provided_node_features();
-                       case 126:
+                       case 131:
+                               if (!(obj is LDKOnionMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in l_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKOnionMessageHandler)obj).get_and_clear_connections_needed();
+                       case 137:
                                if (!(obj is LDKOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKOnionMessageHandler)obj).provided_node_features();
-                       case 130:
+                       case 141:
                                if (!(obj is LDKCustomMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKCustomMessageHandler)obj).get_and_clear_pending_msg();
-                       case 131:
+                       case 142:
                                if (!(obj is LDKCustomMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKCustomMessageHandler)obj).provided_node_features();
-                       case 135:
+                       case 146:
                                if (!(obj is LDKCustomOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomOnionMessageHandler in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKCustomOnionMessageHandler)obj).release_pending_custom_messages();
-                       case 139:
+                       case 150:
                                if (!(obj is LDKSocketDescriptor)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSocketDescriptor in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKSocketDescriptor)obj).hash();
-                       case 140:
+                       case 151:
                                if (!(obj is LDKScore)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKScore in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKScore)obj).write();
-                       case 144:
+                       case 154:
                                if (!(obj is LDKWalletSource)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKWalletSource in l_");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKWalletSource)obj).list_confirmed_utxos();
-                       case 145:
+                       case 155:
                                if (!(obj is LDKWalletSource)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKWalletSource in l_");
                                        Console.Error.Flush();
@@ -12906,8 +13944,9 @@ internal class bindings {
                }
        }
        public delegate long l__callback(int obj_ptr, int fn_id);
+       static l__callback l__callback_inst = c_callback_l_;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l__invoker")] public static extern int register_l__invoker(l__callback callee);
-       static int _run_l__registration = register_l__invoker(c_callback_l_);
+       static int _run_l__registration = register_l__invoker(l__callback_inst);
        static void c_callback_void_l(int obj_ptr, int fn_id, long a) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in void_l");
@@ -12921,7 +13960,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 4:
+                       case 5:
                                if (!(obj is LDKChannelSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelSigner in void_l");
                                        Console.Error.Flush();
@@ -12929,23 +13968,15 @@ internal class bindings {
                                }
                                ((LDKChannelSigner)obj).provide_channel_parameters(a);
                                return;
-                       case 18:
-                               if (!(obj is LDKScoreUpdate)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreUpdate in void_l");
-                                       Console.Error.Flush();
-                                       Environment.Exit(44);
-                               }
-                               ((LDKScoreUpdate)obj).payment_path_successful(a);
-                               return;
-                       case 20:
+                       case 21:
                                if (!(obj is LDKScoreUpdate)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreUpdate in void_l");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               ((LDKScoreUpdate)obj).probe_successful(a);
+                               ((LDKScoreUpdate)obj).time_passed(a);
                                return;
-                       case 24:
+                       case 25:
                                if (!(obj is LDKLogger)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKLogger in void_l");
                                        Console.Error.Flush();
@@ -12953,7 +13984,7 @@ internal class bindings {
                                }
                                ((LDKLogger)obj).log(a);
                                return;
-                       case 29:
+                       case 30:
                                if (!(obj is LDKBroadcasterInterface)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKBroadcasterInterface in void_l");
                                        Console.Error.Flush();
@@ -12961,7 +13992,7 @@ internal class bindings {
                                }
                                ((LDKBroadcasterInterface)obj).broadcast_transactions(a);
                                return;
-                       case 52:
+                       case 57:
                                if (!(obj is LDKFilter)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKFilter in void_l");
                                        Console.Error.Flush();
@@ -12969,7 +14000,7 @@ internal class bindings {
                                }
                                ((LDKFilter)obj).register_output(a);
                                return;
-                       case 67:
+                       case 72:
                                if (!(obj is LDKConfirm)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKConfirm in void_l");
                                        Console.Error.Flush();
@@ -12977,7 +14008,7 @@ internal class bindings {
                                }
                                ((LDKConfirm)obj).transaction_unconfirmed(a);
                                return;
-                       case 70:
+                       case 75:
                                if (!(obj is LDKEventHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKEventHandler in void_l");
                                        Console.Error.Flush();
@@ -12985,7 +14016,7 @@ internal class bindings {
                                }
                                ((LDKEventHandler)obj).handle_event(a);
                                return;
-                       case 71:
+                       case 76:
                                if (!(obj is LDKEventsProvider)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKEventsProvider in void_l");
                                        Console.Error.Flush();
@@ -12993,7 +14024,7 @@ internal class bindings {
                                }
                                ((LDKEventsProvider)obj).process_pending_events(a);
                                return;
-                       case 99:
+                       case 108:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_l");
                                        Console.Error.Flush();
@@ -13001,7 +14032,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).peer_disconnected(a);
                                return;
-                       case 125:
+                       case 135:
                                if (!(obj is LDKOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in void_l");
                                        Console.Error.Flush();
@@ -13017,8 +14048,68 @@ internal class bindings {
                }
        }
        public delegate void void_l_callback(int obj_ptr, int fn_id, long a);
+       static void_l_callback void_l_callback_inst = c_callback_void_l;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_void_l_invoker")] public static extern int register_void_l_invoker(void_l_callback callee);
-       static int _run_void_l_registration = register_void_l_invoker(c_callback_void_l);
+       static int _run_void_l_registration = register_void_l_invoker(void_l_callback_inst);
+       static long c_callback_l_lll(int obj_ptr, int fn_id, long a, long b, long c) {
+               if (obj_ptr >= js_objs.Count) {
+                       Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_lll");
+                       Console.Error.Flush();
+                       Environment.Exit(42);
+               }
+               object obj = js_objs[obj_ptr].Target;
+               if (obj == null) {
+                       Console.Error.WriteLine("Got function call on GC'd JS object in l_lll");
+                       Console.Error.Flush();
+                       Environment.Exit(43);
+               }
+               switch (fn_id) {
+                       case 6:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_lll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_counterparty_commitment(a, b, c);
+                       case 10:
+                               if (!(obj is LDKEcdsaChannelSigner)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_lll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKEcdsaChannelSigner)obj).sign_holder_htlc_transaction(a, b, c);
+                       case 16:
+                               if (!(obj is LDKScoreLookUp)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreLookUp in l_lll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKScoreLookUp)obj).channel_penalty_msat(a, b, c);
+                       case 45:
+                               if (!(obj is LDKMessageRouter)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKMessageRouter in l_lll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKMessageRouter)obj).find_path(a, b, c);
+                       case 58:
+                               if (!(obj is LDKKVStore)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKKVStore in l_lll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKKVStore)obj).read(a, b, c);
+                       default:
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_lll");
+                               Console.Error.Flush();
+                               Environment.Exit(45);
+                               return 0;
+               }
+       }
+       public delegate long l_lll_callback(int obj_ptr, int fn_id, long a, long b, long c);
+       static l_lll_callback l_lll_callback_inst = c_callback_l_lll;
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_lll_invoker")] public static extern int register_l_lll_invoker(l_lll_callback callee);
+       static int _run_l_lll_registration = register_l_lll_invoker(l_lll_callback_inst);
        static long c_callback_l_llll(int obj_ptr, int fn_id, long a, long b, long c, long d) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_llll");
@@ -13039,14 +14130,21 @@ internal class bindings {
                                        Environment.Exit(44);
                                }
                                return ((LDKEcdsaChannelSigner)obj).sign_justice_revoked_output(a, b, c, d);
-                       case 44:
+                       case 47:
                                if (!(obj is LDKRouter)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRouter in l_llll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRouter)obj).find_route(a, b, c, d);
-                       case 54:
+                       case 49:
+                               if (!(obj is LDKRouter)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKRouter in l_llll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               return ((LDKRouter)obj).create_blinded_payment_paths(a, b, c, d);
+                       case 59:
                                if (!(obj is LDKKVStore)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKKVStore in l_llll");
                                        Console.Error.Flush();
@@ -13061,8 +14159,9 @@ internal class bindings {
                }
        }
        public delegate long l_llll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d);
+       static l_llll_callback l_llll_callback_inst = c_callback_l_llll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_llll_invoker")] public static extern int register_l_llll_invoker(l_llll_callback callee);
-       static int _run_l_llll_registration = register_l_llll_invoker(c_callback_l_llll);
+       static int _run_l_llll_registration = register_l_llll_invoker(l_llll_callback_inst);
        static long c_callback_l_lllll(int obj_ptr, int fn_id, long a, long b, long c, long d, long e) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_lllll");
@@ -13090,13 +14189,6 @@ internal class bindings {
                                        Environment.Exit(44);
                                }
                                return ((LDKEcdsaChannelSigner)obj).sign_counterparty_htlc_transaction(a, b, c, d, e);
-                       case 16:
-                               if (!(obj is LDKScoreLookUp)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreLookUp in l_lllll");
-                                       Console.Error.Flush();
-                                       Environment.Exit(44);
-                               }
-                               return ((LDKScoreLookUp)obj).channel_penalty_msat(a, b, c, d, e);
                        default:
                                Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_lllll");
                                Console.Error.Flush();
@@ -13105,52 +14197,49 @@ internal class bindings {
                }
        }
        public delegate long l_lllll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d, long e);
+       static l_lllll_callback l_lllll_callback_inst = c_callback_l_lllll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_lllll_invoker")] public static extern int register_l_lllll_invoker(l_lllll_callback callee);
-       static int _run_l_lllll_registration = register_l_lllll_invoker(c_callback_l_lllll);
-       static long c_callback_l_lll(int obj_ptr, int fn_id, long a, long b, long c) {
+       static int _run_l_lllll_registration = register_l_lllll_invoker(l_lllll_callback_inst);
+       static void c_callback_void_lll(int obj_ptr, int fn_id, long a, long b, long c) {
                if (obj_ptr >= js_objs.Count) {
-                       Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_lll");
+                       Console.Error.WriteLine("Got function call on unknown/free'd JS object in void_lll");
                        Console.Error.Flush();
                        Environment.Exit(42);
                }
                object obj = js_objs[obj_ptr].Target;
                if (obj == null) {
-                       Console.Error.WriteLine("Got function call on GC'd JS object in l_lll");
+                       Console.Error.WriteLine("Got function call on GC'd JS object in void_lll");
                        Console.Error.Flush();
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 10:
-                               if (!(obj is LDKEcdsaChannelSigner)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKEcdsaChannelSigner in l_lll");
-                                       Console.Error.Flush();
-                                       Environment.Exit(44);
-                               }
-                               return ((LDKEcdsaChannelSigner)obj).sign_holder_htlc_transaction(a, b, c);
-                       case 53:
-                               if (!(obj is LDKKVStore)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKKVStore in l_lll");
+                       case 17:
+                               if (!(obj is LDKScoreUpdate)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreUpdate in void_lll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               return ((LDKKVStore)obj).read(a, b, c);
-                       case 141:
-                               if (!(obj is LDKMessageRouter)) {
-                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKMessageRouter in l_lll");
+                               ((LDKScoreUpdate)obj).payment_path_failed(a, b, c);
+                               return;
+                       case 19:
+                               if (!(obj is LDKScoreUpdate)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreUpdate in void_lll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               return ((LDKMessageRouter)obj).find_path(a, b, c);
+                               ((LDKScoreUpdate)obj).probe_failed(a, b, c);
+                               return;
                        default:
-                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in l_lll");
+                               Console.Error.WriteLine("Got unknown function call with id " + fn_id + " from C in void_lll");
                                Console.Error.Flush();
                                Environment.Exit(45);
-                               return 0;
+                               return;
                }
        }
-       public delegate long l_lll_callback(int obj_ptr, int fn_id, long a, long b, long c);
-       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_lll_invoker")] public static extern int register_l_lll_invoker(l_lll_callback callee);
-       static int _run_l_lll_registration = register_l_lll_invoker(c_callback_l_lll);
+       public delegate void void_lll_callback(int obj_ptr, int fn_id, long a, long b, long c);
+       static void_lll_callback void_lll_callback_inst = c_callback_void_lll;
+       [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_void_lll_invoker")] public static extern int register_void_lll_invoker(void_lll_callback callee);
+       static int _run_void_lll_registration = register_void_lll_invoker(void_lll_callback_inst);
        static void c_callback_void_ll(int obj_ptr, int fn_id, long a, long b) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in void_ll");
@@ -13164,23 +14253,23 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 17:
+                       case 18:
                                if (!(obj is LDKScoreUpdate)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreUpdate in void_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               ((LDKScoreUpdate)obj).payment_path_failed(a, b);
+                               ((LDKScoreUpdate)obj).payment_path_successful(a, b);
                                return;
-                       case 19:
+                       case 20:
                                if (!(obj is LDKScoreUpdate)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKScoreUpdate in void_ll");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
-                               ((LDKScoreUpdate)obj).probe_failed(a, b);
+                               ((LDKScoreUpdate)obj).probe_successful(a, b);
                                return;
-                       case 51:
+                       case 56:
                                if (!(obj is LDKFilter)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKFilter in void_ll");
                                        Console.Error.Flush();
@@ -13188,7 +14277,7 @@ internal class bindings {
                                }
                                ((LDKFilter)obj).register_tx(a, b);
                                return;
-                       case 73:
+                       case 78:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13196,7 +14285,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_open_channel(a, b);
                                return;
-                       case 74:
+                       case 79:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13204,7 +14293,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_open_channel_v2(a, b);
                                return;
-                       case 75:
+                       case 80:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13212,7 +14301,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_accept_channel(a, b);
                                return;
-                       case 76:
+                       case 81:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13220,7 +14309,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_accept_channel_v2(a, b);
                                return;
-                       case 77:
+                       case 82:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13228,7 +14317,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_funding_created(a, b);
                                return;
-                       case 78:
+                       case 83:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13236,7 +14325,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_funding_signed(a, b);
                                return;
-                       case 79:
+                       case 84:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13244,7 +14333,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_channel_ready(a, b);
                                return;
-                       case 80:
+                       case 85:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13252,7 +14341,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_shutdown(a, b);
                                return;
-                       case 81:
+                       case 86:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13260,7 +14349,39 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_closing_signed(a, b);
                                return;
-                       case 82:
+                       case 87:
+                               if (!(obj is LDKChannelMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_stfu(a, b);
+                               return;
+                       case 88:
+                               if (!(obj is LDKChannelMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_splice(a, b);
+                               return;
+                       case 89:
+                               if (!(obj is LDKChannelMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_splice_ack(a, b);
+                               return;
+                       case 90:
+                               if (!(obj is LDKChannelMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKChannelMessageHandler)obj).handle_splice_locked(a, b);
+                               return;
+                       case 91:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13268,7 +14389,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_add_input(a, b);
                                return;
-                       case 83:
+                       case 92:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13276,7 +14397,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_add_output(a, b);
                                return;
-                       case 84:
+                       case 93:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13284,7 +14405,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_remove_input(a, b);
                                return;
-                       case 85:
+                       case 94:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13292,7 +14413,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_remove_output(a, b);
                                return;
-                       case 86:
+                       case 95:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13300,7 +14421,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_complete(a, b);
                                return;
-                       case 87:
+                       case 96:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13308,7 +14429,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_signatures(a, b);
                                return;
-                       case 88:
+                       case 97:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13316,7 +14437,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_init_rbf(a, b);
                                return;
-                       case 89:
+                       case 98:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13324,7 +14445,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_ack_rbf(a, b);
                                return;
-                       case 90:
+                       case 99:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13332,7 +14453,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_tx_abort(a, b);
                                return;
-                       case 91:
+                       case 100:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13340,7 +14461,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_update_add_htlc(a, b);
                                return;
-                       case 92:
+                       case 101:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13348,7 +14469,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_update_fulfill_htlc(a, b);
                                return;
-                       case 93:
+                       case 102:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13356,7 +14477,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_update_fail_htlc(a, b);
                                return;
-                       case 94:
+                       case 103:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13364,7 +14485,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_update_fail_malformed_htlc(a, b);
                                return;
-                       case 95:
+                       case 104:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13372,7 +14493,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_commitment_signed(a, b);
                                return;
-                       case 96:
+                       case 105:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13380,7 +14501,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_revoke_and_ack(a, b);
                                return;
-                       case 97:
+                       case 106:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13388,7 +14509,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_update_fee(a, b);
                                return;
-                       case 98:
+                       case 107:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13396,7 +14517,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_announcement_signatures(a, b);
                                return;
-                       case 101:
+                       case 110:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13404,7 +14525,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_channel_reestablish(a, b);
                                return;
-                       case 102:
+                       case 111:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13412,7 +14533,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_channel_update(a, b);
                                return;
-                       case 103:
+                       case 112:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13420,7 +14541,7 @@ internal class bindings {
                                }
                                ((LDKChannelMessageHandler)obj).handle_error(a, b);
                                return;
-                       case 122:
+                       case 132:
                                if (!(obj is LDKOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in void_ll");
                                        Console.Error.Flush();
@@ -13436,8 +14557,9 @@ internal class bindings {
                }
        }
        public delegate void void_ll_callback(int obj_ptr, int fn_id, long a, long b);
+       static void_ll_callback void_ll_callback_inst = c_callback_void_ll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_void_ll_invoker")] public static extern int register_void_ll_invoker(void_ll_callback callee);
-       static int _run_void_ll_registration = register_void_ll_invoker(c_callback_void_ll);
+       static int _run_void_ll_registration = register_void_ll_invoker(void_ll_callback_inst);
        static ChannelMonitorUpdateStatus c_callback_ChannelMonitorUpdateStatus_ll(int obj_ptr, int fn_id, long a, long b) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in ChannelMonitorUpdateStatus_ll");
@@ -13451,7 +14573,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 27:
+                       case 28:
                                if (!(obj is LDKWatch)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKWatch in ChannelMonitorUpdateStatus_ll");
                                        Console.Error.Flush();
@@ -13466,8 +14588,9 @@ internal class bindings {
                }
        }
        public delegate ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_ll_callback(int obj_ptr, int fn_id, long a, long b);
+       static ChannelMonitorUpdateStatus_ll_callback ChannelMonitorUpdateStatus_ll_callback_inst = c_callback_ChannelMonitorUpdateStatus_ll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_ChannelMonitorUpdateStatus_ll_invoker")] public static extern int register_ChannelMonitorUpdateStatus_ll_invoker(ChannelMonitorUpdateStatus_ll_callback callee);
-       static int _run_ChannelMonitorUpdateStatus_ll_registration = register_ChannelMonitorUpdateStatus_ll_invoker(c_callback_ChannelMonitorUpdateStatus_ll);
+       static int _run_ChannelMonitorUpdateStatus_ll_registration = register_ChannelMonitorUpdateStatus_ll_invoker(ChannelMonitorUpdateStatus_ll_callback_inst);
        static long c_callback_l_Recipient(int obj_ptr, int fn_id, Recipient a) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_Recipient");
@@ -13481,7 +14604,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 32:
+                       case 33:
                                if (!(obj is LDKNodeSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_Recipient");
                                        Console.Error.Flush();
@@ -13496,8 +14619,9 @@ internal class bindings {
                }
        }
        public delegate long l_Recipient_callback(int obj_ptr, int fn_id, Recipient a);
+       static l_Recipient_callback l_Recipient_callback_inst = c_callback_l_Recipient;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_Recipient_invoker")] public static extern int register_l_Recipient_invoker(l_Recipient_callback callee);
-       static int _run_l_Recipient_registration = register_l_Recipient_invoker(c_callback_l_Recipient);
+       static int _run_l_Recipient_registration = register_l_Recipient_invoker(l_Recipient_callback_inst);
        static long c_callback_l_Recipientll(int obj_ptr, int fn_id, Recipient a, long b, long c) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_Recipientll");
@@ -13511,7 +14635,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 33:
+                       case 34:
                                if (!(obj is LDKNodeSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_Recipientll");
                                        Console.Error.Flush();
@@ -13526,8 +14650,9 @@ internal class bindings {
                }
        }
        public delegate long l_Recipientll_callback(int obj_ptr, int fn_id, Recipient a, long b, long c);
+       static l_Recipientll_callback l_Recipientll_callback_inst = c_callback_l_Recipientll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_Recipientll_invoker")] public static extern int register_l_Recipientll_invoker(l_Recipientll_callback callee);
-       static int _run_l_Recipientll_registration = register_l_Recipientll_invoker(c_callback_l_Recipientll);
+       static int _run_l_Recipientll_registration = register_l_Recipientll_invoker(l_Recipientll_callback_inst);
        static long c_callback_l_llRecipient(int obj_ptr, int fn_id, long a, long b, Recipient c) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_llRecipient");
@@ -13541,7 +14666,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 34:
+                       case 35:
                                if (!(obj is LDKNodeSigner)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKNodeSigner in l_llRecipient");
                                        Console.Error.Flush();
@@ -13556,8 +14681,9 @@ internal class bindings {
                }
        }
        public delegate long l_llRecipient_callback(int obj_ptr, int fn_id, long a, long b, Recipient c);
+       static l_llRecipient_callback l_llRecipient_callback_inst = c_callback_l_llRecipient;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_llRecipient_invoker")] public static extern int register_l_llRecipient_invoker(l_llRecipient_callback callee);
-       static int _run_l_llRecipient_registration = register_l_llRecipient_invoker(c_callback_l_llRecipient);
+       static int _run_l_llRecipient_registration = register_l_llRecipient_invoker(l_llRecipient_callback_inst);
        static long c_callback_l_bll(int obj_ptr, int fn_id, bool a, long b, long c) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_bll");
@@ -13571,7 +14697,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 38:
+                       case 39:
                                if (!(obj is LDKSignerProvider)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSignerProvider in l_bll");
                                        Console.Error.Flush();
@@ -13586,8 +14712,9 @@ internal class bindings {
                }
        }
        public delegate long l_bll_callback(int obj_ptr, int fn_id, bool a, long b, long c);
+       static l_bll_callback l_bll_callback_inst = c_callback_l_bll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_bll_invoker")] public static extern int register_l_bll_invoker(l_bll_callback callee);
-       static int _run_l_bll_registration = register_l_bll_invoker(c_callback_l_bll);
+       static int _run_l_bll_registration = register_l_bll_invoker(l_bll_callback_inst);
        static int c_callback_i_ConfirmationTarget(int obj_ptr, int fn_id, ConfirmationTarget a) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in i_ConfirmationTarget");
@@ -13601,7 +14728,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 43:
+                       case 44:
                                if (!(obj is LDKFeeEstimator)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKFeeEstimator in i_ConfirmationTarget");
                                        Console.Error.Flush();
@@ -13616,8 +14743,9 @@ internal class bindings {
                }
        }
        public delegate int i_ConfirmationTarget_callback(int obj_ptr, int fn_id, ConfirmationTarget a);
+       static i_ConfirmationTarget_callback i_ConfirmationTarget_callback_inst = c_callback_i_ConfirmationTarget;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_i_ConfirmationTarget_invoker")] public static extern int register_i_ConfirmationTarget_invoker(i_ConfirmationTarget_callback callee);
-       static int _run_i_ConfirmationTarget_registration = register_i_ConfirmationTarget_invoker(c_callback_i_ConfirmationTarget);
+       static int _run_i_ConfirmationTarget_registration = register_i_ConfirmationTarget_invoker(i_ConfirmationTarget_callback_inst);
        static long c_callback_l_llllll(int obj_ptr, int fn_id, long a, long b, long c, long d, long e, long f) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_llllll");
@@ -13631,7 +14759,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 45:
+                       case 48:
                                if (!(obj is LDKRouter)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRouter in l_llllll");
                                        Console.Error.Flush();
@@ -13646,8 +14774,9 @@ internal class bindings {
                }
        }
        public delegate long l_llllll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d, long e, long f);
+       static l_llllll_callback l_llllll_callback_inst = c_callback_l_llllll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_llllll_invoker")] public static extern int register_l_llllll_invoker(l_llllll_callback callee);
-       static int _run_l_llllll_registration = register_l_llllll_invoker(c_callback_l_llllll);
+       static int _run_l_llllll_registration = register_l_llllll_invoker(l_llllll_callback_inst);
        static short c_callback_s_(int obj_ptr, int fn_id) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in s_");
@@ -13661,7 +14790,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 46:
+                       case 50:
                                if (!(obj is LDKType)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKType in s_");
                                        Console.Error.Flush();
@@ -13676,8 +14805,9 @@ internal class bindings {
                }
        }
        public delegate short s__callback(int obj_ptr, int fn_id);
+       static s__callback s__callback_inst = c_callback_s_;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_s__invoker")] public static extern int register_s__invoker(s__callback callee);
-       static int _run_s__registration = register_s__invoker(c_callback_s_);
+       static int _run_s__registration = register_s__invoker(s__callback_inst);
        static long c_callback_l_lllb(int obj_ptr, int fn_id, long a, long b, long c, bool d) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_lllb");
@@ -13691,7 +14821,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 55:
+                       case 60:
                                if (!(obj is LDKKVStore)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKKVStore in l_lllb");
                                        Console.Error.Flush();
@@ -13706,8 +14836,9 @@ internal class bindings {
                }
        }
        public delegate long l_lllb_callback(int obj_ptr, int fn_id, long a, long b, long c, bool d);
+       static l_lllb_callback l_lllb_callback_inst = c_callback_l_lllb;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_lllb_invoker")] public static extern int register_l_lllb_invoker(l_lllb_callback callee);
-       static int _run_l_lllb_registration = register_l_lllb_invoker(c_callback_l_lllb);
+       static int _run_l_lllb_registration = register_l_lllb_invoker(l_lllb_callback_inst);
        static ChannelMonitorUpdateStatus c_callback_ChannelMonitorUpdateStatus_lll(int obj_ptr, int fn_id, long a, long b, long c) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in ChannelMonitorUpdateStatus_lll");
@@ -13721,7 +14852,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 60:
+                       case 65:
                                if (!(obj is LDKPersist)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKPersist in ChannelMonitorUpdateStatus_lll");
                                        Console.Error.Flush();
@@ -13736,8 +14867,9 @@ internal class bindings {
                }
        }
        public delegate ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_lll_callback(int obj_ptr, int fn_id, long a, long b, long c);
+       static ChannelMonitorUpdateStatus_lll_callback ChannelMonitorUpdateStatus_lll_callback_inst = c_callback_ChannelMonitorUpdateStatus_lll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_ChannelMonitorUpdateStatus_lll_invoker")] public static extern int register_ChannelMonitorUpdateStatus_lll_invoker(ChannelMonitorUpdateStatus_lll_callback callee);
-       static int _run_ChannelMonitorUpdateStatus_lll_registration = register_ChannelMonitorUpdateStatus_lll_invoker(c_callback_ChannelMonitorUpdateStatus_lll);
+       static int _run_ChannelMonitorUpdateStatus_lll_registration = register_ChannelMonitorUpdateStatus_lll_invoker(ChannelMonitorUpdateStatus_lll_callback_inst);
        static ChannelMonitorUpdateStatus c_callback_ChannelMonitorUpdateStatus_llll(int obj_ptr, int fn_id, long a, long b, long c, long d) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in ChannelMonitorUpdateStatus_llll");
@@ -13751,7 +14883,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 61:
+                       case 66:
                                if (!(obj is LDKPersist)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKPersist in ChannelMonitorUpdateStatus_llll");
                                        Console.Error.Flush();
@@ -13766,8 +14898,9 @@ internal class bindings {
                }
        }
        public delegate ChannelMonitorUpdateStatus ChannelMonitorUpdateStatus_llll_callback(int obj_ptr, int fn_id, long a, long b, long c, long d);
+       static ChannelMonitorUpdateStatus_llll_callback ChannelMonitorUpdateStatus_llll_callback_inst = c_callback_ChannelMonitorUpdateStatus_llll;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_ChannelMonitorUpdateStatus_llll_invoker")] public static extern int register_ChannelMonitorUpdateStatus_llll_invoker(ChannelMonitorUpdateStatus_llll_callback callee);
-       static int _run_ChannelMonitorUpdateStatus_llll_registration = register_ChannelMonitorUpdateStatus_llll_invoker(c_callback_ChannelMonitorUpdateStatus_llll);
+       static int _run_ChannelMonitorUpdateStatus_llll_registration = register_ChannelMonitorUpdateStatus_llll_invoker(ChannelMonitorUpdateStatus_llll_callback_inst);
        static void c_callback_void_(int obj_ptr, int fn_id) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in void_");
@@ -13781,7 +14914,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 62:
+                       case 67:
                                if (!(obj is LDKFutureCallback)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKFutureCallback in void_");
                                        Console.Error.Flush();
@@ -13789,7 +14922,15 @@ internal class bindings {
                                }
                                ((LDKFutureCallback)obj).call();
                                return;
-                       case 137:
+                       case 136:
+                               if (!(obj is LDKOnionMessageHandler)) {
+                                       Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in void_");
+                                       Console.Error.Flush();
+                                       Environment.Exit(44);
+                               }
+                               ((LDKOnionMessageHandler)obj).timer_tick_occurred();
+                               return;
+                       case 148:
                                if (!(obj is LDKSocketDescriptor)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSocketDescriptor in void_");
                                        Console.Error.Flush();
@@ -13805,8 +14946,9 @@ internal class bindings {
                }
        }
        public delegate void void__callback(int obj_ptr, int fn_id);
+       static void__callback void__callback_inst = c_callback_void_;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_void__invoker")] public static extern int register_void__invoker(void__callback callee);
-       static int _run_void__registration = register_void__invoker(c_callback_void_);
+       static int _run_void__registration = register_void__invoker(void__callback_inst);
        static void c_callback_void_lli(int obj_ptr, int fn_id, long a, long b, int c) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in void_lli");
@@ -13820,7 +14962,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 63:
+                       case 68:
                                if (!(obj is LDKListen)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKListen in void_lli");
                                        Console.Error.Flush();
@@ -13828,7 +14970,7 @@ internal class bindings {
                                }
                                ((LDKListen)obj).filtered_block_connected(a, b, c);
                                return;
-                       case 66:
+                       case 71:
                                if (!(obj is LDKConfirm)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKConfirm in void_lli");
                                        Console.Error.Flush();
@@ -13844,8 +14986,9 @@ internal class bindings {
                }
        }
        public delegate void void_lli_callback(int obj_ptr, int fn_id, long a, long b, int c);
+       static void_lli_callback void_lli_callback_inst = c_callback_void_lli;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_void_lli_invoker")] public static extern int register_void_lli_invoker(void_lli_callback callee);
-       static int _run_void_lli_registration = register_void_lli_invoker(c_callback_void_lli);
+       static int _run_void_lli_registration = register_void_lli_invoker(void_lli_callback_inst);
        static void c_callback_void_li(int obj_ptr, int fn_id, long a, int b) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in void_li");
@@ -13859,7 +15002,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 64:
+                       case 69:
                                if (!(obj is LDKListen)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKListen in void_li");
                                        Console.Error.Flush();
@@ -13867,7 +15010,7 @@ internal class bindings {
                                }
                                ((LDKListen)obj).block_connected(a, b);
                                return;
-                       case 65:
+                       case 70:
                                if (!(obj is LDKListen)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKListen in void_li");
                                        Console.Error.Flush();
@@ -13875,7 +15018,7 @@ internal class bindings {
                                }
                                ((LDKListen)obj).block_disconnected(a, b);
                                return;
-                       case 68:
+                       case 73:
                                if (!(obj is LDKConfirm)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKConfirm in void_li");
                                        Console.Error.Flush();
@@ -13891,8 +15034,9 @@ internal class bindings {
                }
        }
        public delegate void void_li_callback(int obj_ptr, int fn_id, long a, int b);
+       static void_li_callback void_li_callback_inst = c_callback_void_li;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_void_li_invoker")] public static extern int register_void_li_invoker(void_li_callback callee);
-       static int _run_void_li_registration = register_void_li_invoker(c_callback_void_li);
+       static int _run_void_li_registration = register_void_li_invoker(void_li_callback_inst);
        static long c_callback_l_llb(int obj_ptr, int fn_id, long a, long b, bool c) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_llb");
@@ -13906,21 +15050,21 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 100:
+                       case 109:
                                if (!(obj is LDKChannelMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKChannelMessageHandler in l_llb");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKChannelMessageHandler)obj).peer_connected(a, b, c);
-                       case 114:
+                       case 123:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in l_llb");
                                        Console.Error.Flush();
                                        Environment.Exit(44);
                                }
                                return ((LDKRoutingMessageHandler)obj).peer_connected(a, b, c);
-                       case 124:
+                       case 134:
                                if (!(obj is LDKOnionMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKOnionMessageHandler in l_llb");
                                        Console.Error.Flush();
@@ -13935,8 +15079,9 @@ internal class bindings {
                }
        }
        public delegate long l_llb_callback(int obj_ptr, int fn_id, long a, long b, bool c);
+       static l_llb_callback l_llb_callback_inst = c_callback_l_llb;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_llb_invoker")] public static extern int register_l_llb_invoker(l_llb_callback callee);
-       static int _run_l_llb_registration = register_l_llb_invoker(c_callback_l_llb);
+       static int _run_l_llb_registration = register_l_llb_invoker(l_llb_callback_inst);
        static bool c_callback_b_(int obj_ptr, int fn_id) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in b_");
@@ -13950,7 +15095,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 119:
+                       case 128:
                                if (!(obj is LDKRoutingMessageHandler)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKRoutingMessageHandler in b_");
                                        Console.Error.Flush();
@@ -13965,8 +15110,9 @@ internal class bindings {
                }
        }
        public delegate bool b__callback(int obj_ptr, int fn_id);
+       static b__callback b__callback_inst = c_callback_b_;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_b__invoker")] public static extern int register_b__invoker(b__callback callee);
-       static int _run_b__registration = register_b__invoker(c_callback_b_);
+       static int _run_b__registration = register_b__invoker(b__callback_inst);
        static long c_callback_l_sl(int obj_ptr, int fn_id, short a, long b) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_sl");
@@ -13980,7 +15126,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 128:
+                       case 139:
                                if (!(obj is LDKCustomMessageReader)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCustomMessageReader in l_sl");
                                        Console.Error.Flush();
@@ -13995,8 +15141,9 @@ internal class bindings {
                }
        }
        public delegate long l_sl_callback(int obj_ptr, int fn_id, short a, long b);
+       static l_sl_callback l_sl_callback_inst = c_callback_l_sl;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_sl_invoker")] public static extern int register_l_sl_invoker(l_sl_callback callee);
-       static int _run_l_sl_registration = register_l_sl_invoker(c_callback_l_sl);
+       static int _run_l_sl_registration = register_l_sl_invoker(l_sl_callback_inst);
        static long c_callback_l_lb(int obj_ptr, int fn_id, long a, bool b) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_lb");
@@ -14010,7 +15157,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 136:
+                       case 147:
                                if (!(obj is LDKSocketDescriptor)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSocketDescriptor in l_lb");
                                        Console.Error.Flush();
@@ -14025,8 +15172,9 @@ internal class bindings {
                }
        }
        public delegate long l_lb_callback(int obj_ptr, int fn_id, long a, bool b);
+       static l_lb_callback l_lb_callback_inst = c_callback_l_lb;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_lb_invoker")] public static extern int register_l_lb_invoker(l_lb_callback callee);
-       static int _run_l_lb_registration = register_l_lb_invoker(c_callback_l_lb);
+       static int _run_l_lb_registration = register_l_lb_invoker(l_lb_callback_inst);
        static bool c_callback_b_l(int obj_ptr, int fn_id, long a) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in b_l");
@@ -14040,7 +15188,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 138:
+                       case 149:
                                if (!(obj is LDKSocketDescriptor)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKSocketDescriptor in b_l");
                                        Console.Error.Flush();
@@ -14055,8 +15203,9 @@ internal class bindings {
                }
        }
        public delegate bool b_l_callback(int obj_ptr, int fn_id, long a);
+       static b_l_callback b_l_callback_inst = c_callback_b_l;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_b_l_invoker")] public static extern int register_b_l_invoker(b_l_callback callee);
-       static int _run_b_l_registration = register_b_l_invoker(c_callback_b_l);
+       static int _run_b_l_registration = register_b_l_invoker(b_l_callback_inst);
        static long c_callback_l_llli(int obj_ptr, int fn_id, long a, long b, long c, int d) {
                if (obj_ptr >= js_objs.Count) {
                        Console.Error.WriteLine("Got function call on unknown/free'd JS object in l_llli");
@@ -14070,7 +15219,7 @@ internal class bindings {
                        Environment.Exit(43);
                }
                switch (fn_id) {
-                       case 142:
+                       case 152:
                                if (!(obj is LDKCoinSelectionSource)) {
                                        Console.Error.WriteLine("Got function call to object that wasn't a LDKCoinSelectionSource in l_llli");
                                        Console.Error.Flush();
@@ -14085,7 +15234,8 @@ internal class bindings {
                }
        }
        public delegate long l_llli_callback(int obj_ptr, int fn_id, long a, long b, long c, int d);
+       static l_llli_callback l_llli_callback_inst = c_callback_l_llli;
        [DllImport ("ldkcsharp", EntryPoint="CS_LDK_register_l_llli_invoker")] public static extern int register_l_llli_invoker(l_llli_callback callee);
-       static int _run_l_llli_registration = register_l_llli_invoker(c_callback_l_llli);
+       static int _run_l_llli_registration = register_l_llli_invoker(l_llli_callback_inst);
 }
 } } }
\ No newline at end of file
index 78b053475a6a91a049ca238a05ad3a26c4ee1ce9..ffa4cfa03c8ec4ecf08ff4abe49456431e2a9e2a 100644 (file)
@@ -390,6 +390,18 @@ public class AcceptChannel : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the AcceptChannel.
+        */
+       public long hash() {
+               long ret = bindings.AcceptChannel_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two AcceptChannels contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index eea8b64cf475627a24af68fab3f05d2dfdb8adc8..1090715d5bfa324f009559814885f93df28d5fce 100644 (file)
@@ -436,6 +436,18 @@ public class AcceptChannelV2 : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the AcceptChannelV2.
+        */
+       public long hash() {
+               long ret = bindings.AcceptChannelV2_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two AcceptChannelV2s contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 34d31dd4d0475d1b16bceb4fa4e1dcb9b4212b35..cebd823c9c7d60a2bbd57843fa0cca64ab91b283 100644 (file)
@@ -128,6 +128,18 @@ public class AnnouncementSignatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the AnnouncementSignatures.
+        */
+       public long hash() {
+               long ret = bindings.AnnouncementSignatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two AnnouncementSignaturess contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
diff --git a/c_sharp/src/org/ldk/structs/BlindedForward.cs b/c_sharp/src/org/ldk/structs/BlindedForward.cs
new file mode 100644 (file)
index 0000000..12a542d
--- /dev/null
@@ -0,0 +1,145 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Information used to forward or fail this HTLC that is being forwarded within a blinded path.
+ */
+public class BlindedForward : CommonBase {
+       internal BlindedForward(object _dummy, long ptr) : base(ptr) { }
+       ~BlindedForward() {
+               if (ptr != 0) { bindings.BlindedForward_free(ptr); }
+       }
+
+       /**
+        * The `blinding_point` that was set in the inbound [`msgs::UpdateAddHTLC`], or in the inbound
+        * onion payload if we're the introduction node. Useful for calculating the next hop's
+        * [`msgs::UpdateAddHTLC::blinding_point`].
+        */
+       public byte[] get_inbound_blinding_point() {
+               long ret = bindings.BlindedForward_get_inbound_blinding_point(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The `blinding_point` that was set in the inbound [`msgs::UpdateAddHTLC`], or in the inbound
+        * onion payload if we're the introduction node. Useful for calculating the next hop's
+        * [`msgs::UpdateAddHTLC::blinding_point`].
+        */
+       public void set_inbound_blinding_point(byte[] val) {
+               bindings.BlindedForward_set_inbound_blinding_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * If needed, this determines how this HTLC should be failed backwards, based on whether we are
+        * the introduction node.
+        */
+       public BlindedFailure get_failure() {
+               BlindedFailure ret = bindings.BlindedForward_get_failure(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * If needed, this determines how this HTLC should be failed backwards, based on whether we are
+        * the introduction node.
+        */
+       public void set_failure(BlindedFailure val) {
+               bindings.BlindedForward_set_failure(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new BlindedForward given each field
+        */
+       public static BlindedForward of(byte[] inbound_blinding_point_arg, BlindedFailure failure_arg) {
+               long ret = bindings.BlindedForward_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(inbound_blinding_point_arg, 33)), failure_arg);
+               GC.KeepAlive(inbound_blinding_point_arg);
+               GC.KeepAlive(failure_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedForward ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedForward(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.BlindedForward_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the BlindedForward
+        */
+       public BlindedForward clone() {
+               long ret = bindings.BlindedForward_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedForward ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedForward(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Generates a non-cryptographic 64-bit hash of the BlindedForward.
+        */
+       public long hash() {
+               long ret = bindings.BlindedForward_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
+       /**
+        * Checks if two BlindedForwards contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.BlindedForward b) {
+               bool ret = bindings.BlindedForward_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is BlindedForward)) return false;
+               return this.eq((BlindedForward)o);
+       }
+       /**
+        * Serialize the BlindedForward object into a byte array which can be read by BlindedForward_read
+        */
+       public byte[] write() {
+               long ret = bindings.BlindedForward_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a BlindedForward from a byte array, created by BlindedForward_write
+        */
+       public static Result_BlindedForwardDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.BlindedForward_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedForwardDecodeErrorZ ret_hu_conv = Result_BlindedForwardDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index bf3c2cc47f558518b7a96cf4ecadcf5b8ca82b5c..d6de7e38b3c75fcba05536908a0db3795a68322b 100644 (file)
@@ -50,6 +50,18 @@ public class BlindedHopFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the BlindedHopFeatures.
+        */
+       public long hash() {
+               long ret = bindings.BlindedHopFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
diff --git a/c_sharp/src/org/ldk/structs/BlindedPathCandidate.cs b/c_sharp/src/org/ldk/structs/BlindedPathCandidate.cs
new file mode 100644 (file)
index 0000000..e0393bf
--- /dev/null
@@ -0,0 +1,37 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A [`CandidateRouteHop::Blinded`] entry.
+ */
+public class BlindedPathCandidate : CommonBase {
+       internal BlindedPathCandidate(object _dummy, long ptr) : base(ptr) { }
+       ~BlindedPathCandidate() {
+               if (ptr != 0) { bindings.BlindedPathCandidate_free(ptr); }
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.BlindedPathCandidate_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the BlindedPathCandidate
+        */
+       public BlindedPathCandidate clone() {
+               long ret = bindings.BlindedPathCandidate_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.BlindedPathCandidate ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.BlindedPathCandidate(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index b1e77cc44f480685e04c74e93e9e431713093f7a..7b649b24cb78b48035faf3c7b088c74a0e847012 100644 (file)
@@ -50,6 +50,18 @@ public class Bolt11InvoiceFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Bolt11InvoiceFeatures.
+        */
+       public long hash() {
+               long ret = bindings.Bolt11InvoiceFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
index 517d44ae3bcf16e677e1ce5dfe4a5aba3ba50dc8..98b72e127b5b53f53b83ffd9f8ee16a26e5abd14 100644 (file)
@@ -50,6 +50,18 @@ public class Bolt12InvoiceFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Bolt12InvoiceFeatures.
+        */
+       public long hash() {
+               long ret = bindings.Bolt12InvoiceFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
index 67c238a28ba52491c867304daa9ad0606ddbb425..2ce07039c9152beb1f228e677b2a3355d2f9da92 100644 (file)
@@ -22,7 +22,7 @@ public interface BroadcasterInterfaceInterface {
         * be sure to manage both cases correctly.
         * 
         * Bitcoin transaction packages are defined in BIP 331 and here:
-        * https://github.com/bitcoin/bitcoin/blob/master/doc/policy/packages.md
+        * <https://github.com/bitcoin/bitcoin/blob/master/doc/policy/packages.md>
         */
        void broadcast_transactions(byte[][] txs);
 }
@@ -83,7 +83,7 @@ public class BroadcasterInterface : CommonBase {
         * be sure to manage both cases correctly.
         * 
         * Bitcoin transaction packages are defined in BIP 331 and here:
-        * https://github.com/bitcoin/bitcoin/blob/master/doc/policy/packages.md
+        * <https://github.com/bitcoin/bitcoin/blob/master/doc/policy/packages.md>
         */
        public void broadcast_transactions(byte[][] txs) {
                bindings.BroadcasterInterface_broadcast_transactions(this.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(txs, txs_conv_8 => InternalUtils.encodeUint8Array(txs_conv_8))));
diff --git a/c_sharp/src/org/ldk/structs/CandidateRouteHop.cs b/c_sharp/src/org/ldk/structs/CandidateRouteHop.cs
new file mode 100644 (file)
index 0000000..39a5020
--- /dev/null
@@ -0,0 +1,255 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * A wrapper around the various hop representations.
+ * 
+ * Can be used to examine the properties of a hop,
+ * potentially to decide whether to include it in a route.
+ */
+public class CandidateRouteHop : CommonBase {
+       protected CandidateRouteHop(object _dummy, long ptr) : base(ptr) { }
+       ~CandidateRouteHop() {
+               if (ptr != 0) { bindings.CandidateRouteHop_free(ptr); }
+       }
+
+       internal static CandidateRouteHop constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKCandidateRouteHop_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new CandidateRouteHop_FirstHop(ptr);
+                       case 1: return new CandidateRouteHop_PublicHop(ptr);
+                       case 2: return new CandidateRouteHop_PrivateHop(ptr);
+                       case 3: return new CandidateRouteHop_Blinded(ptr);
+                       case 4: return new CandidateRouteHop_OneHopBlinded(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A CandidateRouteHop of type FirstHop */
+       public class CandidateRouteHop_FirstHop : CandidateRouteHop {
+               public FirstHopCandidate first_hop;
+               internal CandidateRouteHop_FirstHop(long ptr) : base(null, ptr) {
+                       long first_hop = bindings.LDKCandidateRouteHop_FirstHop_get_first_hop(ptr);
+                       org.ldk.structs.FirstHopCandidate first_hop_hu_conv = null; if (first_hop < 0 || first_hop > 4096) { first_hop_hu_conv = new org.ldk.structs.FirstHopCandidate(null, first_hop); }
+                       if (first_hop_hu_conv != null) { first_hop_hu_conv.ptrs_to.AddLast(this); };
+                       this.first_hop = first_hop_hu_conv;
+               }
+       }
+       /** A CandidateRouteHop of type PublicHop */
+       public class CandidateRouteHop_PublicHop : CandidateRouteHop {
+               public PublicHopCandidate public_hop;
+               internal CandidateRouteHop_PublicHop(long ptr) : base(null, ptr) {
+                       long public_hop = bindings.LDKCandidateRouteHop_PublicHop_get_public_hop(ptr);
+                       org.ldk.structs.PublicHopCandidate public_hop_hu_conv = null; if (public_hop < 0 || public_hop > 4096) { public_hop_hu_conv = new org.ldk.structs.PublicHopCandidate(null, public_hop); }
+                       if (public_hop_hu_conv != null) { public_hop_hu_conv.ptrs_to.AddLast(this); };
+                       this.public_hop = public_hop_hu_conv;
+               }
+       }
+       /** A CandidateRouteHop of type PrivateHop */
+       public class CandidateRouteHop_PrivateHop : CandidateRouteHop {
+               public PrivateHopCandidate private_hop;
+               internal CandidateRouteHop_PrivateHop(long ptr) : base(null, ptr) {
+                       long private_hop = bindings.LDKCandidateRouteHop_PrivateHop_get_private_hop(ptr);
+                       org.ldk.structs.PrivateHopCandidate private_hop_hu_conv = null; if (private_hop < 0 || private_hop > 4096) { private_hop_hu_conv = new org.ldk.structs.PrivateHopCandidate(null, private_hop); }
+                       if (private_hop_hu_conv != null) { private_hop_hu_conv.ptrs_to.AddLast(this); };
+                       this.private_hop = private_hop_hu_conv;
+               }
+       }
+       /** A CandidateRouteHop of type Blinded */
+       public class CandidateRouteHop_Blinded : CandidateRouteHop {
+               public BlindedPathCandidate blinded;
+               internal CandidateRouteHop_Blinded(long ptr) : base(null, ptr) {
+                       long blinded = bindings.LDKCandidateRouteHop_Blinded_get_blinded(ptr);
+                       org.ldk.structs.BlindedPathCandidate blinded_hu_conv = null; if (blinded < 0 || blinded > 4096) { blinded_hu_conv = new org.ldk.structs.BlindedPathCandidate(null, blinded); }
+                       if (blinded_hu_conv != null) { blinded_hu_conv.ptrs_to.AddLast(this); };
+                       this.blinded = blinded_hu_conv;
+               }
+       }
+       /** A CandidateRouteHop of type OneHopBlinded */
+       public class CandidateRouteHop_OneHopBlinded : CandidateRouteHop {
+               public OneHopBlindedPathCandidate one_hop_blinded;
+               internal CandidateRouteHop_OneHopBlinded(long ptr) : base(null, ptr) {
+                       long one_hop_blinded = bindings.LDKCandidateRouteHop_OneHopBlinded_get_one_hop_blinded(ptr);
+                       org.ldk.structs.OneHopBlindedPathCandidate one_hop_blinded_hu_conv = null; if (one_hop_blinded < 0 || one_hop_blinded > 4096) { one_hop_blinded_hu_conv = new org.ldk.structs.OneHopBlindedPathCandidate(null, one_hop_blinded); }
+                       if (one_hop_blinded_hu_conv != null) { one_hop_blinded_hu_conv.ptrs_to.AddLast(this); };
+                       this.one_hop_blinded = one_hop_blinded_hu_conv;
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.CandidateRouteHop_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the CandidateRouteHop
+        */
+       public CandidateRouteHop clone() {
+               long ret = bindings.CandidateRouteHop_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.CandidateRouteHop ret_hu_conv = org.ldk.structs.CandidateRouteHop.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new FirstHop-variant CandidateRouteHop
+        */
+       public static CandidateRouteHop first_hop(org.ldk.structs.FirstHopCandidate a) {
+               long ret = bindings.CandidateRouteHop_first_hop(a == null ? 0 : a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.CandidateRouteHop ret_hu_conv = org.ldk.structs.CandidateRouteHop.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(a); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new PublicHop-variant CandidateRouteHop
+        */
+       public static CandidateRouteHop public_hop(org.ldk.structs.PublicHopCandidate a) {
+               long ret = bindings.CandidateRouteHop_public_hop(a == null ? 0 : a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.CandidateRouteHop ret_hu_conv = org.ldk.structs.CandidateRouteHop.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(a); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new PrivateHop-variant CandidateRouteHop
+        */
+       public static CandidateRouteHop private_hop(org.ldk.structs.PrivateHopCandidate a) {
+               long ret = bindings.CandidateRouteHop_private_hop(a == null ? 0 : a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.CandidateRouteHop ret_hu_conv = org.ldk.structs.CandidateRouteHop.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(a); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new Blinded-variant CandidateRouteHop
+        */
+       public static CandidateRouteHop blinded(org.ldk.structs.BlindedPathCandidate a) {
+               long ret = bindings.CandidateRouteHop_blinded(a == null ? 0 : a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.CandidateRouteHop ret_hu_conv = org.ldk.structs.CandidateRouteHop.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(a); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new OneHopBlinded-variant CandidateRouteHop
+        */
+       public static CandidateRouteHop one_hop_blinded(org.ldk.structs.OneHopBlindedPathCandidate a) {
+               long ret = bindings.CandidateRouteHop_one_hop_blinded(a == null ? 0 : a.ptr);
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.CandidateRouteHop ret_hu_conv = org.ldk.structs.CandidateRouteHop.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(a); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Returns the globally unique short channel ID for this hop, if one is known.
+        * 
+        * This only returns `Some` if the channel is public (either our own, or one we've learned
+        * from the public network graph), and thus the short channel ID we have for this channel is
+        * globally unique and identifies this channel in a global namespace.
+        */
+       public Option_u64Z globally_unique_short_channel_id() {
+               long ret = bindings.CandidateRouteHop_globally_unique_short_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_u64Z ret_hu_conv = org.ldk.structs.Option_u64Z.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Returns the required difference in HTLC CLTV expiry between the [`Self::source`] and the
+        * next-hop for an HTLC taking this hop.
+        * 
+        * This is the time that the node(s) in this hop have to claim the HTLC on-chain if the
+        * next-hop goes on chain with a payment preimage.
+        */
+       public int cltv_expiry_delta() {
+               int ret = bindings.CandidateRouteHop_cltv_expiry_delta(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Returns the minimum amount that can be sent over this hop, in millisatoshis.
+        */
+       public long htlc_minimum_msat() {
+               long ret = bindings.CandidateRouteHop_htlc_minimum_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Returns the fees that must be paid to route an HTLC over this channel.
+        */
+       public RoutingFees fees() {
+               long ret = bindings.CandidateRouteHop_fees(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RoutingFees ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RoutingFees(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Returns the source node id of current hop.
+        * 
+        * Source node id refers to the node forwarding the HTLC through this hop.
+        * 
+        * For [`Self::FirstHop`] we return payer's node id.
+        */
+       public NodeId source() {
+               long ret = bindings.CandidateRouteHop_source(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.NodeId ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.NodeId(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Returns the target node id of this hop, if known.
+        * 
+        * Target node id refers to the node receiving the HTLC after this hop.
+        * 
+        * For [`Self::Blinded`] we return `None` because the ultimate destination after the blinded
+        * path is unknown.
+        * 
+        * For [`Self::OneHopBlinded`] we return `None` because the target is the same as the source,
+        * and such a return value would be somewhat nonsensical.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public NodeId target() {
+               long ret = bindings.CandidateRouteHop_target(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.NodeId ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.NodeId(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 1f8c8593fabee59ccce832494e883ef17d411607..3368212335f483b05740c6e03fa607b997fa8d9b 100644 (file)
@@ -154,6 +154,18 @@ public class ChannelAnnouncement : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelAnnouncement.
+        */
+       public long hash() {
+               long ret = bindings.ChannelAnnouncement_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ChannelAnnouncements contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index da4589dcc5ce4bf3f6dba7d12bffee0242e9b322..9f86419ebf63d8190266b52e403873097d98f4f1 100644 (file)
@@ -270,7 +270,9 @@ public class ChannelConfig : CommonBase {
         * - The counterparty will get an [`HTLCIntercepted`] event upon payment forward, and call
         * [`forward_intercepted_htlc`] with less than the amount provided in
         * [`HTLCIntercepted::expected_outbound_amount_msat`]. The difference between the expected and
-        * actual forward amounts is their fee.
+        * actual forward amounts is their fee. See
+        * <https://github.com/BitcoinAndLightningLayerSpecs/lsp/tree/main/LSPS2#flow-lsp-trusts-client-model>
+        * for how this feature may be used in the LSP use case.
         * 
         * # Note
         * It's important for payee wallet software to verify that [`PaymentClaimable::amount_msat`] is
@@ -307,7 +309,9 @@ public class ChannelConfig : CommonBase {
         * - The counterparty will get an [`HTLCIntercepted`] event upon payment forward, and call
         * [`forward_intercepted_htlc`] with less than the amount provided in
         * [`HTLCIntercepted::expected_outbound_amount_msat`]. The difference between the expected and
-        * actual forward amounts is their fee.
+        * actual forward amounts is their fee. See
+        * <https://github.com/BitcoinAndLightningLayerSpecs/lsp/tree/main/LSPS2#flow-lsp-trusts-client-model>
+        * for how this feature may be used in the LSP use case.
         * 
         * # Note
         * It's important for payee wallet software to verify that [`PaymentClaimable::amount_msat`] is
index f598bab76d9398edd6842f3b26d12f995874465d..d6e08e340c5ac15528c7624a28c6caa6867cfd3b 100644 (file)
@@ -50,6 +50,18 @@ public class ChannelFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelFeatures.
+        */
+       public long hash() {
+               long ret = bindings.ChannelFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
index b11bebee3fb1014e6736880f93b159e4c8a4fab6..567fbd56b4cee9450a455ba53a0d42dc8f109b75 100644 (file)
@@ -148,6 +148,9 @@ public class ChannelManager : CommonBase {
         * connection is available, the outbound `open_channel` message may fail to send, resulting in
         * the channel eventually being silently forgotten (dropped on reload).
         * 
+        * If `temporary_channel_id` is specified, it will be used as the temporary channel ID of the
+        * channel. Otherwise, a random one will be generated for you.
+        * 
         * Returns the new Channel's temporary `channel_id`. This ID will appear as
         * [`Event::FundingGenerationReady::temporary_channel_id`] and in
         * [`ChannelDetails::channel_id`] until after
@@ -161,16 +164,18 @@ public class ChannelManager : CommonBase {
         * 
         * Note that override_config (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public Result_ThirtyTwoBytesAPIErrorZ create_channel(byte[] their_network_key, long channel_value_satoshis, long push_msat, org.ldk.util.UInt128 user_channel_id, org.ldk.structs.UserConfig override_config) {
-               long ret = bindings.ChannelManager_create_channel(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_network_key, 33)), channel_value_satoshis, push_msat, InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()), override_config == null ? 0 : override_config.ptr);
+       public Result_ThirtyTwoBytesAPIErrorZ create_channel(byte[] their_network_key, long channel_value_satoshis, long push_msat, org.ldk.util.UInt128 user_channel_id, org.ldk.structs.Option_ThirtyTwoBytesZ temporary_channel_id, org.ldk.structs.UserConfig override_config) {
+               long ret = bindings.ChannelManager_create_channel(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_network_key, 33)), channel_value_satoshis, push_msat, InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()), temporary_channel_id.ptr, override_config == null ? 0 : override_config.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(their_network_key);
                GC.KeepAlive(channel_value_satoshis);
                GC.KeepAlive(push_msat);
                GC.KeepAlive(user_channel_id);
+               GC.KeepAlive(temporary_channel_id);
                GC.KeepAlive(override_config);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ThirtyTwoBytesAPIErrorZ ret_hu_conv = Result_ThirtyTwoBytesAPIErrorZ.constr_from_ptr(ret);
+               if (this != null) { this.ptrs_to.AddLast(temporary_channel_id); };
                if (this != null) { this.ptrs_to.AddLast(override_config); };
                return ret_hu_conv;
        }
@@ -688,7 +693,7 @@ public class ChannelManager : CommonBase {
         * Return values are identical to [`Self::funding_transaction_generated`], respective to
         * each individual channel and transaction output.
         * 
-        * Do NOT broadcast the funding transaction yourself. This batch funding transcaction
+        * Do NOT broadcast the funding transaction yourself. This batch funding transaction
         * will only be broadcast when we have safely received and persisted the counterparty's
         * signature for each channel.
         * 
@@ -1066,8 +1071,11 @@ public class ChannelManager : CommonBase {
         * 
         * # Errors
         * 
-        * Errors if a duplicate `payment_id` is provided given the caveats in the aforementioned link
-        * or if the provided parameters are invalid for the offer.
+        * Errors if:
+        * - a duplicate `payment_id` is provided given the caveats in the aforementioned link,
+        * - the provided parameters are invalid for the offer,
+        * - the parameterized [`Router`] is unable to create a blinded reply path for the invoice
+        * request.
         * 
         * [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
         * [`InvoiceRequest::quantity`]: crate::offers::invoice_request::InvoiceRequest::quantity
@@ -1113,6 +1121,11 @@ public class ChannelManager : CommonBase {
         * node meeting the aforementioned criteria, but there's no guarantee that they will be
         * received and no retries will be made.
         * 
+        * # Errors
+        * 
+        * Errors if the parameterized [`Router`] is unable to create a blinded payment path or reply
+        * path for the invoice.
+        * 
         * [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
         */
        public Result_NoneBolt12SemanticErrorZ request_refund_payment(org.ldk.structs.Refund refund) {
index ad7d0e377d15f856d5ed196ac6dd938eee0c6d20..dcd8c559927f304a1520f3e5444543f751a8b419 100644 (file)
@@ -37,6 +37,18 @@ public interface ChannelMessageHandlerInterface {
        /**Handle an incoming `closing_signed` message from the given peer.
         */
        void handle_closing_signed(byte[] their_node_id, ClosingSigned msg);
+       /**Handle an incoming `stfu` message from the given peer.
+        */
+       void handle_stfu(byte[] their_node_id, Stfu msg);
+       /**Handle an incoming `splice` message from the given peer.
+        */
+       void handle_splice(byte[] their_node_id, Splice msg);
+       /**Handle an incoming `splice_ack` message from the given peer.
+        */
+       void handle_splice_ack(byte[] their_node_id, SpliceAck msg);
+       /**Handle an incoming `splice_locked` message from the given peer.
+        */
+       void handle_splice_locked(byte[] their_node_id, SpliceLocked msg);
        /**Handle an incoming `tx_add_input message` from the given peer.
         */
        void handle_tx_add_input(byte[] their_node_id, TxAddInput msg);
@@ -201,6 +213,30 @@ public class ChannelMessageHandler : CommonBase {
                        arg.handle_closing_signed(_their_node_id_conv, _msg_hu_conv);
                                GC.KeepAlive(arg);
                }
+               public void handle_stfu(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       org.ldk.structs.Stfu _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.Stfu(null, _msg); }
+                       arg.handle_stfu(_their_node_id_conv, _msg_hu_conv);
+                               GC.KeepAlive(arg);
+               }
+               public void handle_splice(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       org.ldk.structs.Splice _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.Splice(null, _msg); }
+                       arg.handle_splice(_their_node_id_conv, _msg_hu_conv);
+                               GC.KeepAlive(arg);
+               }
+               public void handle_splice_ack(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       org.ldk.structs.SpliceAck _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.SpliceAck(null, _msg); }
+                       arg.handle_splice_ack(_their_node_id_conv, _msg_hu_conv);
+                               GC.KeepAlive(arg);
+               }
+               public void handle_splice_locked(long _their_node_id, long _msg) {
+                       byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
+                       org.ldk.structs.SpliceLocked _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.SpliceLocked(null, _msg); }
+                       arg.handle_splice_locked(_their_node_id_conv, _msg_hu_conv);
+                               GC.KeepAlive(arg);
+               }
                public void handle_tx_add_input(long _their_node_id, long _msg) {
                        byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id);
                        org.ldk.structs.TxAddInput _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.TxAddInput(null, _msg); }
@@ -469,6 +505,50 @@ public class ChannelMessageHandler : CommonBase {
                if (this != null) { this.ptrs_to.AddLast(msg); };
        }
 
+       /**
+        * Handle an incoming `stfu` message from the given peer.
+        */
+       public void handle_stfu(byte[] their_node_id, org.ldk.structs.Stfu msg) {
+               bindings.ChannelMessageHandler_handle_stfu(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(their_node_id);
+               GC.KeepAlive(msg);
+               if (this != null) { this.ptrs_to.AddLast(msg); };
+       }
+
+       /**
+        * Handle an incoming `splice` message from the given peer.
+        */
+       public void handle_splice(byte[] their_node_id, org.ldk.structs.Splice msg) {
+               bindings.ChannelMessageHandler_handle_splice(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(their_node_id);
+               GC.KeepAlive(msg);
+               if (this != null) { this.ptrs_to.AddLast(msg); };
+       }
+
+       /**
+        * Handle an incoming `splice_ack` message from the given peer.
+        */
+       public void handle_splice_ack(byte[] their_node_id, org.ldk.structs.SpliceAck msg) {
+               bindings.ChannelMessageHandler_handle_splice_ack(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(their_node_id);
+               GC.KeepAlive(msg);
+               if (this != null) { this.ptrs_to.AddLast(msg); };
+       }
+
+       /**
+        * Handle an incoming `splice_locked` message from the given peer.
+        */
+       public void handle_splice_locked(byte[] their_node_id, org.ldk.structs.SpliceLocked msg) {
+               bindings.ChannelMessageHandler_handle_splice_locked(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(their_node_id);
+               GC.KeepAlive(msg);
+               if (this != null) { this.ptrs_to.AddLast(msg); };
+       }
+
        /**
         * Handle an incoming `tx_add_input message` from the given peer.
         */
index a435ba6a8f6e3c94b603ed483081e40a90b4ff83..f16d4fd3f07589935f5a16c40a183f0f97b63f1d 100644 (file)
@@ -123,11 +123,13 @@ public class ChannelMonitor : CommonBase {
         * calling `chain::Filter::register_output` and `chain::Filter::register_tx` until all outputs
         * have been registered.
         */
-       public void load_outputs_to_watch(org.ldk.structs.Filter filter) {
-               bindings.ChannelMonitor_load_outputs_to_watch(this.ptr, filter.ptr);
+       public void load_outputs_to_watch(org.ldk.structs.Filter filter, org.ldk.structs.Logger logger) {
+               bindings.ChannelMonitor_load_outputs_to_watch(this.ptr, filter.ptr, logger.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(filter);
+               GC.KeepAlive(logger);
                if (this != null) { this.ptrs_to.AddLast(filter); };
+               if (this != null) { this.ptrs_to.AddLast(logger); };
        }
 
        /**
@@ -253,7 +255,7 @@ public class ChannelMonitor : CommonBase {
         * to the commitment transaction being revoked, this will return a signed transaction, but
         * the signature will not be valid.
         * 
-        * [`EcdsaChannelSigner::sign_justice_revoked_output`]: crate::sign::EcdsaChannelSigner::sign_justice_revoked_output
+        * [`EcdsaChannelSigner::sign_justice_revoked_output`]: crate::sign::ecdsa::EcdsaChannelSigner::sign_justice_revoked_output
         * [`Persist`]: crate::chain::chainmonitor::Persist
         */
        public Result_TransactionNoneZ sign_to_local_justice_tx(byte[] justice_tx, long input_idx, long value, long commitment_number) {
@@ -462,20 +464,20 @@ public class ChannelMonitor : CommonBase {
        /**
         * Returns the set of txids that should be monitored for re-organization out of the chain.
         */
-       public TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] get_relevant_txids() {
+       public ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[] get_relevant_txids() {
                long ret = bindings.ChannelMonitor_get_relevant_txids(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               int ret_conv_49_len = InternalUtils.getArrayLength(ret);
-               TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] ret_conv_49_arr = new TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[ret_conv_49_len];
-               for (int x = 0; x < ret_conv_49_len; x++) {
-                       long ret_conv_49 = InternalUtils.getU64ArrayElem(ret, x);
-                       TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ ret_conv_49_hu_conv = new TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ(null, ret_conv_49);
-                       if (ret_conv_49_hu_conv != null) { ret_conv_49_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_49_arr[x] = ret_conv_49_hu_conv;
+               int ret_conv_54_len = InternalUtils.getArrayLength(ret);
+               ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[] ret_conv_54_arr = new ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[ret_conv_54_len];
+               for (int c = 0; c < ret_conv_54_len; c++) {
+                       long ret_conv_54 = InternalUtils.getU64ArrayElem(ret, c);
+                       ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ ret_conv_54_hu_conv = new ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ(null, ret_conv_54);
+                       if (ret_conv_54_hu_conv != null) { ret_conv_54_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_54_arr[c] = ret_conv_54_hu_conv;
                }
                bindings.free_buffer(ret);
-               return ret_conv_49_arr;
+               return ret_conv_54_arr;
        }
 
        /**
index 347c8cf13781dfd9f6bdd6d3cdbad146003b7138..43b596e409d27da34e2766cf38da9943264a9f3c 100644 (file)
@@ -43,12 +43,13 @@ public class ChannelPublicKeys : CommonBase {
         * counterparty to create a secret which the counterparty can reveal to revoke previous
         * states.
         */
-       public byte[] get_revocation_basepoint() {
+       public RevocationBasepoint get_revocation_basepoint() {
                long ret = bindings.ChannelPublicKeys_get_revocation_basepoint(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.RevocationBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
@@ -57,10 +58,11 @@ public class ChannelPublicKeys : CommonBase {
         * counterparty to create a secret which the counterparty can reveal to revoke previous
         * states.
         */
-       public void set_revocation_basepoint(byte[] val) {
-               bindings.ChannelPublicKeys_set_revocation_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_revocation_basepoint(org.ldk.structs.RevocationBasepoint val) {
+               bindings.ChannelPublicKeys_set_revocation_basepoint(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
@@ -92,12 +94,13 @@ public class ChannelPublicKeys : CommonBase {
         * public key which receives non-HTLC-encumbered funds which are only available for spending
         * after some delay (or can be claimed via the revocation path).
         */
-       public byte[] get_delayed_payment_basepoint() {
+       public DelayedPaymentBasepoint get_delayed_payment_basepoint() {
                long ret = bindings.ChannelPublicKeys_get_delayed_payment_basepoint(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.DelayedPaymentBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
@@ -105,39 +108,42 @@ public class ChannelPublicKeys : CommonBase {
         * public key which receives non-HTLC-encumbered funds which are only available for spending
         * after some delay (or can be claimed via the revocation path).
         */
-       public void set_delayed_payment_basepoint(byte[] val) {
-               bindings.ChannelPublicKeys_set_delayed_payment_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_delayed_payment_basepoint(org.ldk.structs.DelayedPaymentBasepoint val) {
+               bindings.ChannelPublicKeys_set_delayed_payment_basepoint(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
         * The base point which is used (with derive_public_key) to derive a per-commitment public key
         * which is used to encumber HTLC-in-flight outputs.
         */
-       public byte[] get_htlc_basepoint() {
+       public HtlcBasepoint get_htlc_basepoint() {
                long ret = bindings.ChannelPublicKeys_get_htlc_basepoint(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.HtlcBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
         * The base point which is used (with derive_public_key) to derive a per-commitment public key
         * which is used to encumber HTLC-in-flight outputs.
         */
-       public void set_htlc_basepoint(byte[] val) {
-               bindings.ChannelPublicKeys_set_htlc_basepoint(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_htlc_basepoint(org.ldk.structs.HtlcBasepoint val) {
+               bindings.ChannelPublicKeys_set_htlc_basepoint(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
         * Constructs a new ChannelPublicKeys given each field
         */
-       public static ChannelPublicKeys of(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(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_pubkey_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(revocation_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_point_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(delayed_payment_basepoint_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(htlc_basepoint_arg, 33)));
+       public static ChannelPublicKeys of(byte[] funding_pubkey_arg, org.ldk.structs.RevocationBasepoint revocation_basepoint_arg, byte[] payment_point_arg, org.ldk.structs.DelayedPaymentBasepoint delayed_payment_basepoint_arg, org.ldk.structs.HtlcBasepoint htlc_basepoint_arg) {
+               long ret = bindings.ChannelPublicKeys_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_pubkey_arg, 33)), revocation_basepoint_arg == null ? 0 : revocation_basepoint_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_point_arg, 33)), delayed_payment_basepoint_arg == null ? 0 : delayed_payment_basepoint_arg.ptr, htlc_basepoint_arg == null ? 0 : htlc_basepoint_arg.ptr);
                GC.KeepAlive(funding_pubkey_arg);
                GC.KeepAlive(revocation_basepoint_arg);
                GC.KeepAlive(payment_point_arg);
@@ -146,6 +152,9 @@ public class ChannelPublicKeys : CommonBase {
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.ChannelPublicKeys ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ChannelPublicKeys(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(revocation_basepoint_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(delayed_payment_basepoint_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(htlc_basepoint_arg); };
                return ret_hu_conv;
        }
 
index dca74b7536cf1017caab71d943540a8c90a41fec..358001a7442896ed0d7b96c80dea2fd2fc8954a1 100644 (file)
@@ -118,6 +118,18 @@ public class ChannelReady : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelReady.
+        */
+       public long hash() {
+               long ret = bindings.ChannelReady_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ChannelReadys contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index b070cceb1eff6e306e6d8be49d2ae48435fa2343..5d3bd2235f1ad755aba96546b6ea360f25170841 100644 (file)
@@ -173,6 +173,18 @@ public class ChannelReestablish : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelReestablish.
+        */
+       public long hash() {
+               long ret = bindings.ChannelReestablish_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ChannelReestablishs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index e3ab4bdef0f8350c1dc7a367e034447aa91b5a63..66e4cd68366e982dbcedb92f05b92e664f244a5e 100644 (file)
@@ -32,14 +32,20 @@ public interface ChannelSignerInterface {
         * Policy checks should be implemented in this function, including checking the amount
         * sent to us and checking the HTLCs.
         * 
-        * The preimages of outgoing HTLCs that were fulfilled since the last commitment are provided.
+        * The preimages of outbound HTLCs that were fulfilled since the last commitment are provided.
         * A validating signer should ensure that an HTLC output is removed only when the matching
         * preimage is provided, or when the value to holder is restored.
         * 
         * Note that all the relevant preimages will be provided, but there may also be additional
         * irrelevant or duplicate preimages.
         */
-       Result_NoneNoneZ validate_holder_commitment(HolderCommitmentTransaction holder_tx, byte[][] preimages);
+       Result_NoneNoneZ validate_holder_commitment(HolderCommitmentTransaction holder_tx, byte[][] outbound_htlc_preimages);
+       /**Validate the counterparty's revocation.
+        * 
+        * This is required in order for the signer to make sure that the state has moved
+        * forward and it is safe to sign the next counterparty commitment.
+        */
+       Result_NoneNoneZ validate_counterparty_revocation(long idx, byte[] secret);
        /**Returns an arbitrary identifier describing the set of keys which are provided back to you in
         * some [`SpendableOutputDescriptor`] types. This should be sufficient to identify this
         * [`EcdsaChannelSigner`] object uniquely and lookup or re-derive its keys.
@@ -88,17 +94,24 @@ public class ChannelSigner : CommonBase {
                        long result = InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(ret, 32));
                        return result;
                }
-               public long validate_holder_commitment(long _holder_tx, long _preimages) {
+               public long validate_holder_commitment(long _holder_tx, long _outbound_htlc_preimages) {
                        org.ldk.structs.HolderCommitmentTransaction _holder_tx_hu_conv = null; if (_holder_tx < 0 || _holder_tx > 4096) { _holder_tx_hu_conv = new org.ldk.structs.HolderCommitmentTransaction(null, _holder_tx); }
-                       int _preimages_conv_8_len = InternalUtils.getArrayLength(_preimages);
-                       byte[][] _preimages_conv_8_arr = new byte[_preimages_conv_8_len][];
-                       for (int i = 0; i < _preimages_conv_8_len; i++) {
-                               long _preimages_conv_8 = InternalUtils.getU64ArrayElem(_preimages, i);
-                               byte[] _preimages_conv_8_conv = InternalUtils.decodeUint8Array(_preimages_conv_8);
-                               _preimages_conv_8_arr[i] = _preimages_conv_8_conv;
+                       int _outbound_htlc_preimages_conv_8_len = InternalUtils.getArrayLength(_outbound_htlc_preimages);
+                       byte[][] _outbound_htlc_preimages_conv_8_arr = new byte[_outbound_htlc_preimages_conv_8_len][];
+                       for (int i = 0; i < _outbound_htlc_preimages_conv_8_len; i++) {
+                               long _outbound_htlc_preimages_conv_8 = InternalUtils.getU64ArrayElem(_outbound_htlc_preimages, i);
+                               byte[] _outbound_htlc_preimages_conv_8_conv = InternalUtils.decodeUint8Array(_outbound_htlc_preimages_conv_8);
+                               _outbound_htlc_preimages_conv_8_arr[i] = _outbound_htlc_preimages_conv_8_conv;
                        }
-                       bindings.free_buffer(_preimages);
-                       Result_NoneNoneZ ret = arg.validate_holder_commitment(_holder_tx_hu_conv, _preimages_conv_8_arr);
+                       bindings.free_buffer(_outbound_htlc_preimages);
+                       Result_NoneNoneZ ret = arg.validate_holder_commitment(_holder_tx_hu_conv, _outbound_htlc_preimages_conv_8_arr);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
+               public long validate_counterparty_revocation(long _idx, long _secret) {
+                       byte[] _secret_conv = InternalUtils.decodeUint8Array(_secret);
+                       Result_NoneNoneZ ret = arg.validate_counterparty_revocation(_idx, _secret_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -169,24 +182,40 @@ public class ChannelSigner : CommonBase {
         * Policy checks should be implemented in this function, including checking the amount
         * sent to us and checking the HTLCs.
         * 
-        * The preimages of outgoing HTLCs that were fulfilled since the last commitment are provided.
+        * The preimages of outbound HTLCs that were fulfilled since the last commitment are provided.
         * A validating signer should ensure that an HTLC output is removed only when the matching
         * preimage is provided, or when the value to holder is restored.
         * 
         * Note that all the relevant preimages will be provided, but there may also be additional
         * irrelevant or duplicate preimages.
         */
-       public Result_NoneNoneZ validate_holder_commitment(org.ldk.structs.HolderCommitmentTransaction holder_tx, byte[][] preimages) {
-               long ret = bindings.ChannelSigner_validate_holder_commitment(this.ptr, holder_tx == null ? 0 : holder_tx.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(preimages, preimages_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(preimages_conv_8, 32)))));
+       public Result_NoneNoneZ validate_holder_commitment(org.ldk.structs.HolderCommitmentTransaction holder_tx, byte[][] outbound_htlc_preimages) {
+               long ret = bindings.ChannelSigner_validate_holder_commitment(this.ptr, holder_tx == null ? 0 : holder_tx.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(outbound_htlc_preimages, outbound_htlc_preimages_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(outbound_htlc_preimages_conv_8, 32)))));
                GC.KeepAlive(this);
                GC.KeepAlive(holder_tx);
-               GC.KeepAlive(preimages);
+               GC.KeepAlive(outbound_htlc_preimages);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(holder_tx); };
                return ret_hu_conv;
        }
 
+       /**
+        * Validate the counterparty's revocation.
+        * 
+        * This is required in order for the signer to make sure that the state has moved
+        * forward and it is safe to sign the next counterparty commitment.
+        */
+       public Result_NoneNoneZ validate_counterparty_revocation(long idx, byte[] secret) {
+               long ret = bindings.ChannelSigner_validate_counterparty_revocation(this.ptr, idx, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(secret, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(idx);
+               GC.KeepAlive(secret);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
        /**
         * Returns an arbitrary identifier describing the set of keys which are provided back to you in
         * some [`SpendableOutputDescriptor`] types. This should be sufficient to identify this
index b575a7fd1331bb1f98739af9af23ba7cac2ea992..4bd502d5d817a8c05a3bb3e9ad1178e0869f7f80 100644 (file)
@@ -59,6 +59,18 @@ public class ChannelTypeFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelTypeFeatures.
+        */
+       public long hash() {
+               long ret = bindings.ChannelTypeFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
index 8bde69b461c675fd612744ad8fc30fa11f9ed1b8..8d47ee1c1db1ca449af5b66f42af7321f54135db 100644 (file)
@@ -91,6 +91,18 @@ public class ChannelUpdate : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ChannelUpdate.
+        */
+       public long hash() {
+               long ret = bindings.ChannelUpdate_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ChannelUpdates contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 08063f2038620559d1bb4ae5188d6245476d1c05..0b64dad17d276a40f8edbfce0eee2cb63f3c23c3 100644 (file)
@@ -115,15 +115,40 @@ public class ClaimedHTLC : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * The extra fee our counterparty skimmed off the top of this HTLC, if any.
+        * 
+        * This value will always be 0 for [`ClaimedHTLC`]s serialized with LDK versions prior to
+        * 0.0.119.
+        */
+       public long get_counterparty_skimmed_fee_msat() {
+               long ret = bindings.ClaimedHTLC_get_counterparty_skimmed_fee_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The extra fee our counterparty skimmed off the top of this HTLC, if any.
+        * 
+        * This value will always be 0 for [`ClaimedHTLC`]s serialized with LDK versions prior to
+        * 0.0.119.
+        */
+       public void set_counterparty_skimmed_fee_msat(long val) {
+               bindings.ClaimedHTLC_set_counterparty_skimmed_fee_msat(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
        /**
         * Constructs a new ClaimedHTLC given each field
         */
-       public static ClaimedHTLC of(byte[] channel_id_arg, org.ldk.util.UInt128 user_channel_id_arg, int cltv_expiry_arg, long value_msat_arg) {
-               long ret = bindings.ClaimedHTLC_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(user_channel_id_arg.getLEBytes()), cltv_expiry_arg, value_msat_arg);
+       public static ClaimedHTLC of(byte[] channel_id_arg, org.ldk.util.UInt128 user_channel_id_arg, int cltv_expiry_arg, long value_msat_arg, long counterparty_skimmed_fee_msat_arg) {
+               long ret = bindings.ClaimedHTLC_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(user_channel_id_arg.getLEBytes()), cltv_expiry_arg, value_msat_arg, counterparty_skimmed_fee_msat_arg);
                GC.KeepAlive(channel_id_arg);
                GC.KeepAlive(user_channel_id_arg);
                GC.KeepAlive(cltv_expiry_arg);
                GC.KeepAlive(value_msat_arg);
+               GC.KeepAlive(counterparty_skimmed_fee_msat_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.ClaimedHTLC ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.ClaimedHTLC(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
index 18f75ddc02bc078e9c77510e157cf03076e9f91d..08f6cac9e4124c5da06db4dc39604fb895ec0739 100644 (file)
@@ -139,6 +139,18 @@ public class ClosingSigned : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ClosingSigned.
+        */
+       public long hash() {
+               long ret = bindings.ClosingSigned_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ClosingSigneds contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 78dfa13cd4aa2006fae8ed07ad436fd50a2e41ed..72f5aee8d9a0cb9f4b7b627338a105a9145fb092 100644 (file)
@@ -89,6 +89,18 @@ public class ClosingSignedFeeRange : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ClosingSignedFeeRange.
+        */
+       public long hash() {
+               long ret = bindings.ClosingSignedFeeRange_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ClosingSignedFeeRanges contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 192231e49935ab77bddfb7dd08eb86a91de10243..0e7a74b0ec338ea3c9044b7fc913ac89e5a9e48d 100644 (file)
@@ -40,8 +40,11 @@ public interface CoinSelectionSourceInterface {
        Result_CoinSelectionNoneZ select_confirmed_utxos(byte[] claim_id, Input[] must_spend, TxOut[] must_pay_to, int target_feerate_sat_per_1000_weight);
        /**Signs and provides the full witness for all inputs within the transaction known to the
         * trait (i.e., any provided via [`CoinSelectionSource::select_confirmed_utxos`]).
+        * 
+        * If your wallet does not support signing PSBTs you can call `psbt.extract_tx()` to get the
+        * unsigned transaction and then sign it with your wallet.
         */
-       Result_TransactionNoneZ sign_tx(byte[] tx);
+       Result_TransactionNoneZ sign_psbt(byte[] psbt);
 }
 
 /**
@@ -88,9 +91,9 @@ public class CoinSelectionSource : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_tx(long _tx) {
-                       byte[] _tx_conv = InternalUtils.decodeUint8Array(_tx);
-                       Result_TransactionNoneZ ret = arg.sign_tx(_tx_conv);
+               public long sign_psbt(long _psbt) {
+                       byte[] _psbt_conv = InternalUtils.decodeUint8Array(_psbt);
+                       Result_TransactionNoneZ ret = arg.sign_psbt(_psbt_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -153,11 +156,14 @@ public class CoinSelectionSource : CommonBase {
        /**
         * Signs and provides the full witness for all inputs within the transaction known to the
         * trait (i.e., any provided via [`CoinSelectionSource::select_confirmed_utxos`]).
+        * 
+        * If your wallet does not support signing PSBTs you can call `psbt.extract_tx()` to get the
+        * unsigned transaction and then sign it with your wallet.
         */
-       public Result_TransactionNoneZ sign_tx(byte[] tx) {
-               long ret = bindings.CoinSelectionSource_sign_tx(this.ptr, InternalUtils.encodeUint8Array(tx));
+       public Result_TransactionNoneZ sign_psbt(byte[] psbt) {
+               long ret = bindings.CoinSelectionSource_sign_psbt(this.ptr, InternalUtils.encodeUint8Array(psbt));
                GC.KeepAlive(this);
-               GC.KeepAlive(tx);
+               GC.KeepAlive(psbt);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TransactionNoneZ ret_hu_conv = Result_TransactionNoneZ.constr_from_ptr(ret);
                return ret_hu_conv;
index adcfc649fb1defbca574f5203326a6fa0c1a1b1a..6b21710a0a3c1fb6a24ada0dfd14d599a1559d84 100644 (file)
@@ -118,6 +118,18 @@ public class CommitmentSigned : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the CommitmentSigned.
+        */
+       public long hash() {
+               long ret = bindings.CommitmentSigned_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two CommitmentSigneds contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 9ec94107ae401945da7677bc326f42c1fd692c5d..d14ed22ad6896fffe6bca6cec107be7eed646124 100644 (file)
@@ -223,6 +223,18 @@ public class CommitmentUpdate : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the CommitmentUpdate.
+        */
+       public long hash() {
+               long ret = bindings.CommitmentUpdate_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two CommitmentUpdates contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 01eae0baaaa3fc9312d2d4f09779b815ef299897..5d36fda7049f3d20a1193f542c65a33efe8989b0 100644 (file)
@@ -43,7 +43,7 @@ public interface ConfirmInterface {
         */
        void best_block_updated(byte[] header, int height);
        /**Returns transactions that must be monitored for reorganization out of the chain along
-        * with the hash of the block as part of which it had been previously confirmed.
+        * with the height and the hash of the block as part of which it had been previously confirmed.
         * 
         * Note that the returned `Option<BlockHash>` might be `None` for channels created with LDK
         * 0.0.112 and prior, in which case you need to manually track previous confirmations.
@@ -58,13 +58,13 @@ public interface ConfirmInterface {
         * given to [`transaction_unconfirmed`].
         * 
         * If any of the returned transactions are confirmed in a block other than the one with the
-        * given hash, they need to be unconfirmed and reconfirmed via [`transaction_unconfirmed`] and
-        * [`transactions_confirmed`], respectively.
+        * given hash at the given height, they need to be unconfirmed and reconfirmed via
+        * [`transaction_unconfirmed`] and [`transactions_confirmed`], respectively.
         * 
         * [`transactions_confirmed`]: Self::transactions_confirmed
         * [`transaction_unconfirmed`]: Self::transaction_unconfirmed
         */
-       TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] get_relevant_txids();
+       ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[] get_relevant_txids();
 }
 
 /**
@@ -144,9 +144,9 @@ public class Confirm : CommonBase {
                                GC.KeepAlive(arg);
                }
                public long get_relevant_txids() {
-                       TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] ret = arg.get_relevant_txids();
+                       ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[] ret = arg.get_relevant_txids();
                                GC.KeepAlive(arg);
-                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_49 => ret_conv_49 == null ? 0 : ret_conv_49.clone_ptr()));
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_54 => ret_conv_54 == null ? 0 : ret_conv_54.clone_ptr()));
                        return result;
                }
        }
@@ -218,7 +218,7 @@ public class Confirm : CommonBase {
 
        /**
         * Returns transactions that must be monitored for reorganization out of the chain along
-        * with the hash of the block as part of which it had been previously confirmed.
+        * with the height and the hash of the block as part of which it had been previously confirmed.
         * 
         * Note that the returned `Option<BlockHash>` might be `None` for channels created with LDK
         * 0.0.112 and prior, in which case you need to manually track previous confirmations.
@@ -233,26 +233,26 @@ public class Confirm : CommonBase {
         * given to [`transaction_unconfirmed`].
         * 
         * If any of the returned transactions are confirmed in a block other than the one with the
-        * given hash, they need to be unconfirmed and reconfirmed via [`transaction_unconfirmed`] and
-        * [`transactions_confirmed`], respectively.
+        * given hash at the given height, they need to be unconfirmed and reconfirmed via
+        * [`transaction_unconfirmed`] and [`transactions_confirmed`], respectively.
         * 
         * [`transactions_confirmed`]: Self::transactions_confirmed
         * [`transaction_unconfirmed`]: Self::transaction_unconfirmed
         */
-       public TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] get_relevant_txids() {
+       public ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[] get_relevant_txids() {
                long ret = bindings.Confirm_get_relevant_txids(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               int ret_conv_49_len = InternalUtils.getArrayLength(ret);
-               TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[] ret_conv_49_arr = new TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ[ret_conv_49_len];
-               for (int x = 0; x < ret_conv_49_len; x++) {
-                       long ret_conv_49 = InternalUtils.getU64ArrayElem(ret, x);
-                       TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ ret_conv_49_hu_conv = new TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ(null, ret_conv_49);
-                       if (ret_conv_49_hu_conv != null) { ret_conv_49_hu_conv.ptrs_to.AddLast(this); };
-                       ret_conv_49_arr[x] = ret_conv_49_hu_conv;
+               int ret_conv_54_len = InternalUtils.getArrayLength(ret);
+               ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[] ret_conv_54_arr = new ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ[ret_conv_54_len];
+               for (int c = 0; c < ret_conv_54_len; c++) {
+                       long ret_conv_54 = InternalUtils.getU64ArrayElem(ret, c);
+                       ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ ret_conv_54_hu_conv = new ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ(null, ret_conv_54);
+                       if (ret_conv_54_hu_conv != null) { ret_conv_54_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_54_arr[c] = ret_conv_54_hu_conv;
                }
                bindings.free_buffer(ret);
-               return ret_conv_49_arr;
+               return ret_conv_54_arr;
        }
 
 }
index ac828661c2f81b6f6b11c977ec4ab1165a509954..e1033e6a99f9759e6e9509fbefaccf591e953a3a 100644 (file)
@@ -162,6 +162,18 @@ public class DecodeError : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the DecodeError.
+        */
+       public long hash() {
+               long ret = bindings.DecodeError_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two DecodeErrors contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index ab161ea11eeb86b6e48668c8891823b1182a78e6..6d03f2c90009bc0ce1f729673ea5e7b80348ad2a 100644 (file)
@@ -16,13 +16,17 @@ public class DefaultMessageRouter : CommonBase {
        }
 
        /**
-        * Constructs a new DefaultMessageRouter given each field
+        * Creates a [`DefaultMessageRouter`] using the given [`NetworkGraph`].
         */
-       public static DefaultMessageRouter of() {
-               long ret = bindings.DefaultMessageRouter_new();
+       public static DefaultMessageRouter of(org.ldk.structs.NetworkGraph network_graph, org.ldk.structs.EntropySource entropy_source) {
+               long ret = bindings.DefaultMessageRouter_new(network_graph == null ? 0 : network_graph.ptr, entropy_source.ptr);
+               GC.KeepAlive(network_graph);
+               GC.KeepAlive(entropy_source);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.DefaultMessageRouter ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DefaultMessageRouter(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(network_graph); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(entropy_source); };
                return ret_hu_conv;
        }
 
index 6fd84172fc3fd9fa7fbc33a7d5140de4c62e276e..a3f9e55655302c96aef16dec54249db13a00427e 100644 (file)
@@ -18,11 +18,11 @@ public class DefaultRouter : CommonBase {
        /**
         * Creates a new router.
         */
-       public static DefaultRouter of(org.ldk.structs.NetworkGraph network_graph, org.ldk.structs.Logger logger, byte[] random_seed_bytes, org.ldk.structs.LockableScore scorer, org.ldk.structs.ProbabilisticScoringFeeParameters score_params) {
-               long ret = bindings.DefaultRouter_new(network_graph == null ? 0 : network_graph.ptr, logger.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(random_seed_bytes, 32)), scorer.ptr, score_params == null ? 0 : score_params.ptr);
+       public static DefaultRouter of(org.ldk.structs.NetworkGraph network_graph, org.ldk.structs.Logger logger, org.ldk.structs.EntropySource entropy_source, org.ldk.structs.LockableScore scorer, org.ldk.structs.ProbabilisticScoringFeeParameters score_params) {
+               long ret = bindings.DefaultRouter_new(network_graph == null ? 0 : network_graph.ptr, logger.ptr, entropy_source.ptr, scorer.ptr, score_params == null ? 0 : score_params.ptr);
                GC.KeepAlive(network_graph);
                GC.KeepAlive(logger);
-               GC.KeepAlive(random_seed_bytes);
+               GC.KeepAlive(entropy_source);
                GC.KeepAlive(scorer);
                GC.KeepAlive(score_params);
                if (ret >= 0 && ret <= 4096) { return null; }
@@ -30,6 +30,7 @@ public class DefaultRouter : CommonBase {
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(network_graph); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(logger); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(entropy_source); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(scorer); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(score_params); };
                return ret_hu_conv;
@@ -48,5 +49,18 @@ public class DefaultRouter : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Constructs a new MessageRouter which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned MessageRouter must be freed before this_arg is
+        */
+       public MessageRouter as_MessageRouter() {
+               long ret = bindings.DefaultRouter_as_MessageRouter(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               MessageRouter ret_hu_conv = new MessageRouter(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
 }
 } } }
diff --git a/c_sharp/src/org/ldk/structs/DelayedPaymentBasepoint.cs b/c_sharp/src/org/ldk/structs/DelayedPaymentBasepoint.cs
new file mode 100644 (file)
index 0000000..20166c7
--- /dev/null
@@ -0,0 +1,129 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Base key used in conjunction with a `per_commitment_point` to generate a [`DelayedPaymentKey`].
+ * 
+ * The delayed payment key is used to pay the commitment state broadcaster their
+ * non-HTLC-encumbered funds after a delay to give their counterparty a chance to punish if the
+ * state broadcasted was previously revoked.
+ */
+public class DelayedPaymentBasepoint : CommonBase {
+       internal DelayedPaymentBasepoint(object _dummy, long ptr) : base(ptr) { }
+       ~DelayedPaymentBasepoint() {
+               if (ptr != 0) { bindings.DelayedPaymentBasepoint_free(ptr); }
+       }
+
+       public byte[] get_a() {
+               long ret = bindings.DelayedPaymentBasepoint_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       public void set_a(byte[] val) {
+               bindings.DelayedPaymentBasepoint_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new DelayedPaymentBasepoint given each field
+        */
+       public static DelayedPaymentBasepoint of(byte[] a_arg) {
+               long ret = bindings.DelayedPaymentBasepoint_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 33)));
+               GC.KeepAlive(a_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.DelayedPaymentBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two DelayedPaymentBasepoints contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.DelayedPaymentBasepoint b) {
+               bool ret = bindings.DelayedPaymentBasepoint_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is DelayedPaymentBasepoint)) return false;
+               return this.eq((DelayedPaymentBasepoint)o);
+       }
+       internal long clone_ptr() {
+               long ret = bindings.DelayedPaymentBasepoint_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the DelayedPaymentBasepoint
+        */
+       public DelayedPaymentBasepoint clone() {
+               long ret = bindings.DelayedPaymentBasepoint_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.DelayedPaymentBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Generates a non-cryptographic 64-bit hash of the DelayedPaymentBasepoint.
+        */
+       public long hash() {
+               long ret = bindings.DelayedPaymentBasepoint_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
+       /**
+        * Get inner Public Key
+        */
+       public byte[] to_public_key() {
+               long ret = bindings.DelayedPaymentBasepoint_to_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Serialize the DelayedPaymentBasepoint object into a byte array which can be read by DelayedPaymentBasepoint_read
+        */
+       public byte[] write() {
+               long ret = bindings.DelayedPaymentBasepoint_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a DelayedPaymentBasepoint from a byte array, created by DelayedPaymentBasepoint_write
+        */
+       public static Result_DelayedPaymentBasepointDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.DelayedPaymentBasepoint_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentBasepointDecodeErrorZ ret_hu_conv = Result_DelayedPaymentBasepointDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/DelayedPaymentKey.cs b/c_sharp/src/org/ldk/structs/DelayedPaymentKey.cs
new file mode 100644 (file)
index 0000000..0340894
--- /dev/null
@@ -0,0 +1,147 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A derived key built from a [`DelayedPaymentBasepoint`] and `per_commitment_point`.
+ * 
+ * The delayed payment key is used to pay the commitment state broadcaster their
+ * non-HTLC-encumbered funds after a delay. This delay gives their counterparty a chance to
+ * punish and claim all the channel funds if the state broadcasted was previously revoked.
+ * 
+ * [See the BOLT specs]
+ * (https://github.com/lightning/bolts/blob/master/03-transactions.md#localpubkey-local_htlcpubkey-remote_htlcpubkey-local_delayedpubkey-and-remote_delayedpubkey-derivation)
+ * for more information on key derivation details.
+ */
+public class DelayedPaymentKey : CommonBase {
+       internal DelayedPaymentKey(object _dummy, long ptr) : base(ptr) { }
+       ~DelayedPaymentKey() {
+               if (ptr != 0) { bindings.DelayedPaymentKey_free(ptr); }
+       }
+
+       public byte[] get_a() {
+               long ret = bindings.DelayedPaymentKey_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       public void set_a(byte[] val) {
+               bindings.DelayedPaymentKey_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new DelayedPaymentKey given each field
+        */
+       public static DelayedPaymentKey of(byte[] a_arg) {
+               long ret = bindings.DelayedPaymentKey_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 33)));
+               GC.KeepAlive(a_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.DelayedPaymentKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two DelayedPaymentKeys contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.DelayedPaymentKey b) {
+               bool ret = bindings.DelayedPaymentKey_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is DelayedPaymentKey)) return false;
+               return this.eq((DelayedPaymentKey)o);
+       }
+       internal long clone_ptr() {
+               long ret = bindings.DelayedPaymentKey_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the DelayedPaymentKey
+        */
+       public DelayedPaymentKey clone() {
+               long ret = bindings.DelayedPaymentKey_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.DelayedPaymentKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Derive a public delayedpubkey using one node\'s `per_commitment_point` and its countersignatory\'s `basepoint`
+        */
+       public static DelayedPaymentKey from_basepoint(org.ldk.structs.DelayedPaymentBasepoint countersignatory_basepoint, byte[] per_commitment_point) {
+               long ret = bindings.DelayedPaymentKey_from_basepoint(countersignatory_basepoint == null ? 0 : countersignatory_basepoint.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)));
+               GC.KeepAlive(countersignatory_basepoint);
+               GC.KeepAlive(per_commitment_point);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.DelayedPaymentKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(countersignatory_basepoint); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Build a delayedpubkey directly from an already-derived private key
+        */
+       public static DelayedPaymentKey from_secret_key(byte[] sk) {
+               long ret = bindings.DelayedPaymentKey_from_secret_key(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(sk, 32)));
+               GC.KeepAlive(sk);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.DelayedPaymentKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Get inner Public Key
+        */
+       public byte[] to_public_key() {
+               long ret = bindings.DelayedPaymentKey_to_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Serialize the DelayedPaymentKey object into a byte array which can be read by DelayedPaymentKey_read
+        */
+       public byte[] write() {
+               long ret = bindings.DelayedPaymentKey_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a DelayedPaymentKey from a byte array, created by DelayedPaymentKey_write
+        */
+       public static Result_DelayedPaymentKeyDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.DelayedPaymentKey_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentKeyDecodeErrorZ ret_hu_conv = Result_DelayedPaymentKeyDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index cb13ce907ab29174d8d8334a0fb844c6448f3e5a..b5536ec450da76fd94388d61f2e58cde0122446d 100644 (file)
@@ -103,22 +103,24 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
         * The revocation point specific to the commitment transaction which was broadcast. Used to
         * derive the witnessScript for this output.
         */
-       public byte[] get_revocation_pubkey() {
+       public RevocationKey get_revocation_pubkey() {
                long ret = bindings.DelayedPaymentOutputDescriptor_get_revocation_pubkey(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.RevocationKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
         * The revocation point specific to the commitment transaction which was broadcast. Used to
         * derive the witnessScript for this output.
         */
-       public void set_revocation_pubkey(byte[] val) {
-               bindings.DelayedPaymentOutputDescriptor_set_revocation_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_revocation_pubkey(org.ldk.structs.RevocationKey val) {
+               bindings.DelayedPaymentOutputDescriptor_set_revocation_pubkey(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
@@ -164,8 +166,8 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
        /**
         * Constructs a new DelayedPaymentOutputDescriptor given each field
         */
-       public static DelayedPaymentOutputDescriptor of(org.ldk.structs.OutPoint outpoint_arg, byte[] per_commitment_point_arg, short to_self_delay_arg, org.ldk.structs.TxOut output_arg, byte[] revocation_pubkey_arg, byte[] channel_keys_id_arg, long channel_value_satoshis_arg) {
-               long ret = bindings.DelayedPaymentOutputDescriptor_new(outpoint_arg == null ? 0 : outpoint_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point_arg, 33)), to_self_delay_arg, output_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(revocation_pubkey_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_keys_id_arg, 32)), channel_value_satoshis_arg);
+       public static DelayedPaymentOutputDescriptor of(org.ldk.structs.OutPoint outpoint_arg, byte[] per_commitment_point_arg, short to_self_delay_arg, org.ldk.structs.TxOut output_arg, org.ldk.structs.RevocationKey revocation_pubkey_arg, byte[] channel_keys_id_arg, long channel_value_satoshis_arg) {
+               long ret = bindings.DelayedPaymentOutputDescriptor_new(outpoint_arg == null ? 0 : outpoint_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point_arg, 33)), to_self_delay_arg, output_arg.ptr, revocation_pubkey_arg == null ? 0 : revocation_pubkey_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_keys_id_arg, 32)), channel_value_satoshis_arg);
                GC.KeepAlive(outpoint_arg);
                GC.KeepAlive(per_commitment_point_arg);
                GC.KeepAlive(to_self_delay_arg);
@@ -177,6 +179,7 @@ public class DelayedPaymentOutputDescriptor : CommonBase {
                org.ldk.structs.DelayedPaymentOutputDescriptor ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentOutputDescriptor(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(outpoint_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(revocation_pubkey_arg); };
                return ret_hu_conv;
        }
 
index adbbd7910792c5ce522fb28de67617c88a430d4f..836578270578b59955f8f5fd15799b7f9deae18a 100644 (file)
@@ -80,14 +80,26 @@ public class Description : CommonBase {
        }
 
        /**
-        * Returns the underlying description [`String`]
+        * Returns the underlying description [`UntrustedString`]
         */
-       public string into_inner() {
+       public UntrustedString into_inner() {
                long ret = bindings.Description_into_inner(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               string ret_conv = InternalUtils.decodeString(ret);
+               org.ldk.structs.UntrustedString ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.UntrustedString(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
                if (this != null) { this.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Get the string representation of a Description object
+        */
+       public string to_str() {
+               long ret = bindings.Description_to_str(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
                return ret_conv;
        }
 
index c08ef7555cf6a4c2abb4333803956c282f01a805..fea5e7fb3229d0ab89594b7e456f314038a024d8 100644 (file)
@@ -46,15 +46,6 @@ public class DirectedChannelInfo : CommonBase {
                return ret_hu_conv;
        }
 
-       /**
-        * Returns the maximum HTLC amount allowed over the channel in the direction.
-        */
-       public long htlc_maximum_msat() {
-               long ret = bindings.DirectedChannelInfo_htlc_maximum_msat(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
        /**
         * Returns the [`EffectiveCapacity`] of the channel in the direction.
         * 
index cb33ab8895ce22ac5f95389337851e6fd5b63600..c831afa8a6aad84001a076dae91323740d12455e 100644 (file)
@@ -17,20 +17,15 @@ public interface EcdsaChannelSignerInterface {
         * Policy checks should be implemented in this function, including checking the amount
         * sent to us and checking the HTLCs.
         * 
-        * The preimages of outgoing HTLCs that were fulfilled since the last commitment are provided.
-        * A validating signer should ensure that an HTLC output is removed only when the matching
-        * preimage is provided, or when the value to holder is restored.
+        * The preimages of outbound and inbound HTLCs that were fulfilled since the last commitment
+        * are provided. A validating signer should ensure that an outbound HTLC output is removed
+        * only when the matching preimage is provided and after the corresponding inbound HTLC has
+        * been removed for forwarded payments.
         * 
         * Note that all the relevant preimages will be provided, but there may also be additional
         * irrelevant or duplicate preimages.
         */
-       Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment(CommitmentTransaction commitment_tx, byte[][] preimages);
-       /**Validate the counterparty's revocation.
-        * 
-        * This is required in order for the signer to make sure that the state has moved
-        * forward and it is safe to sign the next counterparty commitment.
-        */
-       Result_NoneNoneZ validate_counterparty_revocation(long idx, byte[] secret);
+       Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment(CommitmentTransaction commitment_tx, byte[][] inbound_htlc_preimages, byte[][] outbound_htlc_preimages);
        /**Creates a signature for a holder's commitment transaction.
         * 
         * This will be called
@@ -86,7 +81,7 @@ public interface EcdsaChannelSignerInterface {
         * [`ChannelMonitor`] [replica](https://github.com/lightningdevkit/rust-lightning/blob/main/GLOSSARY.md#monitor-replicas)
         * broadcasts it before receiving the update for the latest commitment transaction.
         * 
-        * [`EcdsaSighashType::All`]: bitcoin::blockdata::transaction::EcdsaSighashType::All
+        * [`EcdsaSighashType::All`]: bitcoin::sighash::EcdsaSighashType::All
         * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
         */
        Result_ECDSASignatureNoneZ sign_holder_htlc_transaction(byte[] htlc_tx, long input, HTLCDescriptor htlc_descriptor);
@@ -128,6 +123,8 @@ public interface EcdsaChannelSignerInterface {
         * Note that if this fails or is rejected, the channel will not be publicly announced and
         * our counterparty may (though likely will not) close the channel on us for violating the
         * protocol.
+        * 
+        * [`NodeSigner::sign_gossip_message`]: crate::sign::NodeSigner::sign_gossip_message
         */
        Result_ECDSASignatureNoneZ sign_channel_announcement_with_funding_key(UnsignedChannelAnnouncement msg);
 }
@@ -155,24 +152,25 @@ public class EcdsaChannelSigner : CommonBase {
                internal LDKEcdsaChannelSignerImpl(EcdsaChannelSignerInterface arg, LDKEcdsaChannelSignerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private EcdsaChannelSignerInterface arg;
                private LDKEcdsaChannelSignerHolder impl_holder;
-               public long sign_counterparty_commitment(long _commitment_tx, long _preimages) {
+               public long sign_counterparty_commitment(long _commitment_tx, long _inbound_htlc_preimages, long _outbound_htlc_preimages) {
                        org.ldk.structs.CommitmentTransaction _commitment_tx_hu_conv = null; if (_commitment_tx < 0 || _commitment_tx > 4096) { _commitment_tx_hu_conv = new org.ldk.structs.CommitmentTransaction(null, _commitment_tx); }
-                       int _preimages_conv_8_len = InternalUtils.getArrayLength(_preimages);
-                       byte[][] _preimages_conv_8_arr = new byte[_preimages_conv_8_len][];
-                       for (int i = 0; i < _preimages_conv_8_len; i++) {
-                               long _preimages_conv_8 = InternalUtils.getU64ArrayElem(_preimages, i);
-                               byte[] _preimages_conv_8_conv = InternalUtils.decodeUint8Array(_preimages_conv_8);
-                               _preimages_conv_8_arr[i] = _preimages_conv_8_conv;
+                       int _inbound_htlc_preimages_conv_8_len = InternalUtils.getArrayLength(_inbound_htlc_preimages);
+                       byte[][] _inbound_htlc_preimages_conv_8_arr = new byte[_inbound_htlc_preimages_conv_8_len][];
+                       for (int i = 0; i < _inbound_htlc_preimages_conv_8_len; i++) {
+                               long _inbound_htlc_preimages_conv_8 = InternalUtils.getU64ArrayElem(_inbound_htlc_preimages, i);
+                               byte[] _inbound_htlc_preimages_conv_8_conv = InternalUtils.decodeUint8Array(_inbound_htlc_preimages_conv_8);
+                               _inbound_htlc_preimages_conv_8_arr[i] = _inbound_htlc_preimages_conv_8_conv;
                        }
-                       bindings.free_buffer(_preimages);
-                       Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret = arg.sign_counterparty_commitment(_commitment_tx_hu_conv, _preimages_conv_8_arr);
-                               GC.KeepAlive(arg);
-                       long result = ret == null ? 0 : ret.clone_ptr();
-                       return result;
-               }
-               public long validate_counterparty_revocation(long _idx, long _secret) {
-                       byte[] _secret_conv = InternalUtils.decodeUint8Array(_secret);
-                       Result_NoneNoneZ ret = arg.validate_counterparty_revocation(_idx, _secret_conv);
+                       bindings.free_buffer(_inbound_htlc_preimages);
+                       int _outbound_htlc_preimages_conv_8_len = InternalUtils.getArrayLength(_outbound_htlc_preimages);
+                       byte[][] _outbound_htlc_preimages_conv_8_arr = new byte[_outbound_htlc_preimages_conv_8_len][];
+                       for (int i = 0; i < _outbound_htlc_preimages_conv_8_len; i++) {
+                               long _outbound_htlc_preimages_conv_8 = InternalUtils.getU64ArrayElem(_outbound_htlc_preimages, i);
+                               byte[] _outbound_htlc_preimages_conv_8_conv = InternalUtils.decodeUint8Array(_outbound_htlc_preimages_conv_8);
+                               _outbound_htlc_preimages_conv_8_arr[i] = _outbound_htlc_preimages_conv_8_conv;
+                       }
+                       bindings.free_buffer(_outbound_htlc_preimages);
+                       Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret = arg.sign_counterparty_commitment(_commitment_tx_hu_conv, _inbound_htlc_preimages_conv_8_arr, _outbound_htlc_preimages_conv_8_arr);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -263,40 +261,26 @@ public class EcdsaChannelSigner : CommonBase {
         * Policy checks should be implemented in this function, including checking the amount
         * sent to us and checking the HTLCs.
         * 
-        * The preimages of outgoing HTLCs that were fulfilled since the last commitment are provided.
-        * A validating signer should ensure that an HTLC output is removed only when the matching
-        * preimage is provided, or when the value to holder is restored.
+        * The preimages of outbound and inbound HTLCs that were fulfilled since the last commitment
+        * are provided. A validating signer should ensure that an outbound HTLC output is removed
+        * only when the matching preimage is provided and after the corresponding inbound HTLC has
+        * been removed for forwarded payments.
         * 
         * Note that all the relevant preimages will be provided, but there may also be additional
         * irrelevant or duplicate preimages.
         */
-       public Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment(org.ldk.structs.CommitmentTransaction commitment_tx, byte[][] preimages) {
-               long ret = bindings.EcdsaChannelSigner_sign_counterparty_commitment(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(preimages, preimages_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(preimages_conv_8, 32)))));
+       public Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ sign_counterparty_commitment(org.ldk.structs.CommitmentTransaction commitment_tx, byte[][] inbound_htlc_preimages, byte[][] outbound_htlc_preimages) {
+               long ret = bindings.EcdsaChannelSigner_sign_counterparty_commitment(this.ptr, commitment_tx == null ? 0 : commitment_tx.ptr, InternalUtils.encodeUint64Array(InternalUtils.mapArray(inbound_htlc_preimages, inbound_htlc_preimages_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(inbound_htlc_preimages_conv_8, 32)))), InternalUtils.encodeUint64Array(InternalUtils.mapArray(outbound_htlc_preimages, outbound_htlc_preimages_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(outbound_htlc_preimages_conv_8, 32)))));
                GC.KeepAlive(this);
                GC.KeepAlive(commitment_tx);
-               GC.KeepAlive(preimages);
+               GC.KeepAlive(inbound_htlc_preimages);
+               GC.KeepAlive(outbound_htlc_preimages);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ ret_hu_conv = Result_C2Tuple_ECDSASignatureCVec_ECDSASignatureZZNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(commitment_tx); };
                return ret_hu_conv;
        }
 
-       /**
-        * Validate the counterparty's revocation.
-        * 
-        * This is required in order for the signer to make sure that the state has moved
-        * forward and it is safe to sign the next counterparty commitment.
-        */
-       public Result_NoneNoneZ validate_counterparty_revocation(long idx, byte[] secret) {
-               long ret = bindings.EcdsaChannelSigner_validate_counterparty_revocation(this.ptr, idx, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(secret, 32)));
-               GC.KeepAlive(this);
-               GC.KeepAlive(idx);
-               GC.KeepAlive(secret);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneNoneZ ret_hu_conv = Result_NoneNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
        /**
         * Creates a signature for a holder's commitment transaction.
         * 
@@ -389,7 +373,7 @@ public class EcdsaChannelSigner : CommonBase {
         * [`ChannelMonitor`] [replica](https://github.com/lightningdevkit/rust-lightning/blob/main/GLOSSARY.md#monitor-replicas)
         * broadcasts it before receiving the update for the latest commitment transaction.
         * 
-        * [`EcdsaSighashType::All`]: bitcoin::blockdata::transaction::EcdsaSighashType::All
+        * [`EcdsaSighashType::All`]: bitcoin::sighash::EcdsaSighashType::All
         * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
         */
        public Result_ECDSASignatureNoneZ sign_holder_htlc_transaction(byte[] htlc_tx, long input, org.ldk.structs.HTLCDescriptor htlc_descriptor) {
@@ -477,6 +461,8 @@ public class EcdsaChannelSigner : CommonBase {
         * Note that if this fails or is rejected, the channel will not be publicly announced and
         * our counterparty may (though likely will not) close the channel on us for violating the
         * protocol.
+        * 
+        * [`NodeSigner::sign_gossip_message`]: crate::sign::NodeSigner::sign_gossip_message
         */
        public Result_ECDSASignatureNoneZ sign_channel_announcement_with_funding_key(org.ldk.structs.UnsignedChannelAnnouncement msg) {
                long ret = bindings.EcdsaChannelSigner_sign_channel_announcement_with_funding_key(this.ptr, msg == null ? 0 : msg.ptr);
index 993d3e34ddee07429f79452b7ab5d22978b8210e..9e0fc990ff01d5bbaf5735acbb27ab36eba00f42 100644 (file)
@@ -212,5 +212,17 @@ public class ErrorAction : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ErrorAction.
+        */
+       public long hash() {
+               long ret = bindings.ErrorAction_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
 }
 } } }
index 9a4135a76e6057dd4384925ddb3df81fcc6090ef..fe33ec1925a93b206f50f03d29362b674ed42b3a 100644 (file)
@@ -102,6 +102,18 @@ public class ErrorMessage : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ErrorMessage.
+        */
+       public long hash() {
+               long ret = bindings.ErrorMessage_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ErrorMessages contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 805b57eb28d477897cd5256d06afcc657f11b00f..ccc37c52d1e3ff02bfeb4458b7811e97dceddefc 100644 (file)
@@ -24,24 +24,25 @@ public class Event : CommonBase {
                        case 0: return new Event_FundingGenerationReady(ptr);
                        case 1: return new Event_PaymentClaimable(ptr);
                        case 2: return new Event_PaymentClaimed(ptr);
-                       case 3: return new Event_InvoiceRequestFailed(ptr);
-                       case 4: return new Event_PaymentSent(ptr);
-                       case 5: return new Event_PaymentFailed(ptr);
-                       case 6: return new Event_PaymentPathSuccessful(ptr);
-                       case 7: return new Event_PaymentPathFailed(ptr);
-                       case 8: return new Event_ProbeSuccessful(ptr);
-                       case 9: return new Event_ProbeFailed(ptr);
-                       case 10: return new Event_PendingHTLCsForwardable(ptr);
-                       case 11: return new Event_HTLCIntercepted(ptr);
-                       case 12: return new Event_SpendableOutputs(ptr);
-                       case 13: return new Event_PaymentForwarded(ptr);
-                       case 14: return new Event_ChannelPending(ptr);
-                       case 15: return new Event_ChannelReady(ptr);
-                       case 16: return new Event_ChannelClosed(ptr);
-                       case 17: return new Event_DiscardFunding(ptr);
-                       case 18: return new Event_OpenChannelRequest(ptr);
-                       case 19: return new Event_HTLCHandlingFailed(ptr);
-                       case 20: return new Event_BumpTransaction(ptr);
+                       case 3: return new Event_ConnectionNeeded(ptr);
+                       case 4: return new Event_InvoiceRequestFailed(ptr);
+                       case 5: return new Event_PaymentSent(ptr);
+                       case 6: return new Event_PaymentFailed(ptr);
+                       case 7: return new Event_PaymentPathSuccessful(ptr);
+                       case 8: return new Event_PaymentPathFailed(ptr);
+                       case 9: return new Event_ProbeSuccessful(ptr);
+                       case 10: return new Event_ProbeFailed(ptr);
+                       case 11: return new Event_PendingHTLCsForwardable(ptr);
+                       case 12: return new Event_HTLCIntercepted(ptr);
+                       case 13: return new Event_SpendableOutputs(ptr);
+                       case 14: return new Event_PaymentForwarded(ptr);
+                       case 15: return new Event_ChannelPending(ptr);
+                       case 16: return new Event_ChannelReady(ptr);
+                       case 17: return new Event_ChannelClosed(ptr);
+                       case 18: return new Event_DiscardFunding(ptr);
+                       case 19: return new Event_OpenChannelRequest(ptr);
+                       case 20: return new Event_HTLCHandlingFailed(ptr);
+                       case 21: return new Event_BumpTransaction(ptr);
                        default:
                                throw new ArgumentException("Impossible enum variant");
                }
@@ -270,6 +271,33 @@ public class Event : CommonBase {
                        this.sender_intended_total_msat = sender_intended_total_msat_hu_conv;
                }
        }
+       /** A Event of type ConnectionNeeded */
+       public class Event_ConnectionNeeded : Event {
+               /**
+                * The node id for the node needing a connection.
+                */
+               public byte[] node_id;
+               /**
+                * Sockets for connecting to the node.
+                */
+               public SocketAddress[] addresses;
+               internal Event_ConnectionNeeded(long ptr) : base(null, ptr) {
+                       long node_id = bindings.LDKEvent_ConnectionNeeded_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
+                       long addresses = bindings.LDKEvent_ConnectionNeeded_get_addresses(ptr);
+                       int addresses_conv_15_len = InternalUtils.getArrayLength(addresses);
+                       SocketAddress[] addresses_conv_15_arr = new SocketAddress[addresses_conv_15_len];
+                       for (int p = 0; p < addresses_conv_15_len; p++) {
+                               long addresses_conv_15 = InternalUtils.getU64ArrayElem(addresses, p);
+                               org.ldk.structs.SocketAddress addresses_conv_15_hu_conv = org.ldk.structs.SocketAddress.constr_from_ptr(addresses_conv_15);
+                               if (addresses_conv_15_hu_conv != null) { addresses_conv_15_hu_conv.ptrs_to.AddLast(this); };
+                               addresses_conv_15_arr[p] = addresses_conv_15_hu_conv;
+                       }
+                       bindings.free_buffer(addresses);
+                       this.addresses = addresses_conv_15_arr;
+               }
+       }
        /** A Event of type InvoiceRequestFailed */
        public class Event_InvoiceRequestFailed : Event {
                /**
@@ -816,6 +844,14 @@ public class Event : CommonBase {
                 * This field will be `None` for objects serialized prior to LDK 0.0.117.
                 */
                public Option_u64Z channel_capacity_sats;
+               /**
+                * The original channel funding TXO; this helps checking for the existence and confirmation
+                * status of the closing tx.
+                * Note that for instances serialized in v0.0.119 or prior this will be missing (None).
+                * 
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public OutPoint channel_funding_txo;
                internal Event_ChannelClosed(long ptr) : base(null, ptr) {
                        long channel_id = bindings.LDKEvent_ChannelClosed_get_channel_id(ptr);
                        byte[] channel_id_conv = InternalUtils.decodeUint8Array(channel_id);
@@ -834,6 +870,10 @@ public class Event : CommonBase {
                        org.ldk.structs.Option_u64Z channel_capacity_sats_hu_conv = org.ldk.structs.Option_u64Z.constr_from_ptr(channel_capacity_sats);
                        if (channel_capacity_sats_hu_conv != null) { channel_capacity_sats_hu_conv.ptrs_to.AddLast(this); };
                        this.channel_capacity_sats = channel_capacity_sats_hu_conv;
+                       long channel_funding_txo = bindings.LDKEvent_ChannelClosed_get_channel_funding_txo(ptr);
+                       org.ldk.structs.OutPoint channel_funding_txo_hu_conv = null; if (channel_funding_txo < 0 || channel_funding_txo > 4096) { channel_funding_txo_hu_conv = new org.ldk.structs.OutPoint(null, channel_funding_txo); }
+                       if (channel_funding_txo_hu_conv != null) { channel_funding_txo_hu_conv.ptrs_to.AddLast(this); };
+                       this.channel_funding_txo = channel_funding_txo_hu_conv;
                }
        }
        /** A Event of type DiscardFunding */
@@ -1030,6 +1070,20 @@ public class Event : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Utility method to constructs a new ConnectionNeeded-variant Event
+        */
+       public static Event connection_needed(byte[] node_id, SocketAddress[] addresses) {
+               long ret = bindings.Event_connection_needed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(addresses, addresses_conv_15 => addresses_conv_15.ptr)));
+               GC.KeepAlive(node_id);
+               GC.KeepAlive(addresses);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Event ret_hu_conv = org.ldk.structs.Event.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               foreach (SocketAddress addresses_conv_15 in addresses) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(addresses_conv_15); }; };
+               return ret_hu_conv;
+       }
+
        /**
         * Utility method to constructs a new InvoiceRequestFailed-variant Event
         */
@@ -1243,18 +1297,20 @@ public class Event : CommonBase {
        /**
         * Utility method to constructs a new ChannelClosed-variant Event
         */
-       public static Event channel_closed(byte[] channel_id, org.ldk.util.UInt128 user_channel_id, org.ldk.structs.ClosureReason reason, byte[] counterparty_node_id, org.ldk.structs.Option_u64Z channel_capacity_sats) {
-               long ret = bindings.Event_channel_closed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()), reason.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), channel_capacity_sats.ptr);
+       public static Event channel_closed(byte[] channel_id, org.ldk.util.UInt128 user_channel_id, org.ldk.structs.ClosureReason reason, byte[] counterparty_node_id, org.ldk.structs.Option_u64Z channel_capacity_sats, org.ldk.structs.OutPoint channel_funding_txo) {
+               long ret = bindings.Event_channel_closed(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id, 32)), InternalUtils.encodeUint8Array(user_channel_id.getLEBytes()), reason.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(counterparty_node_id, 33)), channel_capacity_sats.ptr, channel_funding_txo == null ? 0 : channel_funding_txo.ptr);
                GC.KeepAlive(channel_id);
                GC.KeepAlive(user_channel_id);
                GC.KeepAlive(reason);
                GC.KeepAlive(counterparty_node_id);
                GC.KeepAlive(channel_capacity_sats);
+               GC.KeepAlive(channel_funding_txo);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.Event ret_hu_conv = org.ldk.structs.Event.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(reason); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channel_capacity_sats); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channel_funding_txo); };
                return ret_hu_conv;
        }
 
diff --git a/c_sharp/src/org/ldk/structs/FinalOnionHopData.cs b/c_sharp/src/org/ldk/structs/FinalOnionHopData.cs
new file mode 100644 (file)
index 0000000..dd0ae7b
--- /dev/null
@@ -0,0 +1,119 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Information communicated in the onion to the recipient for multi-part tracking and proof that
+ * the payment is associated with an invoice.
+ */
+public class FinalOnionHopData : CommonBase {
+       internal FinalOnionHopData(object _dummy, long ptr) : base(ptr) { }
+       ~FinalOnionHopData() {
+               if (ptr != 0) { bindings.FinalOnionHopData_free(ptr); }
+       }
+
+       /**
+        * When sending a multi-part payment, this secret is used to identify a payment across HTLCs.
+        * Because it is generated by the recipient and included in the invoice, it also provides
+        * proof to the recipient that the payment was sent by someone with the generated invoice.
+        */
+       public byte[] get_payment_secret() {
+               long ret = bindings.FinalOnionHopData_get_payment_secret(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * When sending a multi-part payment, this secret is used to identify a payment across HTLCs.
+        * Because it is generated by the recipient and included in the invoice, it also provides
+        * proof to the recipient that the payment was sent by someone with the generated invoice.
+        */
+       public void set_payment_secret(byte[] val) {
+               bindings.FinalOnionHopData_set_payment_secret(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The intended total amount that this payment is for.
+        * 
+        * Message serialization may panic if this value is more than 21 million Bitcoin.
+        */
+       public long get_total_msat() {
+               long ret = bindings.FinalOnionHopData_get_total_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The intended total amount that this payment is for.
+        * 
+        * Message serialization may panic if this value is more than 21 million Bitcoin.
+        */
+       public void set_total_msat(long val) {
+               bindings.FinalOnionHopData_set_total_msat(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new FinalOnionHopData given each field
+        */
+       public static FinalOnionHopData of(byte[] payment_secret_arg, long total_msat_arg) {
+               long ret = bindings.FinalOnionHopData_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_secret_arg, 32)), total_msat_arg);
+               GC.KeepAlive(payment_secret_arg);
+               GC.KeepAlive(total_msat_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FinalOnionHopData ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.FinalOnionHopData(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.FinalOnionHopData_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the FinalOnionHopData
+        */
+       public FinalOnionHopData clone() {
+               long ret = bindings.FinalOnionHopData_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FinalOnionHopData ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.FinalOnionHopData(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the FinalOnionHopData object into a byte array which can be read by FinalOnionHopData_read
+        */
+       public byte[] write() {
+               long ret = bindings.FinalOnionHopData_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a FinalOnionHopData from a byte array, created by FinalOnionHopData_write
+        */
+       public static Result_FinalOnionHopDataDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.FinalOnionHopData_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_FinalOnionHopDataDecodeErrorZ ret_hu_conv = Result_FinalOnionHopDataDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/FirstHopCandidate.cs b/c_sharp/src/org/ldk/structs/FirstHopCandidate.cs
new file mode 100644 (file)
index 0000000..b6e7c80
--- /dev/null
@@ -0,0 +1,37 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A [`CandidateRouteHop::FirstHop`] entry.
+ */
+public class FirstHopCandidate : CommonBase {
+       internal FirstHopCandidate(object _dummy, long ptr) : base(ptr) { }
+       ~FirstHopCandidate() {
+               if (ptr != 0) { bindings.FirstHopCandidate_free(ptr); }
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.FirstHopCandidate_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the FirstHopCandidate
+        */
+       public FirstHopCandidate clone() {
+               long ret = bindings.FirstHopCandidate_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.FirstHopCandidate ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.FirstHopCandidate(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 1166194df6809a267e8cc08edeab4d1f106cb9b9..55436ec14913c45d4411760637877cd84df41b51 100644 (file)
@@ -130,6 +130,18 @@ public class FundingCreated : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the FundingCreated.
+        */
+       public long hash() {
+               long ret = bindings.FundingCreated_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two FundingCreateds contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index e10f01ff17842bc9e7f6bc0602e95e51c3cd5e7a..9056396a024c3b69dec054ec3791cea4af9c5435 100644 (file)
@@ -90,6 +90,18 @@ public class FundingSigned : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the FundingSigned.
+        */
+       public long hash() {
+               long ret = bindings.FundingSigned_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two FundingSigneds contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index e210877fabcfd879211668a2d6584ae987235624..8eac426637704dfa349c59b4940ecf383783062f 100644 (file)
@@ -107,6 +107,18 @@ public class GossipTimestampFilter : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the GossipTimestampFilter.
+        */
+       public long hash() {
+               long ret = bindings.GossipTimestampFilter_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two GossipTimestampFilters contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 2e3e071f753e4132398853d1e35fdda5628e77a0..0d5840edc02c5889c5ee02f96c43354c6cdb8038 100644 (file)
@@ -39,6 +39,18 @@ public class Hostname : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Hostname.
+        */
+       public long hash() {
+               long ret = bindings.Hostname_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two Hostnames contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
diff --git a/c_sharp/src/org/ldk/structs/HtlcBasepoint.cs b/c_sharp/src/org/ldk/structs/HtlcBasepoint.cs
new file mode 100644 (file)
index 0000000..5738f99
--- /dev/null
@@ -0,0 +1,129 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Base key used in conjunction with a `per_commitment_point` to generate an [`HtlcKey`].
+ * 
+ * HTLC keys are used to ensure only the recipient of an HTLC can claim it on-chain with the HTLC
+ * preimage and that only the sender of an HTLC can claim it on-chain after it has timed out.
+ * Thus, both channel counterparties' HTLC keys will appears in each HTLC output's script.
+ */
+public class HtlcBasepoint : CommonBase {
+       internal HtlcBasepoint(object _dummy, long ptr) : base(ptr) { }
+       ~HtlcBasepoint() {
+               if (ptr != 0) { bindings.HtlcBasepoint_free(ptr); }
+       }
+
+       public byte[] get_a() {
+               long ret = bindings.HtlcBasepoint_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       public void set_a(byte[] val) {
+               bindings.HtlcBasepoint_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new HtlcBasepoint given each field
+        */
+       public static HtlcBasepoint of(byte[] a_arg) {
+               long ret = bindings.HtlcBasepoint_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 33)));
+               GC.KeepAlive(a_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.HtlcBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two HtlcBasepoints contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.HtlcBasepoint b) {
+               bool ret = bindings.HtlcBasepoint_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is HtlcBasepoint)) return false;
+               return this.eq((HtlcBasepoint)o);
+       }
+       internal long clone_ptr() {
+               long ret = bindings.HtlcBasepoint_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the HtlcBasepoint
+        */
+       public HtlcBasepoint clone() {
+               long ret = bindings.HtlcBasepoint_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.HtlcBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Generates a non-cryptographic 64-bit hash of the HtlcBasepoint.
+        */
+       public long hash() {
+               long ret = bindings.HtlcBasepoint_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
+       /**
+        * Get inner Public Key
+        */
+       public byte[] to_public_key() {
+               long ret = bindings.HtlcBasepoint_to_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Serialize the HtlcBasepoint object into a byte array which can be read by HtlcBasepoint_read
+        */
+       public byte[] write() {
+               long ret = bindings.HtlcBasepoint_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a HtlcBasepoint from a byte array, created by HtlcBasepoint_write
+        */
+       public static Result_HtlcBasepointDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.HtlcBasepoint_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcBasepointDecodeErrorZ ret_hu_conv = Result_HtlcBasepointDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/HtlcKey.cs b/c_sharp/src/org/ldk/structs/HtlcKey.cs
new file mode 100644 (file)
index 0000000..c91c83a
--- /dev/null
@@ -0,0 +1,147 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A derived key built from a [`HtlcBasepoint`] and `per_commitment_point`.
+ * 
+ * HTLC keys are used to ensure only the recipient of an HTLC can claim it on-chain with the HTLC
+ * preimage and that only the sender of an HTLC can claim it on-chain after it has timed out.
+ * Thus, both channel counterparties' HTLC keys will appears in each HTLC output's script.
+ * 
+ * [See the BOLT specs]
+ * (https://github.com/lightning/bolts/blob/master/03-transactions.md#localpubkey-local_htlcpubkey-remote_htlcpubkey-local_delayedpubkey-and-remote_delayedpubkey-derivation)
+ * for more information on key derivation details.
+ */
+public class HtlcKey : CommonBase {
+       internal HtlcKey(object _dummy, long ptr) : base(ptr) { }
+       ~HtlcKey() {
+               if (ptr != 0) { bindings.HtlcKey_free(ptr); }
+       }
+
+       public byte[] get_a() {
+               long ret = bindings.HtlcKey_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       public void set_a(byte[] val) {
+               bindings.HtlcKey_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new HtlcKey given each field
+        */
+       public static HtlcKey of(byte[] a_arg) {
+               long ret = bindings.HtlcKey_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 33)));
+               GC.KeepAlive(a_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.HtlcKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two HtlcKeys contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.HtlcKey b) {
+               bool ret = bindings.HtlcKey_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is HtlcKey)) return false;
+               return this.eq((HtlcKey)o);
+       }
+       internal long clone_ptr() {
+               long ret = bindings.HtlcKey_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the HtlcKey
+        */
+       public HtlcKey clone() {
+               long ret = bindings.HtlcKey_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.HtlcKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Derive a public htlcpubkey using one node\'s `per_commitment_point` and its countersignatory\'s `basepoint`
+        */
+       public static HtlcKey from_basepoint(org.ldk.structs.HtlcBasepoint countersignatory_basepoint, byte[] per_commitment_point) {
+               long ret = bindings.HtlcKey_from_basepoint(countersignatory_basepoint == null ? 0 : countersignatory_basepoint.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)));
+               GC.KeepAlive(countersignatory_basepoint);
+               GC.KeepAlive(per_commitment_point);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.HtlcKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(countersignatory_basepoint); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Build a htlcpubkey directly from an already-derived private key
+        */
+       public static HtlcKey from_secret_key(byte[] sk) {
+               long ret = bindings.HtlcKey_from_secret_key(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(sk, 32)));
+               GC.KeepAlive(sk);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.HtlcKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Get inner Public Key
+        */
+       public byte[] to_public_key() {
+               long ret = bindings.HtlcKey_to_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Serialize the HtlcKey object into a byte array which can be read by HtlcKey_read
+        */
+       public byte[] write() {
+               long ret = bindings.HtlcKey_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a HtlcKey from a byte array, created by HtlcKey_write
+        */
+       public static Result_HtlcKeyDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.HtlcKey_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcKeyDecodeErrorZ ret_hu_conv = Result_HtlcKeyDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 6046c7dcf8e2f4d68cf19d187cdfa41f09f9c8eb..4b9d0662c6000ca5f73c3c0bf0b883f33d408e3c 100644 (file)
@@ -27,6 +27,19 @@ public class IgnoringMessageHandler : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Constructs a new EventsProvider which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned EventsProvider must be freed before this_arg is
+        */
+       public EventsProvider as_EventsProvider() {
+               long ret = bindings.IgnoringMessageHandler_as_EventsProvider(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               EventsProvider ret_hu_conv = new EventsProvider(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
        /**
         * Constructs a new MessageSendEventsProvider which calls the relevant methods on this_arg.
         * This copies the `inner` pointer in this_arg and thus the returned MessageSendEventsProvider must be freed before this_arg is
index d0c6655ad270df55dfa560848a9ac8ab24851afc..caa0905e4f562924f1cba01568297e07ebea34a7 100644 (file)
@@ -307,14 +307,14 @@ public class InMemorySigner : CommonBase {
         * 
         * [`descriptor.outpoint`]: StaticPaymentOutputDescriptor::outpoint
         */
-       public Result_CVec_CVec_u8ZZNoneZ sign_counterparty_payment_input(byte[] spend_tx, long input_idx, org.ldk.structs.StaticPaymentOutputDescriptor descriptor) {
+       public Result_WitnessNoneZ sign_counterparty_payment_input(byte[] spend_tx, long input_idx, org.ldk.structs.StaticPaymentOutputDescriptor descriptor) {
                long ret = bindings.InMemorySigner_sign_counterparty_payment_input(this.ptr, InternalUtils.encodeUint8Array(spend_tx), input_idx, descriptor == null ? 0 : descriptor.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(spend_tx);
                GC.KeepAlive(input_idx);
                GC.KeepAlive(descriptor);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_CVec_u8ZZNoneZ ret_hu_conv = Result_CVec_CVec_u8ZZNoneZ.constr_from_ptr(ret);
+               Result_WitnessNoneZ ret_hu_conv = Result_WitnessNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(descriptor); };
                return ret_hu_conv;
        }
@@ -331,14 +331,14 @@ public class InMemorySigner : CommonBase {
         * [`descriptor.outpoint`]: DelayedPaymentOutputDescriptor::outpoint
         * [`descriptor.to_self_delay`]: DelayedPaymentOutputDescriptor::to_self_delay
         */
-       public Result_CVec_CVec_u8ZZNoneZ sign_dynamic_p2wsh_input(byte[] spend_tx, long input_idx, org.ldk.structs.DelayedPaymentOutputDescriptor descriptor) {
+       public Result_WitnessNoneZ sign_dynamic_p2wsh_input(byte[] spend_tx, long input_idx, org.ldk.structs.DelayedPaymentOutputDescriptor descriptor) {
                long ret = bindings.InMemorySigner_sign_dynamic_p2wsh_input(this.ptr, InternalUtils.encodeUint8Array(spend_tx), input_idx, descriptor == null ? 0 : descriptor.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(spend_tx);
                GC.KeepAlive(input_idx);
                GC.KeepAlive(descriptor);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_CVec_u8ZZNoneZ ret_hu_conv = Result_CVec_CVec_u8ZZNoneZ.constr_from_ptr(ret);
+               Result_WitnessNoneZ ret_hu_conv = Result_WitnessNoneZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(descriptor); };
                return ret_hu_conv;
        }
diff --git a/c_sharp/src/org/ldk/structs/InboundHTLCErr.cs b/c_sharp/src/org/ldk/structs/InboundHTLCErr.cs
new file mode 100644 (file)
index 0000000..ccca20d
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Invalid inbound onion payment.
+ */
+public class InboundHTLCErr : CommonBase {
+       internal InboundHTLCErr(object _dummy, long ptr) : base(ptr) { }
+       ~InboundHTLCErr() {
+               if (ptr != 0) { bindings.InboundHTLCErr_free(ptr); }
+       }
+
+       /**
+        * BOLT 4 error code.
+        */
+       public short get_err_code() {
+               short ret = bindings.InboundHTLCErr_get_err_code(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * BOLT 4 error code.
+        */
+       public void set_err_code(short val) {
+               bindings.InboundHTLCErr_set_err_code(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Data attached to this error.
+        * 
+        * Returns a copy of the field.
+        */
+       public byte[] get_err_data() {
+               long ret = bindings.InboundHTLCErr_get_err_data(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Data attached to this error.
+        */
+       public void set_err_data(byte[] val) {
+               bindings.InboundHTLCErr_set_err_data(this.ptr, InternalUtils.encodeUint8Array(val));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Error message text.
+        */
+       public string get_msg() {
+               long ret = bindings.InboundHTLCErr_get_msg(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Error message text.
+        */
+       public void set_msg(string val) {
+               bindings.InboundHTLCErr_set_msg(this.ptr, InternalUtils.encodeString(val));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new InboundHTLCErr given each field
+        */
+       public static InboundHTLCErr of(short err_code_arg, byte[] err_data_arg, string msg_arg) {
+               long ret = bindings.InboundHTLCErr_new(err_code_arg, InternalUtils.encodeUint8Array(err_data_arg), InternalUtils.encodeString(msg_arg));
+               GC.KeepAlive(err_code_arg);
+               GC.KeepAlive(err_data_arg);
+               GC.KeepAlive(msg_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.InboundHTLCErr ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InboundHTLCErr(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 407b3436c21d3c3012920fade33e9d2a45debe26..bc5f9ca63695233f29939b51e81106feee9c533d 100644 (file)
@@ -134,6 +134,18 @@ public class Init : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Init.
+        */
+       public long hash() {
+               long ret = bindings.Init_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two Inits contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 44c97a13c6687756d536311942e7ec54717b5e64..4f1551e3778bbc20a27a284a95ecd7db5a046d5e 100644 (file)
@@ -50,6 +50,18 @@ public class InitFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the InitFeatures.
+        */
+       public long hash() {
+               long ret = bindings.InitFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
@@ -541,6 +553,40 @@ public class InitFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Set this feature as optional.
+        */
+       public void set_route_blinding_optional() {
+               bindings.InitFeatures_set_route_blinding_optional(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Set this feature as required.
+        */
+       public void set_route_blinding_required() {
+               bindings.InitFeatures_set_route_blinding_required(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Checks if this feature is supported.
+        */
+       public bool supports_route_blinding() {
+               bool ret = bindings.InitFeatures_supports_route_blinding(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Checks if this feature is required.
+        */
+       public bool requires_route_blinding() {
+               bool ret = bindings.InitFeatures_requires_route_blinding(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Set this feature as optional.
         */
index 1012b6f455d89c7c87a7b3cec4c9cced76dd49d9..4f739fa57dd28cf6e18cb9cfb021eb7c5e253ede 100644 (file)
@@ -7,7 +7,7 @@ namespace org { namespace ldk { namespace structs {
 
 
 /**
- * An error occurring when converting from [`Script`] to [`ShutdownScript`].
+ * An error occurring when converting from [`ScriptBuf`] to [`ShutdownScript`].
  */
 public class InvalidShutdownScript : CommonBase {
        internal InvalidShutdownScript(object _dummy, long ptr) : base(ptr) { }
index fdbc49e7275209bdbbec39b283d47aa2b1159508..f3d15d0db5cf963ce48ce0b0ae6ab75b2958ab8c 100644 (file)
@@ -50,6 +50,18 @@ public class InvoiceRequestFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the InvoiceRequestFeatures.
+        */
+       public long hash() {
+               long ret = bindings.InvoiceRequestFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
index 309fa883f852fc295062db6397491dba5f24a4c8..ef2533979d26244bd6f124bcfff544a76fa37746 100644 (file)
@@ -10,13 +10,13 @@ namespace org { namespace ldk { namespace structs {
 
 /** An implementation of Logger */
 public interface LoggerInterface {
-       /**Logs the `Record`
+       /**Logs the [`Record`].
         */
        void log(Record record);
 }
 
 /**
- * A trait encapsulating the operations required of a logger
+ * A trait encapsulating the operations required of a logger.
  */
 public class Logger : CommonBase {
        internal bindings.LDKLogger bindings_instance;
@@ -34,6 +34,7 @@ public class Logger : CommonBase {
                private LDKLoggerHolder impl_holder;
                public void log(long _record) {
                        org.ldk.structs.Record _record_hu_conv = null; if (_record < 0 || _record > 4096) { _record_hu_conv = new org.ldk.structs.Record(null, _record); }
+                       if (_record_hu_conv != null) { _record_hu_conv.ptrs_to.AddLast(this); };
                        arg.log(_record_hu_conv);
                                GC.KeepAlive(arg);
                }
index 05c9671a4fcf89ab1f7f1082ef2b14029ed652d1..da7bd7c521c44b360fa8c73fd881aa3205717cd4 100644 (file)
@@ -75,7 +75,7 @@ public class MessageHandler : CommonBase {
         * A message handler which handles onion messages. This should generally be an
         * [`OnionMessenger`], but can also be an [`IgnoringMessageHandler`].
         * 
-        * [`OnionMessenger`]: crate::onion_message::OnionMessenger
+        * [`OnionMessenger`]: crate::onion_message::messenger::OnionMessenger
         */
        public OnionMessageHandler get_onion_message_handler() {
                long ret = bindings.MessageHandler_get_onion_message_handler(this.ptr);
@@ -90,7 +90,7 @@ public class MessageHandler : CommonBase {
         * A message handler which handles onion messages. This should generally be an
         * [`OnionMessenger`], but can also be an [`IgnoringMessageHandler`].
         * 
-        * [`OnionMessenger`]: crate::onion_message::OnionMessenger
+        * [`OnionMessenger`]: crate::onion_message::messenger::OnionMessenger
         */
        public void set_onion_message_handler(org.ldk.structs.OnionMessageHandler val) {
                bindings.MessageHandler_set_onion_message_handler(this.ptr, val.ptr);
index c2b1fb974eaa1474b48bd2114c4ed07905518d7b..12f593e16a63464de7c37f8aa3c8190338eeec8c 100644 (file)
@@ -13,6 +13,10 @@ public interface MessageRouterInterface {
        /**Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
         */
        Result_OnionMessagePathNoneZ find_path(byte[] sender, byte[][] peers, Destination destination);
+       /**Creates [`BlindedPath`]s to the `recipient` node. The nodes in `peers` are assumed to be
+        * direct peers with the `recipient`.
+        */
+       Result_CVec_BlindedPathZNoneZ create_blinded_paths(byte[] recipient, byte[][] peers);
 }
 
 /**
@@ -49,6 +53,21 @@ public class MessageRouter : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
+               public long create_blinded_paths(long _recipient, long _peers) {
+                       byte[] _recipient_conv = InternalUtils.decodeUint8Array(_recipient);
+                       int _peers_conv_8_len = InternalUtils.getArrayLength(_peers);
+                       byte[][] _peers_conv_8_arr = new byte[_peers_conv_8_len][];
+                       for (int i = 0; i < _peers_conv_8_len; i++) {
+                               long _peers_conv_8 = InternalUtils.getU64ArrayElem(_peers, i);
+                               byte[] _peers_conv_8_conv = InternalUtils.decodeUint8Array(_peers_conv_8);
+                               _peers_conv_8_arr[i] = _peers_conv_8_conv;
+                       }
+                       bindings.free_buffer(_peers);
+                       Result_CVec_BlindedPathZNoneZ ret = arg.create_blinded_paths(_recipient_conv, _peers_conv_8_arr);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
        }
 
        /** Creates a new instance of MessageRouter from a given implementation */
@@ -78,5 +97,19 @@ public class MessageRouter : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Creates [`BlindedPath`]s to the `recipient` node. The nodes in `peers` are assumed to be
+        * direct peers with the `recipient`.
+        */
+       public Result_CVec_BlindedPathZNoneZ create_blinded_paths(byte[] recipient, byte[][] peers) {
+               long ret = bindings.MessageRouter_create_blinded_paths(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(recipient, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(peers, peers_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(peers_conv_8, 33)))));
+               GC.KeepAlive(this);
+               GC.KeepAlive(recipient);
+               GC.KeepAlive(peers);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_BlindedPathZNoneZ ret_hu_conv = Result_CVec_BlindedPathZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
 }
 } } }
index 04f383068f3ffb4d493bdd04178671d867ad77f1..fb60dee8ec70f1aa0ba5e41f4a864312bb7af239 100644 (file)
@@ -25,32 +25,36 @@ public class MessageSendEvent : CommonBase {
                        case 3: return new MessageSendEvent_SendOpenChannelV2(ptr);
                        case 4: return new MessageSendEvent_SendFundingCreated(ptr);
                        case 5: return new MessageSendEvent_SendFundingSigned(ptr);
-                       case 6: return new MessageSendEvent_SendTxAddInput(ptr);
-                       case 7: return new MessageSendEvent_SendTxAddOutput(ptr);
-                       case 8: return new MessageSendEvent_SendTxRemoveInput(ptr);
-                       case 9: return new MessageSendEvent_SendTxRemoveOutput(ptr);
-                       case 10: return new MessageSendEvent_SendTxComplete(ptr);
-                       case 11: return new MessageSendEvent_SendTxSignatures(ptr);
-                       case 12: return new MessageSendEvent_SendTxInitRbf(ptr);
-                       case 13: return new MessageSendEvent_SendTxAckRbf(ptr);
-                       case 14: return new MessageSendEvent_SendTxAbort(ptr);
-                       case 15: return new MessageSendEvent_SendChannelReady(ptr);
-                       case 16: return new MessageSendEvent_SendAnnouncementSignatures(ptr);
-                       case 17: return new MessageSendEvent_UpdateHTLCs(ptr);
-                       case 18: return new MessageSendEvent_SendRevokeAndACK(ptr);
-                       case 19: return new MessageSendEvent_SendClosingSigned(ptr);
-                       case 20: return new MessageSendEvent_SendShutdown(ptr);
-                       case 21: return new MessageSendEvent_SendChannelReestablish(ptr);
-                       case 22: return new MessageSendEvent_SendChannelAnnouncement(ptr);
-                       case 23: return new MessageSendEvent_BroadcastChannelAnnouncement(ptr);
-                       case 24: return new MessageSendEvent_BroadcastChannelUpdate(ptr);
-                       case 25: return new MessageSendEvent_BroadcastNodeAnnouncement(ptr);
-                       case 26: return new MessageSendEvent_SendChannelUpdate(ptr);
-                       case 27: return new MessageSendEvent_HandleError(ptr);
-                       case 28: return new MessageSendEvent_SendChannelRangeQuery(ptr);
-                       case 29: return new MessageSendEvent_SendShortIdsQuery(ptr);
-                       case 30: return new MessageSendEvent_SendReplyChannelRange(ptr);
-                       case 31: return new MessageSendEvent_SendGossipTimestampFilter(ptr);
+                       case 6: return new MessageSendEvent_SendStfu(ptr);
+                       case 7: return new MessageSendEvent_SendSplice(ptr);
+                       case 8: return new MessageSendEvent_SendSpliceAck(ptr);
+                       case 9: return new MessageSendEvent_SendSpliceLocked(ptr);
+                       case 10: return new MessageSendEvent_SendTxAddInput(ptr);
+                       case 11: return new MessageSendEvent_SendTxAddOutput(ptr);
+                       case 12: return new MessageSendEvent_SendTxRemoveInput(ptr);
+                       case 13: return new MessageSendEvent_SendTxRemoveOutput(ptr);
+                       case 14: return new MessageSendEvent_SendTxComplete(ptr);
+                       case 15: return new MessageSendEvent_SendTxSignatures(ptr);
+                       case 16: return new MessageSendEvent_SendTxInitRbf(ptr);
+                       case 17: return new MessageSendEvent_SendTxAckRbf(ptr);
+                       case 18: return new MessageSendEvent_SendTxAbort(ptr);
+                       case 19: return new MessageSendEvent_SendChannelReady(ptr);
+                       case 20: return new MessageSendEvent_SendAnnouncementSignatures(ptr);
+                       case 21: return new MessageSendEvent_UpdateHTLCs(ptr);
+                       case 22: return new MessageSendEvent_SendRevokeAndACK(ptr);
+                       case 23: return new MessageSendEvent_SendClosingSigned(ptr);
+                       case 24: return new MessageSendEvent_SendShutdown(ptr);
+                       case 25: return new MessageSendEvent_SendChannelReestablish(ptr);
+                       case 26: return new MessageSendEvent_SendChannelAnnouncement(ptr);
+                       case 27: return new MessageSendEvent_BroadcastChannelAnnouncement(ptr);
+                       case 28: return new MessageSendEvent_BroadcastChannelUpdate(ptr);
+                       case 29: return new MessageSendEvent_BroadcastNodeAnnouncement(ptr);
+                       case 30: return new MessageSendEvent_SendChannelUpdate(ptr);
+                       case 31: return new MessageSendEvent_HandleError(ptr);
+                       case 32: return new MessageSendEvent_SendChannelRangeQuery(ptr);
+                       case 33: return new MessageSendEvent_SendShortIdsQuery(ptr);
+                       case 34: return new MessageSendEvent_SendReplyChannelRange(ptr);
+                       case 35: return new MessageSendEvent_SendGossipTimestampFilter(ptr);
                        default:
                                throw new ArgumentException("Impossible enum variant");
                }
@@ -176,6 +180,86 @@ public class MessageSendEvent : CommonBase {
                        this.msg = msg_hu_conv;
                }
        }
+       /** A MessageSendEvent of type SendStfu */
+       public class MessageSendEvent_SendStfu : MessageSendEvent {
+               /**
+                * The node_id of the node which should receive this message
+                */
+               public byte[] node_id;
+               /**
+                * The message which should be sent.
+                */
+               public Stfu msg;
+               internal MessageSendEvent_SendStfu(long ptr) : base(null, ptr) {
+                       long node_id = bindings.LDKMessageSendEvent_SendStfu_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
+                       long msg = bindings.LDKMessageSendEvent_SendStfu_get_msg(ptr);
+                       org.ldk.structs.Stfu msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.Stfu(null, msg); }
+                       if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
+                       this.msg = msg_hu_conv;
+               }
+       }
+       /** A MessageSendEvent of type SendSplice */
+       public class MessageSendEvent_SendSplice : MessageSendEvent {
+               /**
+                * The node_id of the node which should receive this message
+                */
+               public byte[] node_id;
+               /**
+                * The message which should be sent.
+                */
+               public Splice msg;
+               internal MessageSendEvent_SendSplice(long ptr) : base(null, ptr) {
+                       long node_id = bindings.LDKMessageSendEvent_SendSplice_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
+                       long msg = bindings.LDKMessageSendEvent_SendSplice_get_msg(ptr);
+                       org.ldk.structs.Splice msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.Splice(null, msg); }
+                       if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
+                       this.msg = msg_hu_conv;
+               }
+       }
+       /** A MessageSendEvent of type SendSpliceAck */
+       public class MessageSendEvent_SendSpliceAck : MessageSendEvent {
+               /**
+                * The node_id of the node which should receive this message
+                */
+               public byte[] node_id;
+               /**
+                * The message which should be sent.
+                */
+               public SpliceAck msg;
+               internal MessageSendEvent_SendSpliceAck(long ptr) : base(null, ptr) {
+                       long node_id = bindings.LDKMessageSendEvent_SendSpliceAck_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
+                       long msg = bindings.LDKMessageSendEvent_SendSpliceAck_get_msg(ptr);
+                       org.ldk.structs.SpliceAck msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.SpliceAck(null, msg); }
+                       if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
+                       this.msg = msg_hu_conv;
+               }
+       }
+       /** A MessageSendEvent of type SendSpliceLocked */
+       public class MessageSendEvent_SendSpliceLocked : MessageSendEvent {
+               /**
+                * The node_id of the node which should receive this message
+                */
+               public byte[] node_id;
+               /**
+                * The message which should be sent.
+                */
+               public SpliceLocked msg;
+               internal MessageSendEvent_SendSpliceLocked(long ptr) : base(null, ptr) {
+                       long node_id = bindings.LDKMessageSendEvent_SendSpliceLocked_get_node_id(ptr);
+                       byte[] node_id_conv = InternalUtils.decodeUint8Array(node_id);
+                       this.node_id = node_id_conv;
+                       long msg = bindings.LDKMessageSendEvent_SendSpliceLocked_get_msg(ptr);
+                       org.ldk.structs.SpliceLocked msg_hu_conv = null; if (msg < 0 || msg > 4096) { msg_hu_conv = new org.ldk.structs.SpliceLocked(null, msg); }
+                       if (msg_hu_conv != null) { msg_hu_conv.ptrs_to.AddLast(this); };
+                       this.msg = msg_hu_conv;
+               }
+       }
        /** A MessageSendEvent of type SendTxAddInput */
        public class MessageSendEvent_SendTxAddInput : MessageSendEvent {
                /**
@@ -795,6 +879,62 @@ public class MessageSendEvent : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Utility method to constructs a new SendStfu-variant MessageSendEvent
+        */
+       public static MessageSendEvent send_stfu(byte[] node_id, org.ldk.structs.Stfu msg) {
+               long ret = bindings.MessageSendEvent_send_stfu(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(node_id);
+               GC.KeepAlive(msg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.MessageSendEvent ret_hu_conv = org.ldk.structs.MessageSendEvent.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(msg); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new SendSplice-variant MessageSendEvent
+        */
+       public static MessageSendEvent send_splice(byte[] node_id, org.ldk.structs.Splice msg) {
+               long ret = bindings.MessageSendEvent_send_splice(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(node_id);
+               GC.KeepAlive(msg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.MessageSendEvent ret_hu_conv = org.ldk.structs.MessageSendEvent.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(msg); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new SendSpliceAck-variant MessageSendEvent
+        */
+       public static MessageSendEvent send_splice_ack(byte[] node_id, org.ldk.structs.SpliceAck msg) {
+               long ret = bindings.MessageSendEvent_send_splice_ack(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(node_id);
+               GC.KeepAlive(msg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.MessageSendEvent ret_hu_conv = org.ldk.structs.MessageSendEvent.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(msg); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new SendSpliceLocked-variant MessageSendEvent
+        */
+       public static MessageSendEvent send_splice_locked(byte[] node_id, org.ldk.structs.SpliceLocked msg) {
+               long ret = bindings.MessageSendEvent_send_splice_locked(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(node_id, 33)), msg == null ? 0 : msg.ptr);
+               GC.KeepAlive(node_id);
+               GC.KeepAlive(msg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.MessageSendEvent ret_hu_conv = org.ldk.structs.MessageSendEvent.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(msg); };
+               return ret_hu_conv;
+       }
+
        /**
         * Utility method to constructs a new SendTxAddInput-variant MessageSendEvent
         */
index ff9b89d0b2e08643238ccb7b033eae318d7c26c8..6a3c5447b8531a4edb6f708edb0bf4bac9404c48 100644 (file)
@@ -80,9 +80,10 @@ namespace org { namespace ldk { namespace structs {
  * 
  * # Pruning stale channel updates
  * 
- * Stale updates are pruned when a full monitor is written. The old monitor is first read, and if
- * that succeeds, updates in the range between the old and new monitors are deleted. The `lazy`
- * flag is used on the [`KVStore::remove`] method, so there are no guarantees that the deletions
+ * Stale updates are pruned when the consolidation threshold is reached according to `maximum_pending_updates`.
+ * Monitor updates in the range between the latest `update_id` and `update_id - maximum_pending_updates`
+ * are deleted.
+ * The `lazy` flag is used on the [`KVStore::remove`] method, so there are no guarantees that the deletions
  * will complete. However, stale updates are not a problem for data integrity, since updates are
  * only read that are higher than the stored [`ChannelMonitor`]'s `update_id`.
  * 
index 84c9daa85f4083873191e5d97dd9864410bb2de7..8121cf1423f4090a4ae1e23e3a0b95e97203dfc6 100644 (file)
@@ -62,6 +62,18 @@ public class NodeAlias : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the NodeAlias.
+        */
+       public long hash() {
+               long ret = bindings.NodeAlias_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two NodeAliass contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 4b870b48d8d099dceb6e9da3ba0289b9760ad277..ae3319556e1e21d588cbd96e288fa82b439fd090 100644 (file)
@@ -91,6 +91,18 @@ public class NodeAnnouncement : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the NodeAnnouncement.
+        */
+       public long hash() {
+               long ret = bindings.NodeAnnouncement_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two NodeAnnouncements contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 83fa4df267fbfd030a11ec9f3afe2d928b84d1b1..32eaf48f9b472d4dd15c9d32f2c5b15807073618 100644 (file)
@@ -50,6 +50,18 @@ public class NodeFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the NodeFeatures.
+        */
+       public long hash() {
+               long ret = bindings.NodeFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
@@ -516,6 +528,40 @@ public class NodeFeatures : CommonBase {
                return ret;
        }
 
+       /**
+        * Set this feature as optional.
+        */
+       public void set_route_blinding_optional() {
+               bindings.NodeFeatures_set_route_blinding_optional(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Set this feature as required.
+        */
+       public void set_route_blinding_required() {
+               bindings.NodeFeatures_set_route_blinding_required(this.ptr);
+               GC.KeepAlive(this);
+       }
+
+       /**
+        * Checks if this feature is supported.
+        */
+       public bool supports_route_blinding() {
+               bool ret = bindings.NodeFeatures_supports_route_blinding(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Checks if this feature is required.
+        */
+       public bool requires_route_blinding() {
+               bool ret = bindings.NodeFeatures_requires_route_blinding(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
        /**
         * Set this feature as optional.
         */
index 0aa9014c1fa0305f02b33a7dceb3a04b17f51c15..b5b0522c707644e5c23ae57b6ea6447d6071ccc4 100644 (file)
@@ -56,6 +56,17 @@ public class NodeId : CommonBase {
                return ret_conv;
        }
 
+       /**
+        * Get the public key as an array from this NodeId
+        */
+       public byte[] as_array() {
+               long ret = bindings.NodeId_as_array(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
        /**
         * Get the public key from this NodeId
         */
index 2ac035d9703463e7d0b65c2478f105e753ff03da..8ff67b8a9e4d18223338b2acdda220680fd6fc18 100644 (file)
@@ -208,6 +208,16 @@ public class Offer : CommonBase {
                return ret;
        }
 
+       /**
+        * Whether the offer has expired given the duration since the Unix epoch.
+        */
+       public bool is_expired_no_std(long duration_since_epoch) {
+               bool ret = bindings.Offer_is_expired_no_std(this.ptr, duration_since_epoch);
+               GC.KeepAlive(this);
+               GC.KeepAlive(duration_since_epoch);
+               return ret;
+       }
+
        /**
         * Returns whether the given quantity is valid for the offer.
         */
index 9bfc37876ef2c6131170321633dbac5486e564e0..8e6af54be25f154ad8c7f0efd6114a3467934655 100644 (file)
@@ -50,6 +50,18 @@ public class OfferFeatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the OfferFeatures.
+        */
+       public long hash() {
+               long ret = bindings.OfferFeatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Create a blank Features with no features set
         */
index af4a42f0daf428a2c78a026aa7ea8e9c79109791..4f146f1ea6a1895f735e6db3aeefa949849452fb 100644 (file)
@@ -114,6 +114,19 @@ public class OffersMessage : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Constructs a new OnionMessageContents which calls the relevant methods on this_arg.
+        * This copies the `inner` pointer in this_arg and thus the returned OnionMessageContents must be freed before this_arg is
+        */
+       public OnionMessageContents as_OnionMessageContents() {
+               long ret = bindings.OffersMessage_as_OnionMessageContents(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               OnionMessageContents ret_hu_conv = new OnionMessageContents(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
        /**
         * Serialize the OffersMessage object into a byte array which can be read by OffersMessage_read
         */
index e5fc001a6a569c729132c7f6948d8e361081d7d9..09ccab939cf0bbf45fd2bdbeab9505031f8a7020 100644 (file)
@@ -15,7 +15,7 @@ public interface OffersMessageHandlerInterface {
         * 
         * The returned [`OffersMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
         * 
-        * [`OnionMessenger`]: crate::onion_message::OnionMessenger
+        * [`OnionMessenger`]: crate::onion_message::messenger::OnionMessenger
         */
        Option_OffersMessageZ handle_message(OffersMessage message);
        /**Releases any [`OffersMessage`]s that need to be sent.
@@ -80,7 +80,7 @@ public class OffersMessageHandler : CommonBase {
         * 
         * The returned [`OffersMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
         * 
-        * [`OnionMessenger`]: crate::onion_message::OnionMessenger
+        * [`OnionMessenger`]: crate::onion_message::messenger::OnionMessenger
         */
        public Option_OffersMessageZ handle_message(org.ldk.structs.OffersMessage message) {
                long ret = bindings.OffersMessageHandler_handle_message(this.ptr, message.ptr);
diff --git a/c_sharp/src/org/ldk/structs/OneHopBlindedPathCandidate.cs b/c_sharp/src/org/ldk/structs/OneHopBlindedPathCandidate.cs
new file mode 100644 (file)
index 0000000..de03256
--- /dev/null
@@ -0,0 +1,37 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A [`CandidateRouteHop::OneHopBlinded`] entry.
+ */
+public class OneHopBlindedPathCandidate : CommonBase {
+       internal OneHopBlindedPathCandidate(object _dummy, long ptr) : base(ptr) { }
+       ~OneHopBlindedPathCandidate() {
+               if (ptr != 0) { bindings.OneHopBlindedPathCandidate_free(ptr); }
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.OneHopBlindedPathCandidate_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the OneHopBlindedPathCandidate
+        */
+       public OneHopBlindedPathCandidate clone() {
+               long ret = bindings.OneHopBlindedPathCandidate_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OneHopBlindedPathCandidate ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OneHopBlindedPathCandidate(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 47c72bafa455de22f59cfff7851d525b81e15360..c7e1d4ab8d828b760af24958fd4631e9f145ce19 100644 (file)
@@ -89,6 +89,18 @@ public class OnionMessage : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the OnionMessage.
+        */
+       public long hash() {
+               long ret = bindings.OnionMessage_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two OnionMessages contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 8bd84802e170a76e61486fa7636744215f884989..61f863d956850b124652e198ec78d59db51bcec4 100644 (file)
@@ -16,6 +16,9 @@ public interface OnionMessageContentsInterface {
        /**Serialize the object into a byte array
         */
        byte[] write();
+       /**Return a human-readable "debug" string describing this object
+        */
+       string debug_str();
 }
 
 /**
@@ -46,6 +49,12 @@ public class OnionMessageContents : CommonBase {
                        long result = InternalUtils.encodeUint8Array(ret);
                        return result;
                }
+               public long debug_str() {
+                       string ret = arg.debug_str();
+                               GC.KeepAlive(arg);
+                       long result = InternalUtils.encodeString(ret);
+                       return result;
+               }
        }
 
        /** Creates a new instance of OnionMessageContents from a given implementation */
@@ -80,6 +89,17 @@ public class OnionMessageContents : CommonBase {
                return ret_conv;
        }
 
+       /**
+        * Return a human-readable "debug" string describing this object
+        */
+       public string debug_str() {
+               long ret = bindings.OnionMessageContents_debug_str(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
+       }
+
        internal long clone_ptr() {
                long ret = bindings.OnionMessageContents_clone_ptr(this.ptr);
                GC.KeepAlive(this);
index ac96df6ff70aa00bff3d27d61cd240e48193c592..30dccb5b3ef953e580758389cfe34561374c69c3 100644 (file)
@@ -10,6 +10,15 @@ namespace org { namespace ldk { namespace structs {
 
 /** An implementation of OnionMessageHandler */
 public interface OnionMessageHandlerInterface {
+       /**Because much of the lightning network does not yet support forwarding onion messages, we
+        * may need to directly connect to a node which will forward a message for us. In such a case,
+        * this method will return the set of nodes which need connection by node_id and the
+        * corresponding socket addresses where they may accept incoming connections.
+        * 
+        * Thus, this method should be polled regularly to detect messages await such a direct
+        * connection.
+        */
+       TwoTuple_PublicKeyCVec_SocketAddressZZ[] get_and_clear_connections_needed();
        /**Handle an incoming `onion_message` message from the given peer.
         */
        void handle_onion_message(byte[] peer_node_id, OnionMessage msg);
@@ -30,6 +39,10 @@ public interface OnionMessageHandlerInterface {
         * drop and refuse to forward onion messages to this peer.
         */
        void peer_disconnected(byte[] their_node_id);
+       /**Performs actions that should happen roughly every ten seconds after startup. Allows handlers
+        * to drop any buffered onion messages intended for prospective peers.
+        */
+       void timer_tick_occurred();
        /**Gets the node feature flags which this handler itself supports. All available handlers are
         * queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
         * which are broadcasted in our [`NodeAnnouncement`] message.
@@ -61,6 +74,12 @@ public class OnionMessageHandler : CommonBase {
                internal LDKOnionMessageHandlerImpl(OnionMessageHandlerInterface arg, LDKOnionMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private OnionMessageHandlerInterface arg;
                private LDKOnionMessageHandlerHolder impl_holder;
+               public long get_and_clear_connections_needed() {
+                       TwoTuple_PublicKeyCVec_SocketAddressZZ[] ret = arg.get_and_clear_connections_needed();
+                               GC.KeepAlive(arg);
+                       long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_40 => ret_conv_40 == null ? 0 : ret_conv_40.clone_ptr()));
+                       return result;
+               }
                public void handle_onion_message(long _peer_node_id, long _msg) {
                        byte[] _peer_node_id_conv = InternalUtils.decodeUint8Array(_peer_node_id);
                        org.ldk.structs.OnionMessage _msg_hu_conv = null; if (_msg < 0 || _msg > 4096) { _msg_hu_conv = new org.ldk.structs.OnionMessage(null, _msg); }
@@ -87,6 +106,10 @@ public class OnionMessageHandler : CommonBase {
                        arg.peer_disconnected(_their_node_id_conv);
                                GC.KeepAlive(arg);
                }
+               public void timer_tick_occurred() {
+                       arg.timer_tick_occurred();
+                               GC.KeepAlive(arg);
+               }
                public long provided_node_features() {
                        NodeFeatures ret = arg.provided_node_features();
                                GC.KeepAlive(arg);
@@ -114,6 +137,31 @@ public class OnionMessageHandler : CommonBase {
                return impl_holder.held;
        }
 
+       /**
+        * Because much of the lightning network does not yet support forwarding onion messages, we
+        * may need to directly connect to a node which will forward a message for us. In such a case,
+        * this method will return the set of nodes which need connection by node_id and the
+        * corresponding socket addresses where they may accept incoming connections.
+        * 
+        * Thus, this method should be polled regularly to detect messages await such a direct
+        * connection.
+        */
+       public TwoTuple_PublicKeyCVec_SocketAddressZZ[] get_and_clear_connections_needed() {
+               long ret = bindings.OnionMessageHandler_get_and_clear_connections_needed(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_40_len = InternalUtils.getArrayLength(ret);
+               TwoTuple_PublicKeyCVec_SocketAddressZZ[] ret_conv_40_arr = new TwoTuple_PublicKeyCVec_SocketAddressZZ[ret_conv_40_len];
+               for (int o = 0; o < ret_conv_40_len; o++) {
+                       long ret_conv_40 = InternalUtils.getU64ArrayElem(ret, o);
+                       TwoTuple_PublicKeyCVec_SocketAddressZZ ret_conv_40_hu_conv = new TwoTuple_PublicKeyCVec_SocketAddressZZ(null, ret_conv_40);
+                       if (ret_conv_40_hu_conv != null) { ret_conv_40_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_40_arr[o] = ret_conv_40_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_40_arr;
+       }
+
        /**
         * Handle an incoming `onion_message` message from the given peer.
         */
@@ -170,6 +218,15 @@ public class OnionMessageHandler : CommonBase {
                GC.KeepAlive(their_node_id);
        }
 
+       /**
+        * Performs actions that should happen roughly every ten seconds after startup. Allows handlers
+        * to drop any buffered onion messages intended for prospective peers.
+        */
+       public void timer_tick_occurred() {
+               bindings.OnionMessageHandler_timer_tick_occurred(this.ptr);
+               GC.KeepAlive(this);
+       }
+
        /**
         * Gets the node feature flags which this handler itself supports. All available handlers are
         * queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
index 087c20277d81854d988618b8d91fee9ad75fc0c5..f7d573a43e7161d911b8b466796c78f11c835f9f 100644 (file)
@@ -66,17 +66,49 @@ public class OnionMessagePath : CommonBase {
                if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
+       /**
+        * Addresses that may be used to connect to [`OnionMessagePath::first_node`].
+        * 
+        * Only needs to be set if a connection to the node is required. [`OnionMessenger`] may use
+        * this to initiate such a connection.
+        * 
+        * Returns a copy of the field.
+        */
+       public Option_CVec_SocketAddressZZ get_first_node_addresses() {
+               long ret = bindings.OnionMessagePath_get_first_node_addresses(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_SocketAddressZZ ret_hu_conv = org.ldk.structs.Option_CVec_SocketAddressZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Addresses that may be used to connect to [`OnionMessagePath::first_node`].
+        * 
+        * Only needs to be set if a connection to the node is required. [`OnionMessenger`] may use
+        * this to initiate such a connection.
+        */
+       public void set_first_node_addresses(org.ldk.structs.Option_CVec_SocketAddressZZ val) {
+               bindings.OnionMessagePath_set_first_node_addresses(this.ptr, val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
        /**
         * Constructs a new OnionMessagePath given each field
         */
-       public static OnionMessagePath of(byte[][] intermediate_nodes_arg, org.ldk.structs.Destination destination_arg) {
-               long ret = bindings.OnionMessagePath_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(intermediate_nodes_arg, intermediate_nodes_arg_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(intermediate_nodes_arg_conv_8, 33)))), destination_arg.ptr);
+       public static OnionMessagePath of(byte[][] intermediate_nodes_arg, org.ldk.structs.Destination destination_arg, org.ldk.structs.Option_CVec_SocketAddressZZ first_node_addresses_arg) {
+               long ret = bindings.OnionMessagePath_new(InternalUtils.encodeUint64Array(InternalUtils.mapArray(intermediate_nodes_arg, intermediate_nodes_arg_conv_8 => InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(intermediate_nodes_arg_conv_8, 33)))), destination_arg.ptr, first_node_addresses_arg.ptr);
                GC.KeepAlive(intermediate_nodes_arg);
                GC.KeepAlive(destination_arg);
+               GC.KeepAlive(first_node_addresses_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.OnionMessagePath ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OnionMessagePath(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(destination_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(first_node_addresses_arg); };
                return ret_hu_conv;
        }
 
@@ -98,5 +130,16 @@ public class OnionMessagePath : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Returns the first node in the path.
+        */
+       public byte[] first_node() {
+               long ret = bindings.OnionMessagePath_first_node(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
 }
 } } }
index 5ad8a929c735416ac93bd6a87a6d3bd3ab33fb5e..3bf8b6dfc90c88dfd2444f9e19d14eb4ae37d15d 100644 (file)
@@ -28,11 +28,12 @@ namespace org { namespace ldk { namespace structs {
  * ```
  * # extern crate bitcoin;
  * # use bitcoin::hashes::_export::_core::time::Duration;
- * # use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
+ * # use bitcoin::hashes::hex::FromHex;
+ * # use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey, self};
  * # use lightning::blinded_path::BlindedPath;
- * # use lightning::sign::KeysManager;
+ * # use lightning::sign::{EntropySource, KeysManager};
  * # use lightning::ln::peer_handler::IgnoringMessageHandler;
- * # use lightning::onion_message::messenger::{Destination, MessageRouter, OnionMessenger, OnionMessagePath};
+ * # use lightning::onion_message::messenger::{Destination, MessageRouter, OnionMessagePath, OnionMessenger};
  * # use lightning::onion_message::packet::OnionMessageContents;
  * # use lightning::util::logger::{Logger, Record};
  * # use lightning::util::ser::{Writeable, Writer};
@@ -40,22 +41,35 @@ namespace org { namespace ldk { namespace structs {
  * # use std::sync::Arc;
  * # struct FakeLogger;
  * # impl Logger for FakeLogger {
- * #     fn log(&self, record: &Record) { unimplemented!() }
+ * #     fn log(&self, record: Record) { println!(\"{:?}\" , record); }
  * # }
  * # struct FakeMessageRouter {}
  * # impl MessageRouter for FakeMessageRouter {
  * #     fn find_path(&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination) -> Result<OnionMessagePath, ()> {
- * #         unimplemented!()
+ * #         let secp_ctx = Secp256k1::new();
+ * #         let node_secret = SecretKey::from_slice(&<Vec<u8>>::from_hex(\"0101010101010101010101010101010101010101010101010101010101010101\").unwrap()[..]).unwrap();
+ * #         let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
+ * #         let hop_node_id2 = hop_node_id1;
+ * #         Ok(OnionMessagePath {
+ * #             intermediate_nodes: vec![hop_node_id1, hop_node_id2],
+ * #             destination,
+ * #             first_node_addresses: None,
+ * #         })
+ * #     }
+ * #     fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
+ * #         &self, _recipient: PublicKey, _peers: Vec<PublicKey>, _secp_ctx: &Secp256k1<T>
+ * #     ) -> Result<Vec<BlindedPath>, ()> {
+ * #         unreachable!()
  * #     }
  * # }
  * # let seed = [42u8; 32];
  * # let time = Duration::from_secs(123456);
  * # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
  * # let logger = Arc::new(FakeLogger {});
- * # let node_secret = SecretKey::from_slice(&hex::decode(\"0101010101010101010101010101010101010101010101010101010101010101\").unwrap()[..]).unwrap();
+ * # let node_secret = SecretKey::from_slice(&<Vec<u8>>::from_hex(\"0101010101010101010101010101010101010101010101010101010101010101\").unwrap()[..]).unwrap();
  * # let secp_ctx = Secp256k1::new();
  * # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
- * # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
+ * # let (hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1);
  * # let destination_node_id = hop_node_id1;
  * # let message_router = Arc::new(FakeMessageRouter {});
  * # let custom_message_handler = IgnoringMessageHandler {};
@@ -67,7 +81,7 @@ namespace org { namespace ldk { namespace structs {
  * &custom_message_handler
  * );
  * 
- * # #[derive(Clone)]
+ * # #[derive(Debug, Clone)]
  * # struct YourCustomMessage {}
  * impl Writeable for YourCustomMessage {
  * \tfn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
@@ -82,13 +96,10 @@ namespace org { namespace ldk { namespace structs {
  * \t}
  * }
  * Send a custom onion message to a node id.
- * let path = OnionMessagePath {
- * \tintermediate_nodes: vec![hop_node_id1, hop_node_id2],
- * \tdestination: Destination::Node(destination_node_id),
- * };
+ * let destination = Destination::Node(destination_node_id);
  * let reply_path = None;
  * # let message = YourCustomMessage {};
- * onion_messenger.send_onion_message(path, message, reply_path);
+ * onion_messenger.send_onion_message(message, destination, reply_path);
  * 
  * Create a blinded path to yourself, for someone to send an onion message to.
  * # let your_node_id = hop_node_id1;
@@ -96,13 +107,10 @@ namespace org { namespace ldk { namespace structs {
  * let blinded_path = BlindedPath::new_for_message(&hops, &keys_manager, &secp_ctx).unwrap();
  * 
  * Send a custom onion message to a blinded path.
- * let path = OnionMessagePath {
- * \tintermediate_nodes: vec![hop_node_id1, hop_node_id2],
- * \tdestination: Destination::BlindedPath(blinded_path),
- * };
+ * let destination = Destination::BlindedPath(blinded_path);
  * let reply_path = None;
  * # let message = YourCustomMessage {};
- * onion_messenger.send_onion_message(path, message, reply_path);
+ * onion_messenger.send_onion_message(message, destination, reply_path);
  * ```
  * 
  * [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
@@ -139,23 +147,22 @@ public class OnionMessenger : CommonBase {
        }
 
        /**
-        * Sends an [`OnionMessage`] with the given `contents` for sending to the destination of
-        * `path`.
+        * Sends an [`OnionMessage`] with the given `contents` to `destination`.
         * 
         * See [`OnionMessenger`] for example usage.
         * 
         * Note that reply_path (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public Result_NoneSendErrorZ send_onion_message(org.ldk.structs.OnionMessagePath path, org.ldk.structs.OnionMessageContents contents, org.ldk.structs.BlindedPath reply_path) {
-               long ret = bindings.OnionMessenger_send_onion_message(this.ptr, path == null ? 0 : path.ptr, contents.ptr, reply_path == null ? 0 : reply_path.ptr);
+       public Result_SendSuccessSendErrorZ send_onion_message(org.ldk.structs.OnionMessageContents contents, org.ldk.structs.Destination destination, org.ldk.structs.BlindedPath reply_path) {
+               long ret = bindings.OnionMessenger_send_onion_message(this.ptr, contents.ptr, destination.ptr, reply_path == null ? 0 : reply_path.ptr);
                GC.KeepAlive(this);
-               GC.KeepAlive(path);
                GC.KeepAlive(contents);
+               GC.KeepAlive(destination);
                GC.KeepAlive(reply_path);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneSendErrorZ ret_hu_conv = Result_NoneSendErrorZ.constr_from_ptr(ret);
-               if (this != null) { this.ptrs_to.AddLast(path); };
+               Result_SendSuccessSendErrorZ ret_hu_conv = Result_SendSuccessSendErrorZ.constr_from_ptr(ret);
                if (this != null) { this.ptrs_to.AddLast(contents); };
+               if (this != null) { this.ptrs_to.AddLast(destination); };
                if (this != null) { this.ptrs_to.AddLast(reply_path); };
                return ret_hu_conv;
        }
diff --git a/c_sharp/src/org/ldk/structs/OnionPacket.cs b/c_sharp/src/org/ldk/structs/OnionPacket.cs
new file mode 100644 (file)
index 0000000..0658533
--- /dev/null
@@ -0,0 +1,156 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * BOLT 4 onion packet including hop data for the next peer.
+ */
+public class OnionPacket : CommonBase {
+       internal OnionPacket(object _dummy, long ptr) : base(ptr) { }
+       ~OnionPacket() {
+               if (ptr != 0) { bindings.OnionPacket_free(ptr); }
+       }
+
+       /**
+        * BOLT 4 version number.
+        */
+       public byte get_version() {
+               byte ret = bindings.OnionPacket_get_version(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * BOLT 4 version number.
+        */
+       public void set_version(byte val) {
+               bindings.OnionPacket_set_version(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * In order to ensure we always return an error on onion decode in compliance with [BOLT
+        * #4](https://github.com/lightning/bolts/blob/master/04-onion-routing.md), we have to
+        * deserialize `OnionPacket`s contained in [`UpdateAddHTLC`] messages even if the ephemeral
+        * public key (here) is bogus, so we hold a [`Result`] instead of a [`PublicKey`] as we'd
+        * like.
+        * 
+        * Returns a copy of the field.
+        */
+       public Result_PublicKeySecp256k1ErrorZ get_public_key() {
+               long ret = bindings.OnionPacket_get_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PublicKeySecp256k1ErrorZ ret_hu_conv = Result_PublicKeySecp256k1ErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * In order to ensure we always return an error on onion decode in compliance with [BOLT
+        * #4](https://github.com/lightning/bolts/blob/master/04-onion-routing.md), we have to
+        * deserialize `OnionPacket`s contained in [`UpdateAddHTLC`] messages even if the ephemeral
+        * public key (here) is bogus, so we hold a [`Result`] instead of a [`PublicKey`] as we'd
+        * like.
+        */
+       public void set_public_key(org.ldk.structs.Result_PublicKeySecp256k1ErrorZ val) {
+               bindings.OnionPacket_set_public_key(this.ptr, val != null ? val.ptr : 0);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * HMAC to verify the integrity of hop_data.
+        */
+       public byte[] get_hmac() {
+               long ret = bindings.OnionPacket_get_hmac(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * HMAC to verify the integrity of hop_data.
+        */
+       public void set_hmac(byte[] val) {
+               bindings.OnionPacket_set_hmac(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.OnionPacket_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the OnionPacket
+        */
+       public OnionPacket clone() {
+               long ret = bindings.OnionPacket_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OnionPacket ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OnionPacket(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Generates a non-cryptographic 64-bit hash of the OnionPacket.
+        */
+       public long hash() {
+               long ret = bindings.OnionPacket_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
+       /**
+        * Checks if two OnionPackets contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.OnionPacket b) {
+               bool ret = bindings.OnionPacket_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is OnionPacket)) return false;
+               return this.eq((OnionPacket)o);
+       }
+       /**
+        * Serialize the OnionPacket object into a byte array which can be read by OnionPacket_read
+        */
+       public byte[] write() {
+               long ret = bindings.OnionPacket_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a OnionPacket from a byte array, created by OnionPacket_write
+        */
+       public static Result_OnionPacketDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.OnionPacket_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_OnionPacketDecodeErrorZ ret_hu_conv = Result_OnionPacketDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 9a0f4536c02d3a629e7adc2a4e6f4076f61fcae5..f46844fb760fe1edbb85367890deb611e7d9164b 100644 (file)
@@ -470,6 +470,18 @@ public class OpenChannel : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the OpenChannel.
+        */
+       public long hash() {
+               long ret = bindings.OpenChannel_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two OpenChannels contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 6ddfeb0e9f266a6998653c3cf039a0cb9c218e73..ec182be253b5e9b6762396a0241dd28e5bed6438 100644 (file)
@@ -510,6 +510,18 @@ public class OpenChannelV2 : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the OpenChannelV2.
+        */
+       public long hash() {
+               long ret = bindings.OpenChannelV2_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two OpenChannelV2s contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 3fad01ff4a8bdb5159221d7819f56d0e48afee15..ca6ec26f5649c432ed998d9b5f34310aaee940d9 100644 (file)
@@ -128,6 +128,18 @@ public class Packet : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Packet.
+        */
+       public long hash() {
+               long ret = bindings.Packet_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two Packets contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
diff --git a/c_sharp/src/org/ldk/structs/PaymentError.cs b/c_sharp/src/org/ldk/structs/PaymentError.cs
deleted file mode 100644 (file)
index 7df158b..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An error that may occur when making a payment.
- */
-public class PaymentError : CommonBase {
-       protected PaymentError(object _dummy, long ptr) : base(ptr) { }
-       ~PaymentError() {
-               if (ptr != 0) { bindings.PaymentError_free(ptr); }
-       }
-
-       internal static PaymentError constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKPaymentError_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new PaymentError_Invoice(ptr);
-                       case 1: return new PaymentError_Sending(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A PaymentError of type Invoice */
-       public class PaymentError_Invoice : PaymentError {
-               public string invoice;
-               internal PaymentError_Invoice(long ptr) : base(null, ptr) {
-                       long invoice = bindings.LDKPaymentError_Invoice_get_invoice(ptr);
-                       string invoice_conv = InternalUtils.decodeString(invoice);
-                       this.invoice = invoice_conv;
-               }
-       }
-       /** A PaymentError of type Sending */
-       public class PaymentError_Sending : PaymentError {
-               public RetryableSendFailure sending;
-               internal PaymentError_Sending(long ptr) : base(null, ptr) {
-                       this.sending = bindings.LDKPaymentError_Sending_get_sending(ptr);
-               }
-       }
-       internal long clone_ptr() {
-               long ret = bindings.PaymentError_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a copy of the PaymentError
-        */
-       public PaymentError clone() {
-               long ret = bindings.PaymentError_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.PaymentError ret_hu_conv = org.ldk.structs.PaymentError.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Utility method to constructs a new Invoice-variant PaymentError
-        */
-       public static PaymentError invoice(string a) {
-               long ret = bindings.PaymentError_invoice(InternalUtils.encodeString(a));
-               GC.KeepAlive(a);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.PaymentError ret_hu_conv = org.ldk.structs.PaymentError.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Utility method to constructs a new Sending-variant PaymentError
-        */
-       public static PaymentError sending(RetryableSendFailure a) {
-               long ret = bindings.PaymentError_sending(a);
-               GC.KeepAlive(a);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.PaymentError ret_hu_conv = org.ldk.structs.PaymentError.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if two PaymentErrors contain equal inner contents.
-        * This ignores pointers and is_owned flags and looks at the values in fields.
-        */
-       public bool eq(org.ldk.structs.PaymentError b) {
-               bool ret = bindings.PaymentError_eq(this.ptr, b == null ? 0 : b.ptr);
-               GC.KeepAlive(this);
-               GC.KeepAlive(b);
-               return ret;
-       }
-
-       public override bool Equals(object o) {
-               if (!(o is PaymentError)) return false;
-               return this.eq((PaymentError)o);
-       }
-}
-} } }
index 4ac140d34609451965eb06734f329207ce51ea98..3f38ad62c09e0e21a5a1dbfdaab6c633f84c12a0 100644 (file)
@@ -167,17 +167,44 @@ public class PaymentParameters : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * A list of indices corresponding to blinded paths in [`Payee::Blinded::route_hints`] which this
+        * payment was previously attempted over and which caused the payment to fail. Future attempts
+        * for the same payment shouldn't be relayed through any of these blinded paths.
+        * 
+        * Returns a copy of the field.
+        */
+       public long[] get_previously_failed_blinded_path_idxs() {
+               long ret = bindings.PaymentParameters_get_previously_failed_blinded_path_idxs(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               long[] ret_conv = InternalUtils.decodeUint64Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * A list of indices corresponding to blinded paths in [`Payee::Blinded::route_hints`] which this
+        * payment was previously attempted over and which caused the payment to fail. Future attempts
+        * for the same payment shouldn't be relayed through any of these blinded paths.
+        */
+       public void set_previously_failed_blinded_path_idxs(long[] val) {
+               bindings.PaymentParameters_set_previously_failed_blinded_path_idxs(this.ptr, InternalUtils.encodeUint64Array(val));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
        /**
         * Constructs a new PaymentParameters given each field
         */
-       public static PaymentParameters of(org.ldk.structs.Payee payee_arg, org.ldk.structs.Option_u64Z expiry_time_arg, int max_total_cltv_expiry_delta_arg, byte max_path_count_arg, byte max_channel_saturation_power_of_half_arg, long[] previously_failed_channels_arg) {
-               long ret = bindings.PaymentParameters_new(payee_arg.ptr, expiry_time_arg.ptr, max_total_cltv_expiry_delta_arg, max_path_count_arg, max_channel_saturation_power_of_half_arg, InternalUtils.encodeUint64Array(previously_failed_channels_arg));
+       public static PaymentParameters of(org.ldk.structs.Payee payee_arg, org.ldk.structs.Option_u64Z expiry_time_arg, int max_total_cltv_expiry_delta_arg, byte max_path_count_arg, byte max_channel_saturation_power_of_half_arg, long[] previously_failed_channels_arg, long[] previously_failed_blinded_path_idxs_arg) {
+               long ret = bindings.PaymentParameters_new(payee_arg.ptr, expiry_time_arg.ptr, max_total_cltv_expiry_delta_arg, max_path_count_arg, max_channel_saturation_power_of_half_arg, InternalUtils.encodeUint64Array(previously_failed_channels_arg), InternalUtils.encodeUint64Array(previously_failed_blinded_path_idxs_arg));
                GC.KeepAlive(payee_arg);
                GC.KeepAlive(expiry_time_arg);
                GC.KeepAlive(max_total_cltv_expiry_delta_arg);
                GC.KeepAlive(max_path_count_arg);
                GC.KeepAlive(max_channel_saturation_power_of_half_arg);
                GC.KeepAlive(previously_failed_channels_arg);
+               GC.KeepAlive(previously_failed_blinded_path_idxs_arg);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.PaymentParameters ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PaymentParameters(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
index ebd6168e875bd450df98150a20a9d1eb7cb42984..242ead86cc2f82b18515d5a871db4babd68724c0 100644 (file)
@@ -127,6 +127,18 @@ public class PaymentPurpose : CommonBase {
                if (!(o is PaymentPurpose)) return false;
                return this.eq((PaymentPurpose)o);
        }
+       /**
+        * Returns the preimage for this payment, if it is known.
+        */
+       public Option_ThirtyTwoBytesZ preimage() {
+               long ret = bindings.PaymentPurpose_preimage(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_ThirtyTwoBytesZ ret_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
        /**
         * Serialize the PaymentPurpose object into a byte array which can be read by PaymentPurpose_read
         */
diff --git a/c_sharp/src/org/ldk/structs/PendingHTLCInfo.cs b/c_sharp/src/org/ldk/structs/PendingHTLCInfo.cs
new file mode 100644 (file)
index 0000000..f65bc0d
--- /dev/null
@@ -0,0 +1,271 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Information about an incoming HTLC, including the [`PendingHTLCRouting`] describing where it
+ * should go next.
+ */
+public class PendingHTLCInfo : CommonBase {
+       internal PendingHTLCInfo(object _dummy, long ptr) : base(ptr) { }
+       ~PendingHTLCInfo() {
+               if (ptr != 0) { bindings.PendingHTLCInfo_free(ptr); }
+       }
+
+       /**
+        * Further routing details based on whether the HTLC is being forwarded or received.
+        */
+       public PendingHTLCRouting get_routing() {
+               long ret = bindings.PendingHTLCInfo_get_routing(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PendingHTLCRouting ret_hu_conv = org.ldk.structs.PendingHTLCRouting.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Further routing details based on whether the HTLC is being forwarded or received.
+        */
+       public void set_routing(org.ldk.structs.PendingHTLCRouting val) {
+               bindings.PendingHTLCInfo_set_routing(this.ptr, val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * The onion shared secret we build with the sender used to decrypt the onion.
+        * 
+        * This is later used to encrypt failure packets in the event that the HTLC is failed.
+        */
+       public byte[] get_incoming_shared_secret() {
+               long ret = bindings.PendingHTLCInfo_get_incoming_shared_secret(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The onion shared secret we build with the sender used to decrypt the onion.
+        * 
+        * This is later used to encrypt failure packets in the event that the HTLC is failed.
+        */
+       public void set_incoming_shared_secret(byte[] val) {
+               bindings.PendingHTLCInfo_set_incoming_shared_secret(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Hash of the payment preimage, to lock the payment until the receiver releases the preimage.
+        */
+       public byte[] get_payment_hash() {
+               long ret = bindings.PendingHTLCInfo_get_payment_hash(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Hash of the payment preimage, to lock the payment until the receiver releases the preimage.
+        */
+       public void set_payment_hash(byte[] val) {
+               bindings.PendingHTLCInfo_set_payment_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Amount received in the incoming HTLC.
+        * 
+        * This field was added in LDK 0.0.113 and will be `None` for objects written by prior
+        * versions.
+        */
+       public Option_u64Z get_incoming_amt_msat() {
+               long ret = bindings.PendingHTLCInfo_get_incoming_amt_msat(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_u64Z ret_hu_conv = org.ldk.structs.Option_u64Z.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Amount received in the incoming HTLC.
+        * 
+        * This field was added in LDK 0.0.113 and will be `None` for objects written by prior
+        * versions.
+        */
+       public void set_incoming_amt_msat(org.ldk.structs.Option_u64Z val) {
+               bindings.PendingHTLCInfo_set_incoming_amt_msat(this.ptr, val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * The amount the sender indicated should be forwarded on to the next hop or amount the sender
+        * intended for us to receive for received payments.
+        * 
+        * If the received amount is less than this for received payments, an intermediary hop has
+        * attempted to steal some of our funds and we should fail the HTLC (the sender should retry
+        * it along another path).
+        * 
+        * Because nodes can take less than their required fees, and because senders may wish to
+        * improve their own privacy, this amount may be less than [`Self::incoming_amt_msat`] for
+        * received payments. In such cases, recipients must handle this HTLC as if it had received
+        * [`Self::outgoing_amt_msat`].
+        */
+       public long get_outgoing_amt_msat() {
+               long ret = bindings.PendingHTLCInfo_get_outgoing_amt_msat(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The amount the sender indicated should be forwarded on to the next hop or amount the sender
+        * intended for us to receive for received payments.
+        * 
+        * If the received amount is less than this for received payments, an intermediary hop has
+        * attempted to steal some of our funds and we should fail the HTLC (the sender should retry
+        * it along another path).
+        * 
+        * Because nodes can take less than their required fees, and because senders may wish to
+        * improve their own privacy, this amount may be less than [`Self::incoming_amt_msat`] for
+        * received payments. In such cases, recipients must handle this HTLC as if it had received
+        * [`Self::outgoing_amt_msat`].
+        */
+       public void set_outgoing_amt_msat(long val) {
+               bindings.PendingHTLCInfo_set_outgoing_amt_msat(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The CLTV the sender has indicated we should set on the forwarded HTLC (or has indicated
+        * should have been set on the received HTLC for received payments).
+        */
+       public int get_outgoing_cltv_value() {
+               int ret = bindings.PendingHTLCInfo_get_outgoing_cltv_value(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The CLTV the sender has indicated we should set on the forwarded HTLC (or has indicated
+        * should have been set on the received HTLC for received payments).
+        */
+       public void set_outgoing_cltv_value(int val) {
+               bindings.PendingHTLCInfo_set_outgoing_cltv_value(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The fee taken for this HTLC in addition to the standard protocol HTLC fees.
+        * 
+        * If this is a payment for forwarding, this is the fee we are taking before forwarding the
+        * HTLC.
+        * 
+        * If this is a received payment, this is the fee that our counterparty took.
+        * 
+        * This is used to allow LSPs to take fees as a part of payments, without the sender having to
+        * shoulder them.
+        */
+       public Option_u64Z get_skimmed_fee_msat() {
+               long ret = bindings.PendingHTLCInfo_get_skimmed_fee_msat(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_u64Z ret_hu_conv = org.ldk.structs.Option_u64Z.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The fee taken for this HTLC in addition to the standard protocol HTLC fees.
+        * 
+        * If this is a payment for forwarding, this is the fee we are taking before forwarding the
+        * HTLC.
+        * 
+        * If this is a received payment, this is the fee that our counterparty took.
+        * 
+        * This is used to allow LSPs to take fees as a part of payments, without the sender having to
+        * shoulder them.
+        */
+       public void set_skimmed_fee_msat(org.ldk.structs.Option_u64Z val) {
+               bindings.PendingHTLCInfo_set_skimmed_fee_msat(this.ptr, val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * Constructs a new PendingHTLCInfo given each field
+        */
+       public static PendingHTLCInfo of(org.ldk.structs.PendingHTLCRouting routing_arg, byte[] incoming_shared_secret_arg, byte[] payment_hash_arg, org.ldk.structs.Option_u64Z incoming_amt_msat_arg, long outgoing_amt_msat_arg, int outgoing_cltv_value_arg, org.ldk.structs.Option_u64Z skimmed_fee_msat_arg) {
+               long ret = bindings.PendingHTLCInfo_new(routing_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(incoming_shared_secret_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash_arg, 32)), incoming_amt_msat_arg.ptr, outgoing_amt_msat_arg, outgoing_cltv_value_arg, skimmed_fee_msat_arg.ptr);
+               GC.KeepAlive(routing_arg);
+               GC.KeepAlive(incoming_shared_secret_arg);
+               GC.KeepAlive(payment_hash_arg);
+               GC.KeepAlive(incoming_amt_msat_arg);
+               GC.KeepAlive(outgoing_amt_msat_arg);
+               GC.KeepAlive(outgoing_cltv_value_arg);
+               GC.KeepAlive(skimmed_fee_msat_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PendingHTLCInfo ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PendingHTLCInfo(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(routing_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(incoming_amt_msat_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(skimmed_fee_msat_arg); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.PendingHTLCInfo_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the PendingHTLCInfo
+        */
+       public PendingHTLCInfo clone() {
+               long ret = bindings.PendingHTLCInfo_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PendingHTLCInfo ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PendingHTLCInfo(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the PendingHTLCInfo object into a byte array which can be read by PendingHTLCInfo_read
+        */
+       public byte[] write() {
+               long ret = bindings.PendingHTLCInfo_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a PendingHTLCInfo from a byte array, created by PendingHTLCInfo_write
+        */
+       public static Result_PendingHTLCInfoDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.PendingHTLCInfo_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCInfoDecodeErrorZ ret_hu_conv = Result_PendingHTLCInfoDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/PendingHTLCRouting.cs b/c_sharp/src/org/ldk/structs/PendingHTLCRouting.cs
new file mode 100644 (file)
index 0000000..3dbd49e
--- /dev/null
@@ -0,0 +1,287 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * Information about where a received HTLC('s onion) has indicated the HTLC should go.
+ */
+public class PendingHTLCRouting : CommonBase {
+       protected PendingHTLCRouting(object _dummy, long ptr) : base(ptr) { }
+       ~PendingHTLCRouting() {
+               if (ptr != 0) { bindings.PendingHTLCRouting_free(ptr); }
+       }
+
+       internal static PendingHTLCRouting constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKPendingHTLCRouting_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new PendingHTLCRouting_Forward(ptr);
+                       case 1: return new PendingHTLCRouting_Receive(ptr);
+                       case 2: return new PendingHTLCRouting_ReceiveKeysend(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A PendingHTLCRouting of type Forward */
+       public class PendingHTLCRouting_Forward : PendingHTLCRouting {
+               /**
+                * The onion which should be included in the forwarded HTLC, telling the next hop what to
+                * do with the HTLC.
+                */
+               public OnionPacket onion_packet;
+               /**
+                * The short channel ID of the channel which we were instructed to forward this HTLC to.
+                * 
+                * This could be a real on-chain SCID, an SCID alias, or some other SCID which has meaning
+                * to the receiving node, such as one returned from
+                * [`ChannelManager::get_intercept_scid`] or [`ChannelManager::get_phantom_scid`].
+                */
+               public long short_channel_id;
+               /**
+                * Set if this HTLC is being forwarded within a blinded path.
+                * 
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public BlindedForward blinded;
+               internal PendingHTLCRouting_Forward(long ptr) : base(null, ptr) {
+                       long onion_packet = bindings.LDKPendingHTLCRouting_Forward_get_onion_packet(ptr);
+                       org.ldk.structs.OnionPacket onion_packet_hu_conv = null; if (onion_packet < 0 || onion_packet > 4096) { onion_packet_hu_conv = new org.ldk.structs.OnionPacket(null, onion_packet); }
+                       if (onion_packet_hu_conv != null) { onion_packet_hu_conv.ptrs_to.AddLast(this); };
+                       this.onion_packet = onion_packet_hu_conv;
+                       this.short_channel_id = bindings.LDKPendingHTLCRouting_Forward_get_short_channel_id(ptr);
+                       long blinded = bindings.LDKPendingHTLCRouting_Forward_get_blinded(ptr);
+                       org.ldk.structs.BlindedForward blinded_hu_conv = null; if (blinded < 0 || blinded > 4096) { blinded_hu_conv = new org.ldk.structs.BlindedForward(null, blinded); }
+                       if (blinded_hu_conv != null) { blinded_hu_conv.ptrs_to.AddLast(this); };
+                       this.blinded = blinded_hu_conv;
+               }
+       }
+       /** A PendingHTLCRouting of type Receive */
+       public class PendingHTLCRouting_Receive : PendingHTLCRouting {
+               /**
+                * Information about the amount the sender intended to pay and (potential) proof that this
+                * is a payment for an invoice we generated. This proof of payment is is also used for
+                * linking MPP parts of a larger payment.
+                */
+               public FinalOnionHopData payment_data;
+               /**
+                * Additional data which we (allegedly) instructed the sender to include in the onion.
+                * 
+                * For HTLCs received by LDK, this will ultimately be exposed in
+                * [`Event::PaymentClaimable::onion_fields`] as
+                * [`RecipientOnionFields::payment_metadata`].
+                */
+               public Option_CVec_u8ZZ payment_metadata;
+               /**
+                * CLTV expiry of the received HTLC.
+                * 
+                * Used to track when we should expire pending HTLCs that go unclaimed.
+                */
+               public int incoming_cltv_expiry;
+               /**
+                * If the onion had forwarding instructions to one of our phantom node SCIDs, this will
+                * provide the onion shared secret used to decrypt the next level of forwarding
+                * instructions.
+                * 
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public byte[] phantom_shared_secret;
+               /**
+                * Custom TLVs which were set by the sender.
+                * 
+                * For HTLCs received by LDK, this will ultimately be exposed in
+                * [`Event::PaymentClaimable::onion_fields`] as
+                * [`RecipientOnionFields::custom_tlvs`].
+                */
+               public TwoTuple_u64CVec_u8ZZ[] custom_tlvs;
+               /**
+                * Set if this HTLC is the final hop in a multi-hop blinded path.
+                */
+               public bool requires_blinded_error;
+               internal PendingHTLCRouting_Receive(long ptr) : base(null, ptr) {
+                       long payment_data = bindings.LDKPendingHTLCRouting_Receive_get_payment_data(ptr);
+                       org.ldk.structs.FinalOnionHopData payment_data_hu_conv = null; if (payment_data < 0 || payment_data > 4096) { payment_data_hu_conv = new org.ldk.structs.FinalOnionHopData(null, payment_data); }
+                       if (payment_data_hu_conv != null) { payment_data_hu_conv.ptrs_to.AddLast(this); };
+                       this.payment_data = payment_data_hu_conv;
+                       long payment_metadata = bindings.LDKPendingHTLCRouting_Receive_get_payment_metadata(ptr);
+                       org.ldk.structs.Option_CVec_u8ZZ payment_metadata_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(payment_metadata);
+                       if (payment_metadata_hu_conv != null) { payment_metadata_hu_conv.ptrs_to.AddLast(this); };
+                       this.payment_metadata = payment_metadata_hu_conv;
+                       this.incoming_cltv_expiry = bindings.LDKPendingHTLCRouting_Receive_get_incoming_cltv_expiry(ptr);
+                       long phantom_shared_secret = bindings.LDKPendingHTLCRouting_Receive_get_phantom_shared_secret(ptr);
+                       byte[] phantom_shared_secret_conv = InternalUtils.decodeUint8Array(phantom_shared_secret);
+                       this.phantom_shared_secret = phantom_shared_secret_conv;
+                       long custom_tlvs = bindings.LDKPendingHTLCRouting_Receive_get_custom_tlvs(ptr);
+                       int custom_tlvs_conv_23_len = InternalUtils.getArrayLength(custom_tlvs);
+                       TwoTuple_u64CVec_u8ZZ[] custom_tlvs_conv_23_arr = new TwoTuple_u64CVec_u8ZZ[custom_tlvs_conv_23_len];
+                       for (int x = 0; x < custom_tlvs_conv_23_len; x++) {
+                               long custom_tlvs_conv_23 = InternalUtils.getU64ArrayElem(custom_tlvs, x);
+                               TwoTuple_u64CVec_u8ZZ custom_tlvs_conv_23_hu_conv = new TwoTuple_u64CVec_u8ZZ(null, custom_tlvs_conv_23);
+                               if (custom_tlvs_conv_23_hu_conv != null) { custom_tlvs_conv_23_hu_conv.ptrs_to.AddLast(this); };
+                               custom_tlvs_conv_23_arr[x] = custom_tlvs_conv_23_hu_conv;
+                       }
+                       bindings.free_buffer(custom_tlvs);
+                       this.custom_tlvs = custom_tlvs_conv_23_arr;
+                       this.requires_blinded_error = bindings.LDKPendingHTLCRouting_Receive_get_requires_blinded_error(ptr);
+               }
+       }
+       /** A PendingHTLCRouting of type ReceiveKeysend */
+       public class PendingHTLCRouting_ReceiveKeysend : PendingHTLCRouting {
+               /**
+                * Information about the amount the sender intended to pay and possibly a token to
+                * associate MPP parts of a larger payment.
+                * 
+                * This will only be filled in if receiving MPP keysend payments is enabled, and it being
+                * present will cause deserialization to fail on versions of LDK prior to 0.0.116.
+                * 
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public FinalOnionHopData payment_data;
+               /**
+                * Preimage for this onion payment. This preimage is provided by the sender and will be
+                * used to settle the spontaneous payment.
+                */
+               public byte[] payment_preimage;
+               /**
+                * Additional data which we (allegedly) instructed the sender to include in the onion.
+                * 
+                * For HTLCs received by LDK, this will ultimately bubble back up as
+                * [`RecipientOnionFields::payment_metadata`].
+                */
+               public Option_CVec_u8ZZ payment_metadata;
+               /**
+                * CLTV expiry of the received HTLC.
+                * 
+                * Used to track when we should expire pending HTLCs that go unclaimed.
+                */
+               public int incoming_cltv_expiry;
+               /**
+                * Custom TLVs which were set by the sender.
+                * 
+                * For HTLCs received by LDK, these will ultimately bubble back up as
+                * [`RecipientOnionFields::custom_tlvs`].
+                */
+               public TwoTuple_u64CVec_u8ZZ[] custom_tlvs;
+               internal PendingHTLCRouting_ReceiveKeysend(long ptr) : base(null, ptr) {
+                       long payment_data = bindings.LDKPendingHTLCRouting_ReceiveKeysend_get_payment_data(ptr);
+                       org.ldk.structs.FinalOnionHopData payment_data_hu_conv = null; if (payment_data < 0 || payment_data > 4096) { payment_data_hu_conv = new org.ldk.structs.FinalOnionHopData(null, payment_data); }
+                       if (payment_data_hu_conv != null) { payment_data_hu_conv.ptrs_to.AddLast(this); };
+                       this.payment_data = payment_data_hu_conv;
+                       long payment_preimage = bindings.LDKPendingHTLCRouting_ReceiveKeysend_get_payment_preimage(ptr);
+                       byte[] payment_preimage_conv = InternalUtils.decodeUint8Array(payment_preimage);
+                       this.payment_preimage = payment_preimage_conv;
+                       long payment_metadata = bindings.LDKPendingHTLCRouting_ReceiveKeysend_get_payment_metadata(ptr);
+                       org.ldk.structs.Option_CVec_u8ZZ payment_metadata_hu_conv = org.ldk.structs.Option_CVec_u8ZZ.constr_from_ptr(payment_metadata);
+                       if (payment_metadata_hu_conv != null) { payment_metadata_hu_conv.ptrs_to.AddLast(this); };
+                       this.payment_metadata = payment_metadata_hu_conv;
+                       this.incoming_cltv_expiry = bindings.LDKPendingHTLCRouting_ReceiveKeysend_get_incoming_cltv_expiry(ptr);
+                       long custom_tlvs = bindings.LDKPendingHTLCRouting_ReceiveKeysend_get_custom_tlvs(ptr);
+                       int custom_tlvs_conv_23_len = InternalUtils.getArrayLength(custom_tlvs);
+                       TwoTuple_u64CVec_u8ZZ[] custom_tlvs_conv_23_arr = new TwoTuple_u64CVec_u8ZZ[custom_tlvs_conv_23_len];
+                       for (int x = 0; x < custom_tlvs_conv_23_len; x++) {
+                               long custom_tlvs_conv_23 = InternalUtils.getU64ArrayElem(custom_tlvs, x);
+                               TwoTuple_u64CVec_u8ZZ custom_tlvs_conv_23_hu_conv = new TwoTuple_u64CVec_u8ZZ(null, custom_tlvs_conv_23);
+                               if (custom_tlvs_conv_23_hu_conv != null) { custom_tlvs_conv_23_hu_conv.ptrs_to.AddLast(this); };
+                               custom_tlvs_conv_23_arr[x] = custom_tlvs_conv_23_hu_conv;
+                       }
+                       bindings.free_buffer(custom_tlvs);
+                       this.custom_tlvs = custom_tlvs_conv_23_arr;
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.PendingHTLCRouting_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the PendingHTLCRouting
+        */
+       public PendingHTLCRouting clone() {
+               long ret = bindings.PendingHTLCRouting_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PendingHTLCRouting ret_hu_conv = org.ldk.structs.PendingHTLCRouting.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new Forward-variant PendingHTLCRouting
+        */
+       public static PendingHTLCRouting forward(org.ldk.structs.OnionPacket onion_packet, long short_channel_id, org.ldk.structs.BlindedForward blinded) {
+               long ret = bindings.PendingHTLCRouting_forward(onion_packet == null ? 0 : onion_packet.ptr, short_channel_id, blinded == null ? 0 : blinded.ptr);
+               GC.KeepAlive(onion_packet);
+               GC.KeepAlive(short_channel_id);
+               GC.KeepAlive(blinded);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PendingHTLCRouting ret_hu_conv = org.ldk.structs.PendingHTLCRouting.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(onion_packet); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(blinded); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new Receive-variant PendingHTLCRouting
+        */
+       public static PendingHTLCRouting receive(org.ldk.structs.FinalOnionHopData payment_data, org.ldk.structs.Option_CVec_u8ZZ payment_metadata, int incoming_cltv_expiry, byte[] phantom_shared_secret, TwoTuple_u64CVec_u8ZZ[] custom_tlvs, bool requires_blinded_error) {
+               long ret = bindings.PendingHTLCRouting_receive(payment_data == null ? 0 : payment_data.ptr, payment_metadata.ptr, incoming_cltv_expiry, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(phantom_shared_secret, 32)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(custom_tlvs, custom_tlvs_conv_23 => custom_tlvs_conv_23 != null ? custom_tlvs_conv_23.ptr : 0)), requires_blinded_error);
+               GC.KeepAlive(payment_data);
+               GC.KeepAlive(payment_metadata);
+               GC.KeepAlive(incoming_cltv_expiry);
+               GC.KeepAlive(phantom_shared_secret);
+               GC.KeepAlive(custom_tlvs);
+               GC.KeepAlive(requires_blinded_error);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PendingHTLCRouting ret_hu_conv = org.ldk.structs.PendingHTLCRouting.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_data); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_metadata); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new ReceiveKeysend-variant PendingHTLCRouting
+        */
+       public static PendingHTLCRouting receive_keysend(org.ldk.structs.FinalOnionHopData payment_data, byte[] payment_preimage, org.ldk.structs.Option_CVec_u8ZZ payment_metadata, int incoming_cltv_expiry, TwoTuple_u64CVec_u8ZZ[] custom_tlvs) {
+               long ret = bindings.PendingHTLCRouting_receive_keysend(payment_data == null ? 0 : payment_data.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_preimage, 32)), payment_metadata.ptr, incoming_cltv_expiry, InternalUtils.encodeUint64Array(InternalUtils.mapArray(custom_tlvs, custom_tlvs_conv_23 => custom_tlvs_conv_23 != null ? custom_tlvs_conv_23.ptr : 0)));
+               GC.KeepAlive(payment_data);
+               GC.KeepAlive(payment_preimage);
+               GC.KeepAlive(payment_metadata);
+               GC.KeepAlive(incoming_cltv_expiry);
+               GC.KeepAlive(custom_tlvs);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PendingHTLCRouting ret_hu_conv = org.ldk.structs.PendingHTLCRouting.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_data); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payment_metadata); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Serialize the PendingHTLCRouting object into a byte array which can be read by PendingHTLCRouting_read
+        */
+       public byte[] write() {
+               long ret = bindings.PendingHTLCRouting_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a PendingHTLCRouting from a byte array, created by PendingHTLCRouting_write
+        */
+       public static Result_PendingHTLCRoutingDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.PendingHTLCRouting_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCRoutingDecodeErrorZ ret_hu_conv = Result_PendingHTLCRoutingDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 3bdad4c0b92914ebcfd1896fdeceeae6bbdff802..cf5d834d8a2c721d5b750e9db0b3099d3866a6ad 100644 (file)
@@ -88,6 +88,18 @@ public class Ping : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Ping.
+        */
+       public long hash() {
+               long ret = bindings.Ping_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two Pings contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index ed704f8707461c7a78dd8e60b8323202c5c957d3..7d31da140d2499558277f60974b8da6f7a83e03a 100644 (file)
@@ -69,6 +69,18 @@ public class Pong : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Pong.
+        */
+       public long hash() {
+               long ret = bindings.Pong_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two Pongs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
diff --git a/c_sharp/src/org/ldk/structs/PrivateHopCandidate.cs b/c_sharp/src/org/ldk/structs/PrivateHopCandidate.cs
new file mode 100644 (file)
index 0000000..12018e5
--- /dev/null
@@ -0,0 +1,37 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A [`CandidateRouteHop::PrivateHop`] entry.
+ */
+public class PrivateHopCandidate : CommonBase {
+       internal PrivateHopCandidate(object _dummy, long ptr) : base(ptr) { }
+       ~PrivateHopCandidate() {
+               if (ptr != 0) { bindings.PrivateHopCandidate_free(ptr); }
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.PrivateHopCandidate_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the PrivateHopCandidate
+        */
+       public PrivateHopCandidate clone() {
+               long ret = bindings.PrivateHopCandidate_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PrivateHopCandidate ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PrivateHopCandidate(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 2bbdf38ffbdb262cecfed496ded678c010845980..333e3ab44bad1a5ba9f9c244de544bb5daf5abcd 100644 (file)
@@ -17,7 +17,7 @@ namespace org { namespace ldk { namespace structs {
  * These bounds are then used to determine a success probability using the formula from
  * Optimally Reliable & Cheap Payment Flows on the Lightning Network* by Rene Pickhardt
  * and Stefan Richter [[1]] (i.e. `(upper_bound - payment_amount) / (upper_bound - lower_bound)`).
- * 6762, 1070
+ * 
  * This probability is combined with the [`liquidity_penalty_multiplier_msat`] and
  * [`liquidity_penalty_amount_multiplier_msat`] parameters to calculate a concrete penalty in
  * milli-satoshis. The penalties, when added across all hops, have the property of being linear in
@@ -32,11 +32,6 @@ namespace org { namespace ldk { namespace structs {
  * formula, but using the history of a channel rather than our latest estimates for the liquidity
  * bounds.
  * 
- * # Note
- * 
- * Mixing the `no-std` feature between serialization and deserialization results in undefined
- * behavior.
- * 
  * [1]: https://arxiv.org/abs/2107.05322
  * [`liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_multiplier_msat
  * [`liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_amount_multiplier_msat
@@ -118,7 +113,7 @@ public class ProbabilisticScorer : CommonBase {
         * in the top and bottom bucket, and roughly with similar (recent) frequency.
         * 
         * Because the datapoints are decayed slowly over time, values will eventually return to
-        * `Some(([1; 32], [1; 32]))` and then to `None` once no datapoints remain.
+        * `Some(([0; 32], [0; 32]))` or `None` if no data remains for a channel.
         * 
         * In order to fetch a single success probability from the buckets provided here, as used in
         * the scoring model, see [`Self::historical_estimated_payment_success_probability`].
index 79d2a6ce4ce21f21e895184c76f47fd2f21205e5..7f0cfd63863edd1a016aafe209f038c0c0e8ee05 100644 (file)
@@ -30,7 +30,7 @@ public class ProbabilisticScoringDecayParameters : CommonBase {
         * 
         * Default value: 14 days
         * 
-        * [`historical_estimated_channel_liquidity_probabilities`]: ProbabilisticScorerUsingTime::historical_estimated_channel_liquidity_probabilities
+        * [`historical_estimated_channel_liquidity_probabilities`]: ProbabilisticScorer::historical_estimated_channel_liquidity_probabilities
         */
        public long get_historical_no_updates_half_life() {
                long ret = bindings.ProbabilisticScoringDecayParameters_get_historical_no_updates_half_life(this.ptr);
@@ -49,7 +49,7 @@ public class ProbabilisticScoringDecayParameters : CommonBase {
         * 
         * Default value: 14 days
         * 
-        * [`historical_estimated_channel_liquidity_probabilities`]: ProbabilisticScorerUsingTime::historical_estimated_channel_liquidity_probabilities
+        * [`historical_estimated_channel_liquidity_probabilities`]: ProbabilisticScorer::historical_estimated_channel_liquidity_probabilities
         */
        public void set_historical_no_updates_half_life(long val) {
                bindings.ProbabilisticScoringDecayParameters_set_historical_no_updates_half_life(this.ptr, val);
diff --git a/c_sharp/src/org/ldk/structs/ProbingError.cs b/c_sharp/src/org/ldk/structs/ProbingError.cs
deleted file mode 100644 (file)
index 3ce9f99..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-/**
- * An error that may occur when sending a payment probe.
- */
-public class ProbingError : CommonBase {
-       protected ProbingError(object _dummy, long ptr) : base(ptr) { }
-       ~ProbingError() {
-               if (ptr != 0) { bindings.ProbingError_free(ptr); }
-       }
-
-       internal static ProbingError constr_from_ptr(long ptr) {
-               long raw_ty = bindings.LDKProbingError_ty_from_ptr(ptr);
-               switch (raw_ty) {
-                       case 0: return new ProbingError_Invoice(ptr);
-                       case 1: return new ProbingError_Sending(ptr);
-                       default:
-                               throw new ArgumentException("Impossible enum variant");
-               }
-       }
-
-       /** A ProbingError of type Invoice */
-       public class ProbingError_Invoice : ProbingError {
-               public string invoice;
-               internal ProbingError_Invoice(long ptr) : base(null, ptr) {
-                       long invoice = bindings.LDKProbingError_Invoice_get_invoice(ptr);
-                       string invoice_conv = InternalUtils.decodeString(invoice);
-                       this.invoice = invoice_conv;
-               }
-       }
-       /** A ProbingError of type Sending */
-       public class ProbingError_Sending : ProbingError {
-               public ProbeSendFailure sending;
-               internal ProbingError_Sending(long ptr) : base(null, ptr) {
-                       long sending = bindings.LDKProbingError_Sending_get_sending(ptr);
-                       org.ldk.structs.ProbeSendFailure sending_hu_conv = org.ldk.structs.ProbeSendFailure.constr_from_ptr(sending);
-                       if (sending_hu_conv != null) { sending_hu_conv.ptrs_to.AddLast(this); };
-                       this.sending = sending_hu_conv;
-               }
-       }
-       internal long clone_ptr() {
-               long ret = bindings.ProbingError_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a copy of the ProbingError
-        */
-       public ProbingError clone() {
-               long ret = bindings.ProbingError_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.ProbingError ret_hu_conv = org.ldk.structs.ProbingError.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Utility method to constructs a new Invoice-variant ProbingError
-        */
-       public static ProbingError invoice(string a) {
-               long ret = bindings.ProbingError_invoice(InternalUtils.encodeString(a));
-               GC.KeepAlive(a);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.ProbingError ret_hu_conv = org.ldk.structs.ProbingError.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Utility method to constructs a new Sending-variant ProbingError
-        */
-       public static ProbingError sending(org.ldk.structs.ProbeSendFailure a) {
-               long ret = bindings.ProbingError_sending(a.ptr);
-               GC.KeepAlive(a);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.ProbingError ret_hu_conv = org.ldk.structs.ProbingError.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(a); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if two ProbingErrors contain equal inner contents.
-        * This ignores pointers and is_owned flags and looks at the values in fields.
-        */
-       public bool eq(org.ldk.structs.ProbingError b) {
-               bool ret = bindings.ProbingError_eq(this.ptr, b == null ? 0 : b.ptr);
-               GC.KeepAlive(this);
-               GC.KeepAlive(b);
-               return ret;
-       }
-
-       public override bool Equals(object o) {
-               if (!(o is ProbingError)) return false;
-               return this.eq((ProbingError)o);
-       }
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/PublicHopCandidate.cs b/c_sharp/src/org/ldk/structs/PublicHopCandidate.cs
new file mode 100644 (file)
index 0000000..0475b51
--- /dev/null
@@ -0,0 +1,57 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A [`CandidateRouteHop::PublicHop`] entry.
+ */
+public class PublicHopCandidate : CommonBase {
+       internal PublicHopCandidate(object _dummy, long ptr) : base(ptr) { }
+       ~PublicHopCandidate() {
+               if (ptr != 0) { bindings.PublicHopCandidate_free(ptr); }
+       }
+
+       /**
+        * The short channel ID of the channel, i.e. the identifier by which we refer to this
+        * channel.
+        */
+       public long get_short_channel_id() {
+               long ret = bindings.PublicHopCandidate_get_short_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The short channel ID of the channel, i.e. the identifier by which we refer to this
+        * channel.
+        */
+       public void set_short_channel_id(long val) {
+               bindings.PublicHopCandidate_set_short_channel_id(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.PublicHopCandidate_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the PublicHopCandidate
+        */
+       public PublicHopCandidate clone() {
+               long ret = bindings.PublicHopCandidate_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.PublicHopCandidate ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.PublicHopCandidate(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index ae91c5aa277612dfb323822d32e0ecf93ef439dd..869c1ac55daa25e357986ddb5b61ce28cd12091d 100644 (file)
@@ -108,6 +108,18 @@ public class QueryChannelRange : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the QueryChannelRange.
+        */
+       public long hash() {
+               long ret = bindings.QueryChannelRange_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two QueryChannelRanges contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index f450b34ff730ea3c58089a49d57c30257d33e5e6..318c3ac4631c06d761c9b55954fbd5357e27c13d 100644 (file)
@@ -98,6 +98,18 @@ public class QueryShortChannelIds : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the QueryShortChannelIds.
+        */
+       public long hash() {
+               long ret = bindings.QueryShortChannelIds_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two QueryShortChannelIdss contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 53b04a6638551ebc961d03bfcd473afaa5c2d429..63b088ee9511d0703626a60fc70c2a232db38331 100644 (file)
@@ -101,16 +101,5 @@ public class ReceiveTlvs : CommonBase {
                return ret_conv;
        }
 
-       /**
-        * Read a ReceiveTlvs from a byte array, created by ReceiveTlvs_write
-        */
-       public static Result_ReceiveTlvsDecodeErrorZ read(byte[] ser) {
-               long ret = bindings.ReceiveTlvs_read(InternalUtils.encodeUint8Array(ser));
-               GC.KeepAlive(ser);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ReceiveTlvsDecodeErrorZ ret_hu_conv = Result_ReceiveTlvsDecodeErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
 }
 } } }
index 54f0a5eb34d4bdb98ae6fa0d1e5c0b2ed2f7764a..c1cff2fa9d7653ea77036cb8214c2a405537ad0a 100644 (file)
@@ -34,6 +34,62 @@ public class Record : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * The node id of the peer pertaining to the logged record.
+        * 
+        * Note that in some cases a [`Self::channel_id`] may be filled in but this may still be
+        * `None`, depending on if the peer information is readily available in LDK when the log is
+        * generated.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public byte[] get_peer_id() {
+               long ret = bindings.Record_get_peer_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The node id of the peer pertaining to the logged record.
+        * 
+        * Note that in some cases a [`Self::channel_id`] may be filled in but this may still be
+        * `None`, depending on if the peer information is readily available in LDK when the log is
+        * generated.
+        * 
+        * Note that val (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public void set_peer_id(byte[] val) {
+               bindings.Record_set_peer_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The channel id of the channel pertaining to the logged record. May be a temporary id before
+        * the channel has been funded.
+        */
+       public Option_ThirtyTwoBytesZ get_channel_id() {
+               long ret = bindings.Record_get_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_ThirtyTwoBytesZ ret_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The channel id of the channel pertaining to the logged record. May be a temporary id before
+        * the channel has been funded.
+        */
+       public void set_channel_id(org.ldk.structs.Option_ThirtyTwoBytesZ val) {
+               bindings.Record_set_channel_id(this.ptr, val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
        /**
         * The message body.
         */
@@ -112,6 +168,27 @@ public class Record : CommonBase {
                GC.KeepAlive(val);
        }
 
+       /**
+        * Constructs a new Record given each field
+        * 
+        * Note that peer_id_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public static Record of(Level level_arg, byte[] peer_id_arg, org.ldk.structs.Option_ThirtyTwoBytesZ channel_id_arg, string args_arg, string module_path_arg, string file_arg, int line_arg) {
+               long ret = bindings.Record_new(level_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(peer_id_arg, 33)), channel_id_arg.ptr, InternalUtils.encodeString(args_arg), InternalUtils.encodeString(module_path_arg), InternalUtils.encodeString(file_arg), line_arg);
+               GC.KeepAlive(level_arg);
+               GC.KeepAlive(peer_id_arg);
+               GC.KeepAlive(channel_id_arg);
+               GC.KeepAlive(args_arg);
+               GC.KeepAlive(module_path_arg);
+               GC.KeepAlive(file_arg);
+               GC.KeepAlive(line_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Record ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Record(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channel_id_arg); };
+               return ret_hu_conv;
+       }
+
        internal long clone_ptr() {
                long ret = bindings.Record_clone_ptr(this.ptr);
                GC.KeepAlive(this);
index bff3dd94e54435cced27a238206b28d8ce2e3094..d83b0c3413b205a6fed9236ec43ec7b66dd56bf2 100644 (file)
@@ -76,6 +76,16 @@ public class Refund : CommonBase {
                return ret;
        }
 
+       /**
+        * Whether the refund has expired given the duration since the Unix epoch.
+        */
+       public bool is_expired_no_std(long duration_since_epoch) {
+               bool ret = bindings.Refund_is_expired_no_std(this.ptr, duration_since_epoch);
+               GC.KeepAlive(this);
+               GC.KeepAlive(duration_since_epoch);
+               return ret;
+       }
+
        /**
         * The issuer of the refund, possibly beginning with `user@domain` or `domain`. Intended to be
         * displayed to the user but with the caveat that it has not been verified in any way.
index 6b2ec479107bd7f589afa5e5fda9139b833ac764..b1f8f09e6a9390c6360bf71e76e3a75ab0b535fe 100644 (file)
@@ -155,6 +155,18 @@ public class ReplyChannelRange : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ReplyChannelRange.
+        */
+       public long hash() {
+               long ret = bindings.ReplyChannelRange_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ReplyChannelRanges contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 2f7643136800d8e17e2247ed87396c0f927001a7..88dd390bd50965ca53e29bc262bae929365c9641 100644 (file)
@@ -91,6 +91,18 @@ public class ReplyShortChannelIdsEnd : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the ReplyShortChannelIdsEnd.
+        */
+       public long hash() {
+               long ret = bindings.ReplyShortChannelIdsEnd_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two ReplyShortChannelIdsEnds contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
diff --git a/c_sharp/src/org/ldk/structs/Result_BlindedFailureDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_BlindedFailureDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..6350877
--- /dev/null
@@ -0,0 +1,89 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_BlindedFailureDecodeErrorZ : CommonBase {
+       Result_BlindedFailureDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_BlindedFailureDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_BlindedFailureDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_BlindedFailureDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_BlindedFailureDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_BlindedFailureDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_BlindedFailureDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_BlindedFailureDecodeErrorZ_OK : Result_BlindedFailureDecodeErrorZ {
+               public readonly BlindedFailure res;
+               internal Result_BlindedFailureDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       this.res = bindings.CResult_BlindedFailureDecodeErrorZ_get_ok(ptr);
+               }
+       }
+
+       public class Result_BlindedFailureDecodeErrorZ_Err : Result_BlindedFailureDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_BlindedFailureDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_BlindedFailureDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_BlindedFailureDecodeErrorZ in the success state.
+        */
+       public static Result_BlindedFailureDecodeErrorZ ok(BlindedFailure o) {
+               long ret = bindings.CResult_BlindedFailureDecodeErrorZ_ok(o);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedFailureDecodeErrorZ ret_hu_conv = Result_BlindedFailureDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_BlindedFailureDecodeErrorZ in the error state.
+        */
+       public static Result_BlindedFailureDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_BlindedFailureDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedFailureDecodeErrorZ ret_hu_conv = Result_BlindedFailureDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_BlindedFailureDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_BlindedFailureDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_BlindedFailureDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_BlindedFailureDecodeErrorZ clone() {
+               long ret = bindings.CResult_BlindedFailureDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedFailureDecodeErrorZ ret_hu_conv = Result_BlindedFailureDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_BlindedForwardDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_BlindedForwardDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..b02ccef
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_BlindedForwardDecodeErrorZ : CommonBase {
+       Result_BlindedForwardDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_BlindedForwardDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_BlindedForwardDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_BlindedForwardDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_BlindedForwardDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_BlindedForwardDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_BlindedForwardDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_BlindedForwardDecodeErrorZ_OK : Result_BlindedForwardDecodeErrorZ {
+               public readonly BlindedForward res;
+               internal Result_BlindedForwardDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_BlindedForwardDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.BlindedForward res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.BlindedForward(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_BlindedForwardDecodeErrorZ_Err : Result_BlindedForwardDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_BlindedForwardDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_BlindedForwardDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_BlindedForwardDecodeErrorZ in the success state.
+        */
+       public static Result_BlindedForwardDecodeErrorZ ok(org.ldk.structs.BlindedForward o) {
+               long ret = bindings.CResult_BlindedForwardDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedForwardDecodeErrorZ ret_hu_conv = Result_BlindedForwardDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_BlindedForwardDecodeErrorZ in the error state.
+        */
+       public static Result_BlindedForwardDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_BlindedForwardDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedForwardDecodeErrorZ ret_hu_conv = Result_BlindedForwardDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_BlindedForwardDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_BlindedForwardDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_BlindedForwardDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_BlindedForwardDecodeErrorZ clone() {
+               long ret = bindings.CResult_BlindedForwardDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_BlindedForwardDecodeErrorZ ret_hu_conv = Result_BlindedForwardDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_CVec_u8Zu64ZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_CVec_u8Zu64ZNoneZ.cs
new file mode 100644 (file)
index 0000000..10f8018
--- /dev/null
@@ -0,0 +1,85 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_C2Tuple_CVec_u8Zu64ZNoneZ : CommonBase {
+       Result_C2Tuple_CVec_u8Zu64ZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C2Tuple_CVec_u8Zu64ZNoneZ() {
+               if (ptr != 0) { bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_free(ptr); }
+       }
+
+       internal static Result_C2Tuple_CVec_u8Zu64ZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(ptr)) {
+                       return new Result_C2Tuple_CVec_u8Zu64ZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_C2Tuple_CVec_u8Zu64ZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_C2Tuple_CVec_u8Zu64ZNoneZ_OK : Result_C2Tuple_CVec_u8Zu64ZNoneZ {
+               public readonly TwoTuple_CVec_u8Zu64Z res;
+               internal Result_C2Tuple_CVec_u8Zu64ZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_get_ok(ptr);
+                       TwoTuple_CVec_u8Zu64Z res_hu_conv = new TwoTuple_CVec_u8Zu64Z(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C2Tuple_CVec_u8Zu64ZNoneZ_Err : Result_C2Tuple_CVec_u8Zu64ZNoneZ {
+               internal Result_C2Tuple_CVec_u8Zu64ZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_CVec_u8Zu64ZNoneZ in the success state.
+        */
+       public static Result_C2Tuple_CVec_u8Zu64ZNoneZ ok(org.ldk.structs.TwoTuple_CVec_u8Zu64Z o) {
+               long ret = bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_CVec_u8Zu64ZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8Zu64ZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_CVec_u8Zu64ZNoneZ in the error state.
+        */
+       public static Result_C2Tuple_CVec_u8Zu64ZNoneZ err() {
+               long ret = bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_CVec_u8Zu64ZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8Zu64ZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C2Tuple_CVec_u8Zu64ZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C2Tuple_CVec_u8Zu64ZNoneZ clone() {
+               long ret = bindings.CResult_C2Tuple_CVec_u8Zu64ZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_CVec_u8Zu64ZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8Zu64ZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_CVec_u8ZusizeZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_CVec_u8ZusizeZNoneZ.cs
deleted file mode 100644 (file)
index e6cd368..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_C2Tuple_CVec_u8ZusizeZNoneZ : CommonBase {
-       Result_C2Tuple_CVec_u8ZusizeZNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_CVec_u8ZusizeZNoneZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_CVec_u8ZusizeZNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_CVec_u8ZusizeZNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_CVec_u8ZusizeZNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_CVec_u8ZusizeZNoneZ_OK : Result_C2Tuple_CVec_u8ZusizeZNoneZ {
-               public readonly TwoTuple_CVec_u8ZusizeZ res;
-               internal Result_C2Tuple_CVec_u8ZusizeZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_get_ok(ptr);
-                       TwoTuple_CVec_u8ZusizeZ res_hu_conv = new TwoTuple_CVec_u8ZusizeZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_CVec_u8ZusizeZNoneZ_Err : Result_C2Tuple_CVec_u8ZusizeZNoneZ {
-               internal Result_C2Tuple_CVec_u8ZusizeZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_CVec_u8ZusizeZNoneZ in the success state.
-        */
-       public static Result_C2Tuple_CVec_u8ZusizeZNoneZ ok(org.ldk.structs.TwoTuple_CVec_u8ZusizeZ o) {
-               long ret = bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_CVec_u8ZusizeZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8ZusizeZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_CVec_u8ZusizeZNoneZ in the error state.
-        */
-       public static Result_C2Tuple_CVec_u8ZusizeZNoneZ err() {
-               long ret = bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_CVec_u8ZusizeZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8ZusizeZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_CVec_u8ZusizeZNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_C2Tuple_CVec_u8ZusizeZNoneZ clone() {
-               long ret = bindings.CResult_C2Tuple_CVec_u8ZusizeZNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_CVec_u8ZusizeZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8ZusizeZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ.cs
deleted file mode 100644 (file)
index 69fc62f..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ : CommonBase {
-       Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ() {
-               if (ptr != 0) { bindings.CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_free(ptr); }
-       }
-
-       internal static Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(ptr)) {
-                       return new Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ_OK : Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ {
-               public readonly TwoTuple_PublicKeyOnionMessageZ res;
-               internal Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_ok(ptr);
-                       TwoTuple_PublicKeyOnionMessageZ res_hu_conv = new TwoTuple_PublicKeyOnionMessageZ(null, res);
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ_Err : Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ {
-               public readonly SendError err;
-               internal Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_get_err(ptr);
-                       org.ldk.structs.SendError err_hu_conv = org.ldk.structs.SendError.constr_from_ptr(err);
-                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
-                       this.err = err_hu_conv;
-               }
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ in the success state.
-        */
-       public static Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ ok(org.ldk.structs.TwoTuple_PublicKeyOnionMessageZ o) {
-               long ret = bindings.CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_ok(o != null ? o.ptr : 0);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ ret_hu_conv = Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ in the error state.
-        */
-       public static Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ err(org.ldk.structs.SendError e) {
-               long ret = bindings.CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ ret_hu_conv = Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_C2Tuple_PublicKeyOnionMessageZSendErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ.cs
new file mode 100644 (file)
index 0000000..5cc240d
--- /dev/null
@@ -0,0 +1,74 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ : CommonBase {
+       Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ() {
+               if (ptr != 0) { bindings.CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_free(ptr); }
+       }
+
+       internal static Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(ptr)) {
+                       return new Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_OK : Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ {
+               public readonly ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ res;
+               internal Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_ok(ptr);
+                       ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ res_hu_conv = new ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_Err : Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ {
+               public readonly SendError err;
+               internal Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_get_err(ptr);
+                       org.ldk.structs.SendError err_hu_conv = org.ldk.structs.SendError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ in the success state.
+        */
+       public static Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ ok(org.ldk.structs.ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ o) {
+               long ret = bindings.CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ ret_hu_conv = Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ in the error state.
+        */
+       public static Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ err(org.ldk.structs.SendError e) {
+               long ret = bindings.CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ ret_hu_conv = Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.cs
new file mode 100644 (file)
index 0000000..9fdb1a2
--- /dev/null
@@ -0,0 +1,85 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ : CommonBase {
+       Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ() {
+               if (ptr != 0) { bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_free(ptr); }
+       }
+
+       internal static Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(ptr)) {
+                       return new Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_OK : Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ {
+               public readonly ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ res;
+               internal Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_get_ok(ptr);
+                       ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ res_hu_conv = new ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ(null, res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_Err : Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ {
+               internal Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ in the success state.
+        */
+       public static Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ ok(org.ldk.structs.ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ o) {
+               long ret = bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_ok(o != null ? o.ptr : 0);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ ret_hu_conv = Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ in the error state.
+        */
+       public static Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ err() {
+               long ret = bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ ret_hu_conv = Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ clone() {
+               long ret = bindings.CResult_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ ret_hu_conv = Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_BlindedPathZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_BlindedPathZNoneZ.cs
new file mode 100644 (file)
index 0000000..9adab42
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_CVec_BlindedPathZNoneZ : CommonBase {
+       Result_CVec_BlindedPathZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_BlindedPathZNoneZ() {
+               if (ptr != 0) { bindings.CResult_CVec_BlindedPathZNoneZ_free(ptr); }
+       }
+
+       internal static Result_CVec_BlindedPathZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_BlindedPathZNoneZ_is_ok(ptr)) {
+                       return new Result_CVec_BlindedPathZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_BlindedPathZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_BlindedPathZNoneZ_OK : Result_CVec_BlindedPathZNoneZ {
+               public readonly BlindedPath[] res;
+               internal Result_CVec_BlindedPathZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_BlindedPathZNoneZ_get_ok(ptr);
+                       int res_conv_13_len = InternalUtils.getArrayLength(res);
+                       BlindedPath[] res_conv_13_arr = new BlindedPath[res_conv_13_len];
+                       for (int n = 0; n < res_conv_13_len; n++) {
+                               long res_conv_13 = InternalUtils.getU64ArrayElem(res, n);
+                               org.ldk.structs.BlindedPath res_conv_13_hu_conv = null; if (res_conv_13 < 0 || res_conv_13 > 4096) { res_conv_13_hu_conv = new org.ldk.structs.BlindedPath(null, res_conv_13); }
+                               if (res_conv_13_hu_conv != null) { res_conv_13_hu_conv.ptrs_to.AddLast(this); };
+                               res_conv_13_arr[n] = res_conv_13_hu_conv;
+                       }
+                       bindings.free_buffer(res);
+                       this.res = res_conv_13_arr;
+               }
+       }
+
+       public class Result_CVec_BlindedPathZNoneZ_Err : Result_CVec_BlindedPathZNoneZ {
+               internal Result_CVec_BlindedPathZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_CVec_BlindedPathZNoneZ in the success state.
+        */
+       public static Result_CVec_BlindedPathZNoneZ ok(BlindedPath[] o) {
+               long ret = bindings.CResult_CVec_BlindedPathZNoneZ_ok(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_13 => o_conv_13 == null ? 0 : o_conv_13.ptr)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_BlindedPathZNoneZ ret_hu_conv = Result_CVec_BlindedPathZNoneZ.constr_from_ptr(ret);
+               foreach (BlindedPath o_conv_13 in o) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o_conv_13); }; };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_BlindedPathZNoneZ in the error state.
+        */
+       public static Result_CVec_BlindedPathZNoneZ err() {
+               long ret = bindings.CResult_CVec_BlindedPathZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_BlindedPathZNoneZ ret_hu_conv = Result_CVec_BlindedPathZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_CVec_BlindedPathZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_BlindedPathZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_BlindedPathZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_BlindedPathZNoneZ clone() {
+               long ret = bindings.CResult_CVec_BlindedPathZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_BlindedPathZNoneZ ret_hu_conv = Result_CVec_BlindedPathZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ.cs
new file mode 100644 (file)
index 0000000..9c4c16e
--- /dev/null
@@ -0,0 +1,92 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ : CommonBase {
+       Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ() {
+               if (ptr != 0) { bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_free(ptr); }
+       }
+
+       internal static Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(ptr)) {
+                       return new Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_OK : Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ {
+               public readonly TwoTuple_BlindedPayInfoBlindedPathZ[] res;
+               internal Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_get_ok(ptr);
+                       int res_conv_37_len = InternalUtils.getArrayLength(res);
+                       TwoTuple_BlindedPayInfoBlindedPathZ[] res_conv_37_arr = new TwoTuple_BlindedPayInfoBlindedPathZ[res_conv_37_len];
+                       for (int l = 0; l < res_conv_37_len; l++) {
+                               long res_conv_37 = InternalUtils.getU64ArrayElem(res, l);
+                               TwoTuple_BlindedPayInfoBlindedPathZ res_conv_37_hu_conv = new TwoTuple_BlindedPayInfoBlindedPathZ(null, res_conv_37);
+                               if (res_conv_37_hu_conv != null) { res_conv_37_hu_conv.ptrs_to.AddLast(this); };
+                               res_conv_37_arr[l] = res_conv_37_hu_conv;
+                       }
+                       bindings.free_buffer(res);
+                       this.res = res_conv_37_arr;
+               }
+       }
+
+       public class Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_Err : Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ {
+               internal Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ in the success state.
+        */
+       public static Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ok(TwoTuple_BlindedPayInfoBlindedPathZ[] o) {
+               long ret = bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_ok(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_37 => o_conv_37 != null ? o_conv_37.ptr : 0)));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ret_hu_conv = Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ in the error state.
+        */
+       public static Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ err() {
+               long ret = bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ret_hu_conv = Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ clone() {
+               long ret = bindings.CResult_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ret_hu_conv = Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.cs
deleted file mode 100644 (file)
index 37fe4a2..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ : CommonBase {
-       Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ() {
-               if (ptr != 0) { bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_free(ptr); }
-       }
-
-       internal static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(ptr)) {
-                       return new Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_OK : Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ {
-               public readonly TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ[] res;
-               internal Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_ok(ptr);
-                       int res_conv_40_len = InternalUtils.getArrayLength(res);
-                       TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ[] res_conv_40_arr = new TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ[res_conv_40_len];
-                       for (int o = 0; o < res_conv_40_len; o++) {
-                               long res_conv_40 = InternalUtils.getU64ArrayElem(res, o);
-                               TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ res_conv_40_hu_conv = new TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ(null, res_conv_40);
-                               if (res_conv_40_hu_conv != null) { res_conv_40_hu_conv.ptrs_to.AddLast(this); };
-                               res_conv_40_arr[o] = res_conv_40_hu_conv;
-                       }
-                       bindings.free_buffer(res);
-                       this.res = res_conv_40_arr;
-               }
-       }
-
-       public class Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_Err : Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ {
-               public readonly ProbingError err;
-               internal Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_get_err(ptr);
-                       org.ldk.structs.ProbingError err_hu_conv = org.ldk.structs.ProbingError.constr_from_ptr(err);
-                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
-                       this.err = err_hu_conv;
-               }
-       }
-
-       /**
-        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ in the success state.
-        */
-       public static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ ok(TwoTuple_ThirtyTwoBytesThirtyTwoBytesZ[] o) {
-               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_ok(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_40 => o_conv_40 != null ? o_conv_40.ptr : 0)));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ in the error state.
-        */
-       public static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ err(org.ldk.structs.ProbingError e) {
-               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ clone() {
-               long ret = bindings.CResult_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_CVec_CVec_u8ZZNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_CVec_CVec_u8ZZNoneZ.cs
deleted file mode 100644 (file)
index 6daf0ab..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_CVec_CVec_u8ZZNoneZ : CommonBase {
-       Result_CVec_CVec_u8ZZNoneZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_CVec_CVec_u8ZZNoneZ() {
-               if (ptr != 0) { bindings.CResult_CVec_CVec_u8ZZNoneZ_free(ptr); }
-       }
-
-       internal static Result_CVec_CVec_u8ZZNoneZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_CVec_CVec_u8ZZNoneZ_is_ok(ptr)) {
-                       return new Result_CVec_CVec_u8ZZNoneZ_OK(null, ptr);
-               } else {
-                       return new Result_CVec_CVec_u8ZZNoneZ_Err(null, ptr);
-               }
-       }
-       public class Result_CVec_CVec_u8ZZNoneZ_OK : Result_CVec_CVec_u8ZZNoneZ {
-               public readonly byte[][] res;
-               internal Result_CVec_CVec_u8ZZNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_CVec_CVec_u8ZZNoneZ_get_ok(ptr);
-                       int res_conv_8_len = InternalUtils.getArrayLength(res);
-                       byte[][] res_conv_8_arr = new byte[res_conv_8_len][];
-                       for (int i = 0; i < res_conv_8_len; i++) {
-                               long res_conv_8 = InternalUtils.getU64ArrayElem(res, i);
-                               byte[] res_conv_8_conv = InternalUtils.decodeUint8Array(res_conv_8);
-                               res_conv_8_arr[i] = res_conv_8_conv;
-                       }
-                       bindings.free_buffer(res);
-                       this.res = res_conv_8_arr;
-               }
-       }
-
-       public class Result_CVec_CVec_u8ZZNoneZ_Err : Result_CVec_CVec_u8ZZNoneZ {
-               internal Result_CVec_CVec_u8ZZNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       /**
-        * Creates a new CResult_CVec_CVec_u8ZZNoneZ in the success state.
-        */
-       public static Result_CVec_CVec_u8ZZNoneZ ok(byte[][] o) {
-               long ret = bindings.CResult_CVec_CVec_u8ZZNoneZ_ok(InternalUtils.encodeUint64Array(InternalUtils.mapArray(o, o_conv_8 => InternalUtils.encodeUint8Array(o_conv_8))));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_CVec_u8ZZNoneZ ret_hu_conv = Result_CVec_CVec_u8ZZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_CVec_CVec_u8ZZNoneZ in the error state.
-        */
-       public static Result_CVec_CVec_u8ZZNoneZ err() {
-               long ret = bindings.CResult_CVec_CVec_u8ZZNoneZ_err();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_CVec_u8ZZNoneZ ret_hu_conv = Result_CVec_CVec_u8ZZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_CVec_CVec_u8ZZNoneZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_CVec_CVec_u8ZZNoneZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_CVec_CVec_u8ZZNoneZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_CVec_CVec_u8ZZNoneZ clone() {
-               long ret = bindings.CResult_CVec_CVec_u8ZZNoneZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_CVec_u8ZZNoneZ ret_hu_conv = Result_CVec_CVec_u8ZZNoneZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_DelayedPaymentBasepointDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_DelayedPaymentBasepointDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..1ff0bea
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_DelayedPaymentBasepointDecodeErrorZ : CommonBase {
+       Result_DelayedPaymentBasepointDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_DelayedPaymentBasepointDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_DelayedPaymentBasepointDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_DelayedPaymentBasepointDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_DelayedPaymentBasepointDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_DelayedPaymentBasepointDecodeErrorZ_OK : Result_DelayedPaymentBasepointDecodeErrorZ {
+               public readonly DelayedPaymentBasepoint res;
+               internal Result_DelayedPaymentBasepointDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.DelayedPaymentBasepoint res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.DelayedPaymentBasepoint(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_DelayedPaymentBasepointDecodeErrorZ_Err : Result_DelayedPaymentBasepointDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_DelayedPaymentBasepointDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_DelayedPaymentBasepointDecodeErrorZ in the success state.
+        */
+       public static Result_DelayedPaymentBasepointDecodeErrorZ ok(org.ldk.structs.DelayedPaymentBasepoint o) {
+               long ret = bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentBasepointDecodeErrorZ ret_hu_conv = Result_DelayedPaymentBasepointDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_DelayedPaymentBasepointDecodeErrorZ in the error state.
+        */
+       public static Result_DelayedPaymentBasepointDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentBasepointDecodeErrorZ ret_hu_conv = Result_DelayedPaymentBasepointDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_DelayedPaymentBasepointDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_DelayedPaymentBasepointDecodeErrorZ clone() {
+               long ret = bindings.CResult_DelayedPaymentBasepointDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentBasepointDecodeErrorZ ret_hu_conv = Result_DelayedPaymentBasepointDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_DelayedPaymentKeyDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_DelayedPaymentKeyDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..4fbf372
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_DelayedPaymentKeyDecodeErrorZ : CommonBase {
+       Result_DelayedPaymentKeyDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_DelayedPaymentKeyDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_DelayedPaymentKeyDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_DelayedPaymentKeyDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_DelayedPaymentKeyDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_DelayedPaymentKeyDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_DelayedPaymentKeyDecodeErrorZ_OK : Result_DelayedPaymentKeyDecodeErrorZ {
+               public readonly DelayedPaymentKey res;
+               internal Result_DelayedPaymentKeyDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_DelayedPaymentKeyDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.DelayedPaymentKey res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.DelayedPaymentKey(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_DelayedPaymentKeyDecodeErrorZ_Err : Result_DelayedPaymentKeyDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_DelayedPaymentKeyDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_DelayedPaymentKeyDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_DelayedPaymentKeyDecodeErrorZ in the success state.
+        */
+       public static Result_DelayedPaymentKeyDecodeErrorZ ok(org.ldk.structs.DelayedPaymentKey o) {
+               long ret = bindings.CResult_DelayedPaymentKeyDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentKeyDecodeErrorZ ret_hu_conv = Result_DelayedPaymentKeyDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_DelayedPaymentKeyDecodeErrorZ in the error state.
+        */
+       public static Result_DelayedPaymentKeyDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_DelayedPaymentKeyDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentKeyDecodeErrorZ ret_hu_conv = Result_DelayedPaymentKeyDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_DelayedPaymentKeyDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_DelayedPaymentKeyDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_DelayedPaymentKeyDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_DelayedPaymentKeyDecodeErrorZ clone() {
+               long ret = bindings.CResult_DelayedPaymentKeyDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_DelayedPaymentKeyDecodeErrorZ ret_hu_conv = Result_DelayedPaymentKeyDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_FinalOnionHopDataDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_FinalOnionHopDataDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..1a89d67
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_FinalOnionHopDataDecodeErrorZ : CommonBase {
+       Result_FinalOnionHopDataDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_FinalOnionHopDataDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_FinalOnionHopDataDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_FinalOnionHopDataDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_FinalOnionHopDataDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_FinalOnionHopDataDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_FinalOnionHopDataDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_FinalOnionHopDataDecodeErrorZ_OK : Result_FinalOnionHopDataDecodeErrorZ {
+               public readonly FinalOnionHopData res;
+               internal Result_FinalOnionHopDataDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_FinalOnionHopDataDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.FinalOnionHopData res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.FinalOnionHopData(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_FinalOnionHopDataDecodeErrorZ_Err : Result_FinalOnionHopDataDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_FinalOnionHopDataDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_FinalOnionHopDataDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_FinalOnionHopDataDecodeErrorZ in the success state.
+        */
+       public static Result_FinalOnionHopDataDecodeErrorZ ok(org.ldk.structs.FinalOnionHopData o) {
+               long ret = bindings.CResult_FinalOnionHopDataDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_FinalOnionHopDataDecodeErrorZ ret_hu_conv = Result_FinalOnionHopDataDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_FinalOnionHopDataDecodeErrorZ in the error state.
+        */
+       public static Result_FinalOnionHopDataDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_FinalOnionHopDataDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_FinalOnionHopDataDecodeErrorZ ret_hu_conv = Result_FinalOnionHopDataDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_FinalOnionHopDataDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_FinalOnionHopDataDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_FinalOnionHopDataDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_FinalOnionHopDataDecodeErrorZ clone() {
+               long ret = bindings.CResult_FinalOnionHopDataDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_FinalOnionHopDataDecodeErrorZ ret_hu_conv = Result_FinalOnionHopDataDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_HtlcBasepointDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_HtlcBasepointDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..eb9a6fd
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_HtlcBasepointDecodeErrorZ : CommonBase {
+       Result_HtlcBasepointDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_HtlcBasepointDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_HtlcBasepointDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_HtlcBasepointDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_HtlcBasepointDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_HtlcBasepointDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_HtlcBasepointDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_HtlcBasepointDecodeErrorZ_OK : Result_HtlcBasepointDecodeErrorZ {
+               public readonly HtlcBasepoint res;
+               internal Result_HtlcBasepointDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_HtlcBasepointDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.HtlcBasepoint res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.HtlcBasepoint(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_HtlcBasepointDecodeErrorZ_Err : Result_HtlcBasepointDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_HtlcBasepointDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_HtlcBasepointDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_HtlcBasepointDecodeErrorZ in the success state.
+        */
+       public static Result_HtlcBasepointDecodeErrorZ ok(org.ldk.structs.HtlcBasepoint o) {
+               long ret = bindings.CResult_HtlcBasepointDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcBasepointDecodeErrorZ ret_hu_conv = Result_HtlcBasepointDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_HtlcBasepointDecodeErrorZ in the error state.
+        */
+       public static Result_HtlcBasepointDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_HtlcBasepointDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcBasepointDecodeErrorZ ret_hu_conv = Result_HtlcBasepointDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_HtlcBasepointDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_HtlcBasepointDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_HtlcBasepointDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_HtlcBasepointDecodeErrorZ clone() {
+               long ret = bindings.CResult_HtlcBasepointDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcBasepointDecodeErrorZ ret_hu_conv = Result_HtlcBasepointDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_HtlcKeyDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_HtlcKeyDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..6a44b28
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_HtlcKeyDecodeErrorZ : CommonBase {
+       Result_HtlcKeyDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_HtlcKeyDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_HtlcKeyDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_HtlcKeyDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_HtlcKeyDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_HtlcKeyDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_HtlcKeyDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_HtlcKeyDecodeErrorZ_OK : Result_HtlcKeyDecodeErrorZ {
+               public readonly HtlcKey res;
+               internal Result_HtlcKeyDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_HtlcKeyDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.HtlcKey res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.HtlcKey(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_HtlcKeyDecodeErrorZ_Err : Result_HtlcKeyDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_HtlcKeyDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_HtlcKeyDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_HtlcKeyDecodeErrorZ in the success state.
+        */
+       public static Result_HtlcKeyDecodeErrorZ ok(org.ldk.structs.HtlcKey o) {
+               long ret = bindings.CResult_HtlcKeyDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcKeyDecodeErrorZ ret_hu_conv = Result_HtlcKeyDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_HtlcKeyDecodeErrorZ in the error state.
+        */
+       public static Result_HtlcKeyDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_HtlcKeyDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcKeyDecodeErrorZ ret_hu_conv = Result_HtlcKeyDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_HtlcKeyDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_HtlcKeyDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_HtlcKeyDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_HtlcKeyDecodeErrorZ clone() {
+               long ret = bindings.CResult_HtlcKeyDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_HtlcKeyDecodeErrorZ ret_hu_conv = Result_HtlcKeyDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_NonePaymentErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_NonePaymentErrorZ.cs
deleted file mode 100644 (file)
index 706cbf4..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_NonePaymentErrorZ : CommonBase {
-       Result_NonePaymentErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_NonePaymentErrorZ() {
-               if (ptr != 0) { bindings.CResult_NonePaymentErrorZ_free(ptr); }
-       }
-
-       internal static Result_NonePaymentErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_NonePaymentErrorZ_is_ok(ptr)) {
-                       return new Result_NonePaymentErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_NonePaymentErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_NonePaymentErrorZ_OK : Result_NonePaymentErrorZ {
-               internal Result_NonePaymentErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       public class Result_NonePaymentErrorZ_Err : Result_NonePaymentErrorZ {
-               public readonly PaymentError err;
-               internal Result_NonePaymentErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_NonePaymentErrorZ_get_err(ptr);
-                       org.ldk.structs.PaymentError err_hu_conv = org.ldk.structs.PaymentError.constr_from_ptr(err);
-                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
-                       this.err = err_hu_conv;
-               }
-       }
-
-       /**
-        * Creates a new CResult_NonePaymentErrorZ in the success state.
-        */
-       public static Result_NonePaymentErrorZ ok() {
-               long ret = bindings.CResult_NonePaymentErrorZ_ok();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NonePaymentErrorZ ret_hu_conv = Result_NonePaymentErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_NonePaymentErrorZ in the error state.
-        */
-       public static Result_NonePaymentErrorZ err(org.ldk.structs.PaymentError e) {
-               long ret = bindings.CResult_NonePaymentErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NonePaymentErrorZ ret_hu_conv = Result_NonePaymentErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_NonePaymentErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_NonePaymentErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_NonePaymentErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_NonePaymentErrorZ clone() {
-               long ret = bindings.CResult_NonePaymentErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NonePaymentErrorZ ret_hu_conv = Result_NonePaymentErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_NoneSendErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_NoneSendErrorZ.cs
deleted file mode 100644 (file)
index c9ae603..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_NoneSendErrorZ : CommonBase {
-       Result_NoneSendErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_NoneSendErrorZ() {
-               if (ptr != 0) { bindings.CResult_NoneSendErrorZ_free(ptr); }
-       }
-
-       internal static Result_NoneSendErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_NoneSendErrorZ_is_ok(ptr)) {
-                       return new Result_NoneSendErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_NoneSendErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_NoneSendErrorZ_OK : Result_NoneSendErrorZ {
-               internal Result_NoneSendErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-               }
-       }
-
-       public class Result_NoneSendErrorZ_Err : Result_NoneSendErrorZ {
-               public readonly SendError err;
-               internal Result_NoneSendErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_NoneSendErrorZ_get_err(ptr);
-                       org.ldk.structs.SendError err_hu_conv = org.ldk.structs.SendError.constr_from_ptr(err);
-                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
-                       this.err = err_hu_conv;
-               }
-       }
-
-       /**
-        * Creates a new CResult_NoneSendErrorZ in the success state.
-        */
-       public static Result_NoneSendErrorZ ok() {
-               long ret = bindings.CResult_NoneSendErrorZ_ok();
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneSendErrorZ ret_hu_conv = Result_NoneSendErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_NoneSendErrorZ in the error state.
-        */
-       public static Result_NoneSendErrorZ err(org.ldk.structs.SendError e) {
-               long ret = bindings.CResult_NoneSendErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NoneSendErrorZ ret_hu_conv = Result_NoneSendErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_NoneSendErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_OnionPacketDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_OnionPacketDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..d699ca0
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_OnionPacketDecodeErrorZ : CommonBase {
+       Result_OnionPacketDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_OnionPacketDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_OnionPacketDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_OnionPacketDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_OnionPacketDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_OnionPacketDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_OnionPacketDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_OnionPacketDecodeErrorZ_OK : Result_OnionPacketDecodeErrorZ {
+               public readonly OnionPacket res;
+               internal Result_OnionPacketDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_OnionPacketDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.OnionPacket res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.OnionPacket(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_OnionPacketDecodeErrorZ_Err : Result_OnionPacketDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_OnionPacketDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_OnionPacketDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_OnionPacketDecodeErrorZ in the success state.
+        */
+       public static Result_OnionPacketDecodeErrorZ ok(org.ldk.structs.OnionPacket o) {
+               long ret = bindings.CResult_OnionPacketDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_OnionPacketDecodeErrorZ ret_hu_conv = Result_OnionPacketDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_OnionPacketDecodeErrorZ in the error state.
+        */
+       public static Result_OnionPacketDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_OnionPacketDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_OnionPacketDecodeErrorZ ret_hu_conv = Result_OnionPacketDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_OnionPacketDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_OnionPacketDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_OnionPacketDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_OnionPacketDecodeErrorZ clone() {
+               long ret = bindings.CResult_OnionPacketDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_OnionPacketDecodeErrorZ ret_hu_conv = Result_OnionPacketDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PendingHTLCInfoDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PendingHTLCInfoDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..4601eb8
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_PendingHTLCInfoDecodeErrorZ : CommonBase {
+       Result_PendingHTLCInfoDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PendingHTLCInfoDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_PendingHTLCInfoDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_PendingHTLCInfoDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PendingHTLCInfoDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_PendingHTLCInfoDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_PendingHTLCInfoDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_PendingHTLCInfoDecodeErrorZ_OK : Result_PendingHTLCInfoDecodeErrorZ {
+               public readonly PendingHTLCInfo res;
+               internal Result_PendingHTLCInfoDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PendingHTLCInfoDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.PendingHTLCInfo res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.PendingHTLCInfo(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_PendingHTLCInfoDecodeErrorZ_Err : Result_PendingHTLCInfoDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_PendingHTLCInfoDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_PendingHTLCInfoDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCInfoDecodeErrorZ in the success state.
+        */
+       public static Result_PendingHTLCInfoDecodeErrorZ ok(org.ldk.structs.PendingHTLCInfo o) {
+               long ret = bindings.CResult_PendingHTLCInfoDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCInfoDecodeErrorZ ret_hu_conv = Result_PendingHTLCInfoDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCInfoDecodeErrorZ in the error state.
+        */
+       public static Result_PendingHTLCInfoDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_PendingHTLCInfoDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCInfoDecodeErrorZ ret_hu_conv = Result_PendingHTLCInfoDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_PendingHTLCInfoDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_PendingHTLCInfoDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCInfoDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_PendingHTLCInfoDecodeErrorZ clone() {
+               long ret = bindings.CResult_PendingHTLCInfoDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCInfoDecodeErrorZ ret_hu_conv = Result_PendingHTLCInfoDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PendingHTLCInfoInboundHTLCErrZ.cs b/c_sharp/src/org/ldk/structs/Result_PendingHTLCInfoInboundHTLCErrZ.cs
new file mode 100644 (file)
index 0000000..5b179ad
--- /dev/null
@@ -0,0 +1,78 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_PendingHTLCInfoInboundHTLCErrZ : CommonBase {
+       Result_PendingHTLCInfoInboundHTLCErrZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PendingHTLCInfoInboundHTLCErrZ() {
+               if (ptr != 0) { bindings.CResult_PendingHTLCInfoInboundHTLCErrZ_free(ptr); }
+       }
+
+       internal static Result_PendingHTLCInfoInboundHTLCErrZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(ptr)) {
+                       return new Result_PendingHTLCInfoInboundHTLCErrZ_OK(null, ptr);
+               } else {
+                       return new Result_PendingHTLCInfoInboundHTLCErrZ_Err(null, ptr);
+               }
+       }
+       public class Result_PendingHTLCInfoInboundHTLCErrZ_OK : Result_PendingHTLCInfoInboundHTLCErrZ {
+               public readonly PendingHTLCInfo res;
+               internal Result_PendingHTLCInfoInboundHTLCErrZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PendingHTLCInfoInboundHTLCErrZ_get_ok(ptr);
+                       org.ldk.structs.PendingHTLCInfo res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.PendingHTLCInfo(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_PendingHTLCInfoInboundHTLCErrZ_Err : Result_PendingHTLCInfoInboundHTLCErrZ {
+               public readonly InboundHTLCErr err;
+               internal Result_PendingHTLCInfoInboundHTLCErrZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_PendingHTLCInfoInboundHTLCErrZ_get_err(ptr);
+                       org.ldk.structs.InboundHTLCErr err_hu_conv = null; if (err < 0 || err > 4096) { err_hu_conv = new org.ldk.structs.InboundHTLCErr(null, err); }
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCInfoInboundHTLCErrZ in the success state.
+        */
+       public static Result_PendingHTLCInfoInboundHTLCErrZ ok(org.ldk.structs.PendingHTLCInfo o) {
+               long ret = bindings.CResult_PendingHTLCInfoInboundHTLCErrZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCInfoInboundHTLCErrZ ret_hu_conv = Result_PendingHTLCInfoInboundHTLCErrZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCInfoInboundHTLCErrZ in the error state.
+        */
+       public static Result_PendingHTLCInfoInboundHTLCErrZ err(short e_err_code_arg, byte[] e_err_data_arg, string e_msg_arg) {
+               long ret = bindings.CResult_PendingHTLCInfoInboundHTLCErrZ_err(bindings.InboundHTLCErr_new(e_err_code_arg, InternalUtils.encodeUint8Array(e_err_data_arg), InternalUtils.encodeString(e_msg_arg)));
+               GC.KeepAlive(e_err_code_arg);
+               GC.KeepAlive(e_err_data_arg);
+               GC.KeepAlive(e_msg_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCInfoInboundHTLCErrZ ret_hu_conv = Result_PendingHTLCInfoInboundHTLCErrZ.constr_from_ptr(ret);
+               ;
+               ;
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_PendingHTLCInfoInboundHTLCErrZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_PendingHTLCRoutingDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_PendingHTLCRoutingDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..e4527a2
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_PendingHTLCRoutingDecodeErrorZ : CommonBase {
+       Result_PendingHTLCRoutingDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_PendingHTLCRoutingDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_PendingHTLCRoutingDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_PendingHTLCRoutingDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_PendingHTLCRoutingDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_PendingHTLCRoutingDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_PendingHTLCRoutingDecodeErrorZ_OK : Result_PendingHTLCRoutingDecodeErrorZ {
+               public readonly PendingHTLCRouting res;
+               internal Result_PendingHTLCRoutingDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_PendingHTLCRoutingDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.PendingHTLCRouting res_hu_conv = org.ldk.structs.PendingHTLCRouting.constr_from_ptr(res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_PendingHTLCRoutingDecodeErrorZ_Err : Result_PendingHTLCRoutingDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_PendingHTLCRoutingDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_PendingHTLCRoutingDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCRoutingDecodeErrorZ in the success state.
+        */
+       public static Result_PendingHTLCRoutingDecodeErrorZ ok(org.ldk.structs.PendingHTLCRouting o) {
+               long ret = bindings.CResult_PendingHTLCRoutingDecodeErrorZ_ok(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCRoutingDecodeErrorZ ret_hu_conv = Result_PendingHTLCRoutingDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCRoutingDecodeErrorZ in the error state.
+        */
+       public static Result_PendingHTLCRoutingDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_PendingHTLCRoutingDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCRoutingDecodeErrorZ ret_hu_conv = Result_PendingHTLCRoutingDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_PendingHTLCRoutingDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_PendingHTLCRoutingDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_PendingHTLCRoutingDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_PendingHTLCRoutingDecodeErrorZ clone() {
+               long ret = bindings.CResult_PendingHTLCRoutingDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCRoutingDecodeErrorZ ret_hu_conv = Result_PendingHTLCRoutingDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ReceiveTlvsDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_ReceiveTlvsDecodeErrorZ.cs
deleted file mode 100644 (file)
index 47e6f89..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_ReceiveTlvsDecodeErrorZ : CommonBase {
-       Result_ReceiveTlvsDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_ReceiveTlvsDecodeErrorZ() {
-               if (ptr != 0) { bindings.CResult_ReceiveTlvsDecodeErrorZ_free(ptr); }
-       }
-
-       internal static Result_ReceiveTlvsDecodeErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_ReceiveTlvsDecodeErrorZ_is_ok(ptr)) {
-                       return new Result_ReceiveTlvsDecodeErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_ReceiveTlvsDecodeErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_ReceiveTlvsDecodeErrorZ_OK : Result_ReceiveTlvsDecodeErrorZ {
-               public readonly ReceiveTlvs res;
-               internal Result_ReceiveTlvsDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_ReceiveTlvsDecodeErrorZ_get_ok(ptr);
-                       org.ldk.structs.ReceiveTlvs res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.ReceiveTlvs(null, res); }
-                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
-                       this.res = res_hu_conv;
-               }
-       }
-
-       public class Result_ReceiveTlvsDecodeErrorZ_Err : Result_ReceiveTlvsDecodeErrorZ {
-               public readonly DecodeError err;
-               internal Result_ReceiveTlvsDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_ReceiveTlvsDecodeErrorZ_get_err(ptr);
-                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
-                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
-                       this.err = err_hu_conv;
-               }
-       }
-
-       /**
-        * Creates a new CResult_ReceiveTlvsDecodeErrorZ in the success state.
-        */
-       public static Result_ReceiveTlvsDecodeErrorZ ok(org.ldk.structs.ReceiveTlvs o) {
-               long ret = bindings.CResult_ReceiveTlvsDecodeErrorZ_ok(o == null ? 0 : o.ptr);
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ReceiveTlvsDecodeErrorZ ret_hu_conv = Result_ReceiveTlvsDecodeErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_ReceiveTlvsDecodeErrorZ in the error state.
-        */
-       public static Result_ReceiveTlvsDecodeErrorZ err(org.ldk.structs.DecodeError e) {
-               long ret = bindings.CResult_ReceiveTlvsDecodeErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ReceiveTlvsDecodeErrorZ ret_hu_conv = Result_ReceiveTlvsDecodeErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_ReceiveTlvsDecodeErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_ReceiveTlvsDecodeErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_ReceiveTlvsDecodeErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_ReceiveTlvsDecodeErrorZ clone() {
-               long ret = bindings.CResult_ReceiveTlvsDecodeErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ReceiveTlvsDecodeErrorZ ret_hu_conv = Result_ReceiveTlvsDecodeErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_RevocationBasepointDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_RevocationBasepointDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..700113a
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_RevocationBasepointDecodeErrorZ : CommonBase {
+       Result_RevocationBasepointDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_RevocationBasepointDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_RevocationBasepointDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_RevocationBasepointDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_RevocationBasepointDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_RevocationBasepointDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_RevocationBasepointDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_RevocationBasepointDecodeErrorZ_OK : Result_RevocationBasepointDecodeErrorZ {
+               public readonly RevocationBasepoint res;
+               internal Result_RevocationBasepointDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_RevocationBasepointDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.RevocationBasepoint res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.RevocationBasepoint(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_RevocationBasepointDecodeErrorZ_Err : Result_RevocationBasepointDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_RevocationBasepointDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_RevocationBasepointDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_RevocationBasepointDecodeErrorZ in the success state.
+        */
+       public static Result_RevocationBasepointDecodeErrorZ ok(org.ldk.structs.RevocationBasepoint o) {
+               long ret = bindings.CResult_RevocationBasepointDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationBasepointDecodeErrorZ ret_hu_conv = Result_RevocationBasepointDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_RevocationBasepointDecodeErrorZ in the error state.
+        */
+       public static Result_RevocationBasepointDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_RevocationBasepointDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationBasepointDecodeErrorZ ret_hu_conv = Result_RevocationBasepointDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_RevocationBasepointDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_RevocationBasepointDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_RevocationBasepointDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_RevocationBasepointDecodeErrorZ clone() {
+               long ret = bindings.CResult_RevocationBasepointDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationBasepointDecodeErrorZ ret_hu_conv = Result_RevocationBasepointDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_RevocationKeyDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_RevocationKeyDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..8278d2f
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_RevocationKeyDecodeErrorZ : CommonBase {
+       Result_RevocationKeyDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_RevocationKeyDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_RevocationKeyDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_RevocationKeyDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_RevocationKeyDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_RevocationKeyDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_RevocationKeyDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_RevocationKeyDecodeErrorZ_OK : Result_RevocationKeyDecodeErrorZ {
+               public readonly RevocationKey res;
+               internal Result_RevocationKeyDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_RevocationKeyDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.RevocationKey res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.RevocationKey(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_RevocationKeyDecodeErrorZ_Err : Result_RevocationKeyDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_RevocationKeyDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_RevocationKeyDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_RevocationKeyDecodeErrorZ in the success state.
+        */
+       public static Result_RevocationKeyDecodeErrorZ ok(org.ldk.structs.RevocationKey o) {
+               long ret = bindings.CResult_RevocationKeyDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationKeyDecodeErrorZ ret_hu_conv = Result_RevocationKeyDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_RevocationKeyDecodeErrorZ in the error state.
+        */
+       public static Result_RevocationKeyDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_RevocationKeyDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationKeyDecodeErrorZ ret_hu_conv = Result_RevocationKeyDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_RevocationKeyDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_RevocationKeyDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_RevocationKeyDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_RevocationKeyDecodeErrorZ clone() {
+               long ret = bindings.CResult_RevocationKeyDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationKeyDecodeErrorZ ret_hu_conv = Result_RevocationKeyDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SendSuccessSendErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_SendSuccessSendErrorZ.cs
new file mode 100644 (file)
index 0000000..c608d13
--- /dev/null
@@ -0,0 +1,75 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_SendSuccessSendErrorZ : CommonBase {
+       Result_SendSuccessSendErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_SendSuccessSendErrorZ() {
+               if (ptr != 0) { bindings.CResult_SendSuccessSendErrorZ_free(ptr); }
+       }
+
+       internal static Result_SendSuccessSendErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_SendSuccessSendErrorZ_is_ok(ptr)) {
+                       return new Result_SendSuccessSendErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_SendSuccessSendErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_SendSuccessSendErrorZ_OK : Result_SendSuccessSendErrorZ {
+               public readonly SendSuccess res;
+               internal Result_SendSuccessSendErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_SendSuccessSendErrorZ_get_ok(ptr);
+                       org.ldk.structs.SendSuccess res_hu_conv = org.ldk.structs.SendSuccess.constr_from_ptr(res);
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_SendSuccessSendErrorZ_Err : Result_SendSuccessSendErrorZ {
+               public readonly SendError err;
+               internal Result_SendSuccessSendErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_SendSuccessSendErrorZ_get_err(ptr);
+                       org.ldk.structs.SendError err_hu_conv = org.ldk.structs.SendError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_SendSuccessSendErrorZ in the success state.
+        */
+       public static Result_SendSuccessSendErrorZ ok(org.ldk.structs.SendSuccess o) {
+               long ret = bindings.CResult_SendSuccessSendErrorZ_ok(o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SendSuccessSendErrorZ ret_hu_conv = Result_SendSuccessSendErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_SendSuccessSendErrorZ in the error state.
+        */
+       public static Result_SendSuccessSendErrorZ err(org.ldk.structs.SendError e) {
+               long ret = bindings.CResult_SendSuccessSendErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SendSuccessSendErrorZ ret_hu_conv = Result_SendSuccessSendErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_SendSuccessSendErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SpliceAckDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_SpliceAckDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..2034f6b
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_SpliceAckDecodeErrorZ : CommonBase {
+       Result_SpliceAckDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_SpliceAckDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_SpliceAckDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_SpliceAckDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_SpliceAckDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_SpliceAckDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_SpliceAckDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_SpliceAckDecodeErrorZ_OK : Result_SpliceAckDecodeErrorZ {
+               public readonly SpliceAck res;
+               internal Result_SpliceAckDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_SpliceAckDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.SpliceAck res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.SpliceAck(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_SpliceAckDecodeErrorZ_Err : Result_SpliceAckDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_SpliceAckDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_SpliceAckDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_SpliceAckDecodeErrorZ in the success state.
+        */
+       public static Result_SpliceAckDecodeErrorZ ok(org.ldk.structs.SpliceAck o) {
+               long ret = bindings.CResult_SpliceAckDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceAckDecodeErrorZ ret_hu_conv = Result_SpliceAckDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_SpliceAckDecodeErrorZ in the error state.
+        */
+       public static Result_SpliceAckDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_SpliceAckDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceAckDecodeErrorZ ret_hu_conv = Result_SpliceAckDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_SpliceAckDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_SpliceAckDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_SpliceAckDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_SpliceAckDecodeErrorZ clone() {
+               long ret = bindings.CResult_SpliceAckDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceAckDecodeErrorZ ret_hu_conv = Result_SpliceAckDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SpliceDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_SpliceDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..8d9f07b
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_SpliceDecodeErrorZ : CommonBase {
+       Result_SpliceDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_SpliceDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_SpliceDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_SpliceDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_SpliceDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_SpliceDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_SpliceDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_SpliceDecodeErrorZ_OK : Result_SpliceDecodeErrorZ {
+               public readonly Splice res;
+               internal Result_SpliceDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_SpliceDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.Splice res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.Splice(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_SpliceDecodeErrorZ_Err : Result_SpliceDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_SpliceDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_SpliceDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_SpliceDecodeErrorZ in the success state.
+        */
+       public static Result_SpliceDecodeErrorZ ok(org.ldk.structs.Splice o) {
+               long ret = bindings.CResult_SpliceDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceDecodeErrorZ ret_hu_conv = Result_SpliceDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_SpliceDecodeErrorZ in the error state.
+        */
+       public static Result_SpliceDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_SpliceDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceDecodeErrorZ ret_hu_conv = Result_SpliceDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_SpliceDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_SpliceDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_SpliceDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_SpliceDecodeErrorZ clone() {
+               long ret = bindings.CResult_SpliceDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceDecodeErrorZ ret_hu_conv = Result_SpliceDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_SpliceLockedDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_SpliceLockedDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..e8aafaa
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_SpliceLockedDecodeErrorZ : CommonBase {
+       Result_SpliceLockedDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_SpliceLockedDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_SpliceLockedDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_SpliceLockedDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_SpliceLockedDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_SpliceLockedDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_SpliceLockedDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_SpliceLockedDecodeErrorZ_OK : Result_SpliceLockedDecodeErrorZ {
+               public readonly SpliceLocked res;
+               internal Result_SpliceLockedDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_SpliceLockedDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.SpliceLocked res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.SpliceLocked(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_SpliceLockedDecodeErrorZ_Err : Result_SpliceLockedDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_SpliceLockedDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_SpliceLockedDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_SpliceLockedDecodeErrorZ in the success state.
+        */
+       public static Result_SpliceLockedDecodeErrorZ ok(org.ldk.structs.SpliceLocked o) {
+               long ret = bindings.CResult_SpliceLockedDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceLockedDecodeErrorZ ret_hu_conv = Result_SpliceLockedDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_SpliceLockedDecodeErrorZ in the error state.
+        */
+       public static Result_SpliceLockedDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_SpliceLockedDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceLockedDecodeErrorZ ret_hu_conv = Result_SpliceLockedDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_SpliceLockedDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_SpliceLockedDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_SpliceLockedDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_SpliceLockedDecodeErrorZ clone() {
+               long ret = bindings.CResult_SpliceLockedDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceLockedDecodeErrorZ ret_hu_conv = Result_SpliceLockedDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_StfuDecodeErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_StfuDecodeErrorZ.cs
new file mode 100644 (file)
index 0000000..4168537
--- /dev/null
@@ -0,0 +1,93 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_StfuDecodeErrorZ : CommonBase {
+       Result_StfuDecodeErrorZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_StfuDecodeErrorZ() {
+               if (ptr != 0) { bindings.CResult_StfuDecodeErrorZ_free(ptr); }
+       }
+
+       internal static Result_StfuDecodeErrorZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_StfuDecodeErrorZ_is_ok(ptr)) {
+                       return new Result_StfuDecodeErrorZ_OK(null, ptr);
+               } else {
+                       return new Result_StfuDecodeErrorZ_Err(null, ptr);
+               }
+       }
+       public class Result_StfuDecodeErrorZ_OK : Result_StfuDecodeErrorZ {
+               public readonly Stfu res;
+               internal Result_StfuDecodeErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_StfuDecodeErrorZ_get_ok(ptr);
+                       org.ldk.structs.Stfu res_hu_conv = null; if (res < 0 || res > 4096) { res_hu_conv = new org.ldk.structs.Stfu(null, res); }
+                       if (res_hu_conv != null) { res_hu_conv.ptrs_to.AddLast(this); };
+                       this.res = res_hu_conv;
+               }
+       }
+
+       public class Result_StfuDecodeErrorZ_Err : Result_StfuDecodeErrorZ {
+               public readonly DecodeError err;
+               internal Result_StfuDecodeErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long err = bindings.CResult_StfuDecodeErrorZ_get_err(ptr);
+                       org.ldk.structs.DecodeError err_hu_conv = org.ldk.structs.DecodeError.constr_from_ptr(err);
+                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
+                       this.err = err_hu_conv;
+               }
+       }
+
+       /**
+        * Creates a new CResult_StfuDecodeErrorZ in the success state.
+        */
+       public static Result_StfuDecodeErrorZ ok(org.ldk.structs.Stfu o) {
+               long ret = bindings.CResult_StfuDecodeErrorZ_ok(o == null ? 0 : o.ptr);
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_StfuDecodeErrorZ ret_hu_conv = Result_StfuDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(o); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_StfuDecodeErrorZ in the error state.
+        */
+       public static Result_StfuDecodeErrorZ err(org.ldk.structs.DecodeError e) {
+               long ret = bindings.CResult_StfuDecodeErrorZ_err(e.ptr);
+               GC.KeepAlive(e);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_StfuDecodeErrorZ ret_hu_conv = Result_StfuDecodeErrorZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_StfuDecodeErrorZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_StfuDecodeErrorZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_StfuDecodeErrorZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_StfuDecodeErrorZ clone() {
+               long ret = bindings.CResult_StfuDecodeErrorZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_StfuDecodeErrorZ ret_hu_conv = Result_StfuDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesPaymentErrorZ.cs b/c_sharp/src/org/ldk/structs/Result_ThirtyTwoBytesPaymentErrorZ.cs
deleted file mode 100644 (file)
index 2b15ab1..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-public class Result_ThirtyTwoBytesPaymentErrorZ : CommonBase {
-       Result_ThirtyTwoBytesPaymentErrorZ(object _dummy, long ptr) : base(ptr) { }
-       ~Result_ThirtyTwoBytesPaymentErrorZ() {
-               if (ptr != 0) { bindings.CResult_ThirtyTwoBytesPaymentErrorZ_free(ptr); }
-       }
-
-       internal static Result_ThirtyTwoBytesPaymentErrorZ constr_from_ptr(long ptr) {
-               if (bindings.CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(ptr)) {
-                       return new Result_ThirtyTwoBytesPaymentErrorZ_OK(null, ptr);
-               } else {
-                       return new Result_ThirtyTwoBytesPaymentErrorZ_Err(null, ptr);
-               }
-       }
-       public class Result_ThirtyTwoBytesPaymentErrorZ_OK : Result_ThirtyTwoBytesPaymentErrorZ {
-               public readonly byte[] res;
-               internal Result_ThirtyTwoBytesPaymentErrorZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long res = bindings.CResult_ThirtyTwoBytesPaymentErrorZ_get_ok(ptr);
-                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
-                       this.res = res_conv;
-               }
-       }
-
-       public class Result_ThirtyTwoBytesPaymentErrorZ_Err : Result_ThirtyTwoBytesPaymentErrorZ {
-               public readonly PaymentError err;
-               internal Result_ThirtyTwoBytesPaymentErrorZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
-                       long err = bindings.CResult_ThirtyTwoBytesPaymentErrorZ_get_err(ptr);
-                       org.ldk.structs.PaymentError err_hu_conv = org.ldk.structs.PaymentError.constr_from_ptr(err);
-                       if (err_hu_conv != null) { err_hu_conv.ptrs_to.AddLast(this); };
-                       this.err = err_hu_conv;
-               }
-       }
-
-       /**
-        * Creates a new CResult_ThirtyTwoBytesPaymentErrorZ in the success state.
-        */
-       public static Result_ThirtyTwoBytesPaymentErrorZ ok(byte[] o) {
-               long ret = bindings.CResult_ThirtyTwoBytesPaymentErrorZ_ok(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(o, 32)));
-               GC.KeepAlive(o);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ThirtyTwoBytesPaymentErrorZ ret_hu_conv = Result_ThirtyTwoBytesPaymentErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new CResult_ThirtyTwoBytesPaymentErrorZ in the error state.
-        */
-       public static Result_ThirtyTwoBytesPaymentErrorZ err(org.ldk.structs.PaymentError e) {
-               long ret = bindings.CResult_ThirtyTwoBytesPaymentErrorZ_err(e.ptr);
-               GC.KeepAlive(e);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ThirtyTwoBytesPaymentErrorZ ret_hu_conv = Result_ThirtyTwoBytesPaymentErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(e); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Checks if the given object is currently in the success state
-        */
-       public bool is_ok() {
-               bool ret = bindings.CResult_ThirtyTwoBytesPaymentErrorZ_is_ok(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.CResult_ThirtyTwoBytesPaymentErrorZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new CResult_ThirtyTwoBytesPaymentErrorZ which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public Result_ThirtyTwoBytesPaymentErrorZ clone() {
-               long ret = bindings.CResult_ThirtyTwoBytesPaymentErrorZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ThirtyTwoBytesPaymentErrorZ ret_hu_conv = Result_ThirtyTwoBytesPaymentErrorZ.constr_from_ptr(ret);
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/Result_WitnessNoneZ.cs b/c_sharp/src/org/ldk/structs/Result_WitnessNoneZ.cs
new file mode 100644 (file)
index 0000000..fcb0bc3
--- /dev/null
@@ -0,0 +1,84 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class Result_WitnessNoneZ : CommonBase {
+       Result_WitnessNoneZ(object _dummy, long ptr) : base(ptr) { }
+       ~Result_WitnessNoneZ() {
+               if (ptr != 0) { bindings.CResult_WitnessNoneZ_free(ptr); }
+       }
+
+       internal static Result_WitnessNoneZ constr_from_ptr(long ptr) {
+               if (bindings.CResult_WitnessNoneZ_is_ok(ptr)) {
+                       return new Result_WitnessNoneZ_OK(null, ptr);
+               } else {
+                       return new Result_WitnessNoneZ_Err(null, ptr);
+               }
+       }
+       public class Result_WitnessNoneZ_OK : Result_WitnessNoneZ {
+               public readonly byte[] res;
+               internal Result_WitnessNoneZ_OK(object _dummy, long ptr) : base(_dummy, ptr) {
+                       long res = bindings.CResult_WitnessNoneZ_get_ok(ptr);
+                       byte[] res_conv = InternalUtils.decodeUint8Array(res);
+                       this.res = res_conv;
+               }
+       }
+
+       public class Result_WitnessNoneZ_Err : Result_WitnessNoneZ {
+               internal Result_WitnessNoneZ_Err(object _dummy, long ptr) : base(_dummy, ptr) {
+               }
+       }
+
+       /**
+        * Creates a new CResult_WitnessNoneZ in the success state.
+        */
+       public static Result_WitnessNoneZ ok(byte[] o) {
+               long ret = bindings.CResult_WitnessNoneZ_ok(InternalUtils.encodeUint8Array(o));
+               GC.KeepAlive(o);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_WitnessNoneZ ret_hu_conv = Result_WitnessNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new CResult_WitnessNoneZ in the error state.
+        */
+       public static Result_WitnessNoneZ err() {
+               long ret = bindings.CResult_WitnessNoneZ_err();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_WitnessNoneZ ret_hu_conv = Result_WitnessNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if the given object is currently in the success state
+        */
+       public bool is_ok() {
+               bool ret = bindings.CResult_WitnessNoneZ_is_ok(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.CResult_WitnessNoneZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new CResult_WitnessNoneZ which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public Result_WitnessNoneZ clone() {
+               long ret = bindings.CResult_WitnessNoneZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_WitnessNoneZ ret_hu_conv = Result_WitnessNoneZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/RevocationBasepoint.cs b/c_sharp/src/org/ldk/structs/RevocationBasepoint.cs
new file mode 100644 (file)
index 0000000..d225440
--- /dev/null
@@ -0,0 +1,126 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * Master key used in conjunction with per_commitment_point to generate [htlcpubkey](https://github.com/lightning/bolts/blob/master/03-transactions.md#key-derivation) for the latest state of a channel.
+ * A watcher can be given a [RevocationBasepoint] to generate per commitment [RevocationKey] to create justice transactions.
+ */
+public class RevocationBasepoint : CommonBase {
+       internal RevocationBasepoint(object _dummy, long ptr) : base(ptr) { }
+       ~RevocationBasepoint() {
+               if (ptr != 0) { bindings.RevocationBasepoint_free(ptr); }
+       }
+
+       public byte[] get_a() {
+               long ret = bindings.RevocationBasepoint_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       public void set_a(byte[] val) {
+               bindings.RevocationBasepoint_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new RevocationBasepoint given each field
+        */
+       public static RevocationBasepoint of(byte[] a_arg) {
+               long ret = bindings.RevocationBasepoint_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 33)));
+               GC.KeepAlive(a_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RevocationBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two RevocationBasepoints contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.RevocationBasepoint b) {
+               bool ret = bindings.RevocationBasepoint_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is RevocationBasepoint)) return false;
+               return this.eq((RevocationBasepoint)o);
+       }
+       internal long clone_ptr() {
+               long ret = bindings.RevocationBasepoint_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the RevocationBasepoint
+        */
+       public RevocationBasepoint clone() {
+               long ret = bindings.RevocationBasepoint_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RevocationBasepoint ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationBasepoint(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Generates a non-cryptographic 64-bit hash of the RevocationBasepoint.
+        */
+       public long hash() {
+               long ret = bindings.RevocationBasepoint_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
+       /**
+        * Get inner Public Key
+        */
+       public byte[] to_public_key() {
+               long ret = bindings.RevocationBasepoint_to_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Serialize the RevocationBasepoint object into a byte array which can be read by RevocationBasepoint_read
+        */
+       public byte[] write() {
+               long ret = bindings.RevocationBasepoint_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a RevocationBasepoint from a byte array, created by RevocationBasepoint_write
+        */
+       public static Result_RevocationBasepointDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.RevocationBasepoint_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationBasepointDecodeErrorZ ret_hu_conv = Result_RevocationBasepointDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/RevocationKey.cs b/c_sharp/src/org/ldk/structs/RevocationKey.cs
new file mode 100644 (file)
index 0000000..9fe538d
--- /dev/null
@@ -0,0 +1,154 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * The revocation key is used to allow a channel party to revoke their state - giving their
+ * counterparty the required material to claim all of their funds if they broadcast that state.
+ * 
+ * Each commitment transaction has a revocation key based on the basepoint and
+ * per_commitment_point which is used in both commitment and HTLC transactions.
+ * 
+ * See [the BOLT spec for derivation details]
+ * (https://github.com/lightning/bolts/blob/master/03-transactions.md#revocationpubkey-derivation)
+ */
+public class RevocationKey : CommonBase {
+       internal RevocationKey(object _dummy, long ptr) : base(ptr) { }
+       ~RevocationKey() {
+               if (ptr != 0) { bindings.RevocationKey_free(ptr); }
+       }
+
+       public byte[] get_a() {
+               long ret = bindings.RevocationKey_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       public void set_a(byte[] val) {
+               bindings.RevocationKey_set_a(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new RevocationKey given each field
+        */
+       public static RevocationKey of(byte[] a_arg) {
+               long ret = bindings.RevocationKey_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a_arg, 33)));
+               GC.KeepAlive(a_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RevocationKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two RevocationKeys contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.RevocationKey b) {
+               bool ret = bindings.RevocationKey_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is RevocationKey)) return false;
+               return this.eq((RevocationKey)o);
+       }
+       internal long clone_ptr() {
+               long ret = bindings.RevocationKey_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the RevocationKey
+        */
+       public RevocationKey clone() {
+               long ret = bindings.RevocationKey_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RevocationKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Generates a non-cryptographic 64-bit hash of the RevocationKey.
+        */
+       public long hash() {
+               long ret = bindings.RevocationKey_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
+       /**
+        * Derives a per-commitment-transaction revocation public key from one party's per-commitment
+        * point and the other party's [`RevocationBasepoint`]. This is the public equivalent of
+        * [`chan_utils::derive_private_revocation_key`] - using only public keys to derive a public
+        * key instead of private keys.
+        * 
+        * Note that this is infallible iff we trust that at least one of the two input keys are randomly
+        * generated (ie our own).
+        * 
+        * [`chan_utils::derive_private_revocation_key`]: crate::ln::chan_utils::derive_private_revocation_key
+        */
+       public static RevocationKey from_basepoint(org.ldk.structs.RevocationBasepoint countersignatory_basepoint, byte[] per_commitment_point) {
+               long ret = bindings.RevocationKey_from_basepoint(countersignatory_basepoint == null ? 0 : countersignatory_basepoint.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)));
+               GC.KeepAlive(countersignatory_basepoint);
+               GC.KeepAlive(per_commitment_point);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RevocationKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(countersignatory_basepoint); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Get inner Public Key
+        */
+       public byte[] to_public_key() {
+               long ret = bindings.RevocationKey_to_public_key(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Serialize the RevocationKey object into a byte array which can be read by RevocationKey_read
+        */
+       public byte[] write() {
+               long ret = bindings.RevocationKey_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a RevocationKey from a byte array, created by RevocationKey_write
+        */
+       public static Result_RevocationKeyDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.RevocationKey_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_RevocationKeyDecodeErrorZ ret_hu_conv = Result_RevocationKeyDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 36647945cbfeae387bb27cfe75e2bf6e352b5771..aa973810344cfbf3877ed005288b4a457446d5bf 100644 (file)
@@ -109,6 +109,18 @@ public class RevokeAndACK : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the RevokeAndACK.
+        */
+       public long hash() {
+               long ret = bindings.RevokeAndACK_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two RevokeAndACKs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 9a47ac3ec583d159cec6295fff07462b185c4878..74f637faf3d322c737950b4f66eef68dbfd56485 100644 (file)
@@ -8,6 +8,10 @@ namespace org { namespace ldk { namespace structs {
 
 /**
  * A channel descriptor for a hop along a payment path.
+ * 
+ * While this generally comes from BOLT 11's `r` field, this struct includes more fields than are
+ * available in BOLT 11. Thus, encoding and decoding this via `lightning-invoice` is lossy, as
+ * fields not supported in BOLT 11 will be stripped.
  */
 public class RouteHintHop : CommonBase {
        internal RouteHintHop(object _dummy, long ptr) : base(ptr) { }
index a8dbb2a54f6eb012bdabfbb1bb7896585367436f..4bce4122135bfe9bcc1d64c6653fda74e0b23907 100644 (file)
@@ -29,6 +29,11 @@ public interface RouterInterface {
         * Note that first_hops (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
        Result_RouteLightningErrorZ find_route_with_id(byte[] payer, RouteParameters route_params, ChannelDetails[] first_hops, InFlightHtlcs inflight_htlcs, byte[] _payment_hash, byte[] _payment_id);
+       /**Creates [`BlindedPath`]s for payment to the `recipient` node. The channels in `first_hops`
+        * are assumed to be with the `recipient`'s peers. The payment secret and any constraints are
+        * given in `tlvs`.
+        */
+       Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ create_blinded_payment_paths(byte[] recipient, ChannelDetails[] first_hops, ReceiveTlvs tlvs, long amount_msats);
 }
 
 /**
@@ -92,17 +97,37 @@ public class Router : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
+               public long create_blinded_payment_paths(long _recipient, long _first_hops, long _tlvs, long _amount_msats) {
+                       byte[] _recipient_conv = InternalUtils.decodeUint8Array(_recipient);
+                       int _first_hops_conv_16_len = InternalUtils.getArrayLength(_first_hops);
+                       ChannelDetails[] _first_hops_conv_16_arr = new ChannelDetails[_first_hops_conv_16_len];
+                       for (int q = 0; q < _first_hops_conv_16_len; q++) {
+                               long _first_hops_conv_16 = InternalUtils.getU64ArrayElem(_first_hops, q);
+                               org.ldk.structs.ChannelDetails _first_hops_conv_16_hu_conv = null; if (_first_hops_conv_16 < 0 || _first_hops_conv_16 > 4096) { _first_hops_conv_16_hu_conv = new org.ldk.structs.ChannelDetails(null, _first_hops_conv_16); }
+                               if (_first_hops_conv_16_hu_conv != null) { _first_hops_conv_16_hu_conv.ptrs_to.AddLast(this); };
+                               _first_hops_conv_16_arr[q] = _first_hops_conv_16_hu_conv;
+                       }
+                       bindings.free_buffer(_first_hops);
+                       org.ldk.structs.ReceiveTlvs _tlvs_hu_conv = null; if (_tlvs < 0 || _tlvs > 4096) { _tlvs_hu_conv = new org.ldk.structs.ReceiveTlvs(null, _tlvs); }
+                       if (_tlvs_hu_conv != null) { _tlvs_hu_conv.ptrs_to.AddLast(this); };
+                       Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ret = arg.create_blinded_payment_paths(_recipient_conv, _first_hops_conv_16_arr, _tlvs_hu_conv, _amount_msats);
+                               GC.KeepAlive(arg);
+                       long result = ret == null ? 0 : ret.clone_ptr();
+                       return result;
+               }
        }
 
        /** Creates a new instance of Router from a given implementation */
-       public static Router new_impl(RouterInterface arg) {
+       public static Router new_impl(RouterInterface arg, MessageRouterInterface messageRouter_impl) {
                LDKRouterHolder impl_holder = new LDKRouterHolder();
                LDKRouterImpl impl = new LDKRouterImpl(arg, impl_holder);
-               long[] ptr_idx = bindings.LDKRouter_new(impl);
+               MessageRouter messageRouter = MessageRouter.new_impl(messageRouter_impl);
+               long[] ptr_idx = bindings.LDKRouter_new(impl, messageRouter.instance_idx);
 
                impl_holder.held = new Router(null, ptr_idx[0]);
                impl_holder.held.instance_idx = ptr_idx[1];
                impl_holder.held.bindings_instance = impl;
+               impl_holder.held.ptrs_to.AddLast(messageRouter);
                return impl_holder.held;
        }
 
@@ -157,5 +182,24 @@ public class Router : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Creates [`BlindedPath`]s for payment to the `recipient` node. The channels in `first_hops`
+        * are assumed to be with the `recipient`'s peers. The payment secret and any constraints are
+        * given in `tlvs`.
+        */
+       public Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ create_blinded_payment_paths(byte[] recipient, ChannelDetails[] first_hops, org.ldk.structs.ReceiveTlvs tlvs, long amount_msats) {
+               long ret = bindings.Router_create_blinded_payment_paths(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(recipient, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(first_hops, first_hops_conv_16 => first_hops_conv_16 == null ? 0 : first_hops_conv_16.ptr)), tlvs == null ? 0 : tlvs.ptr, amount_msats);
+               GC.KeepAlive(this);
+               GC.KeepAlive(recipient);
+               GC.KeepAlive(first_hops);
+               GC.KeepAlive(tlvs);
+               GC.KeepAlive(amount_msats);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ ret_hu_conv = Result_CVec_C2Tuple_BlindedPayInfoBlindedPathZZNoneZ.constr_from_ptr(ret);
+               foreach (ChannelDetails first_hops_conv_16 in first_hops) { if (this != null) { this.ptrs_to.AddLast(first_hops_conv_16); }; };
+               if (this != null) { this.ptrs_to.AddLast(tlvs); };
+               return ret_hu_conv;
+       }
+
 }
 } } }
index 42310a5e8e02677b731d07af76f22d2575216f83..aefbc190b812a0726a2ad5cc895d849b4608968a 100644 (file)
@@ -19,7 +19,7 @@ public interface ScoreLookUpInterface {
         * [`u64::max_value`] is given to indicate sufficient capacity for the invoice's full amount.
         * Thus, implementations should be overflow-safe.
         */
-       long channel_penalty_msat(long short_channel_id, NodeId source, NodeId target, ChannelUsage usage, ProbabilisticScoringFeeParameters score_params);
+       long channel_penalty_msat(CandidateRouteHop candidate, ChannelUsage usage, ProbabilisticScoringFeeParameters score_params);
 }
 
 /**
@@ -43,13 +43,12 @@ public class ScoreLookUp : CommonBase {
                internal LDKScoreLookUpImpl(ScoreLookUpInterface arg, LDKScoreLookUpHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private ScoreLookUpInterface arg;
                private LDKScoreLookUpHolder impl_holder;
-               public long channel_penalty_msat(long _short_channel_id, long _source, long _target, long _usage, long _score_params) {
-                       org.ldk.structs.NodeId _source_hu_conv = null; if (_source < 0 || _source > 4096) { _source_hu_conv = new org.ldk.structs.NodeId(null, _source); }
-                       org.ldk.structs.NodeId _target_hu_conv = null; if (_target < 0 || _target > 4096) { _target_hu_conv = new org.ldk.structs.NodeId(null, _target); }
+               public long channel_penalty_msat(long _candidate, long _usage, long _score_params) {
+                       CandidateRouteHop _candidate_hu_conv = CandidateRouteHop.constr_from_ptr(_candidate);
                        org.ldk.structs.ChannelUsage _usage_hu_conv = null; if (_usage < 0 || _usage > 4096) { _usage_hu_conv = new org.ldk.structs.ChannelUsage(null, _usage); }
                        if (_usage_hu_conv != null) { _usage_hu_conv.ptrs_to.AddLast(this); };
                        org.ldk.structs.ProbabilisticScoringFeeParameters _score_params_hu_conv = null; if (_score_params < 0 || _score_params > 4096) { _score_params_hu_conv = new org.ldk.structs.ProbabilisticScoringFeeParameters(null, _score_params); }
-                       long ret = arg.channel_penalty_msat(_short_channel_id, _source_hu_conv, _target_hu_conv, _usage_hu_conv, _score_params_hu_conv);
+                       long ret = arg.channel_penalty_msat(_candidate_hu_conv, _usage_hu_conv, _score_params_hu_conv);
                                GC.KeepAlive(arg);
                        return ret;
                }
@@ -77,16 +76,12 @@ public class ScoreLookUp : CommonBase {
         * [`u64::max_value`] is given to indicate sufficient capacity for the invoice's full amount.
         * Thus, implementations should be overflow-safe.
         */
-       public long channel_penalty_msat(long short_channel_id, org.ldk.structs.NodeId source, org.ldk.structs.NodeId target, org.ldk.structs.ChannelUsage usage, org.ldk.structs.ProbabilisticScoringFeeParameters score_params) {
-               long ret = bindings.ScoreLookUp_channel_penalty_msat(this.ptr, short_channel_id, source == null ? 0 : source.ptr, target == null ? 0 : target.ptr, usage == null ? 0 : usage.ptr, score_params == null ? 0 : score_params.ptr);
+       public long channel_penalty_msat(org.ldk.structs.CandidateRouteHop candidate, org.ldk.structs.ChannelUsage usage, org.ldk.structs.ProbabilisticScoringFeeParameters score_params) {
+               long ret = bindings.ScoreLookUp_channel_penalty_msat(this.ptr, candidate == null ? 0 : candidate.ptr, usage == null ? 0 : usage.ptr, score_params == null ? 0 : score_params.ptr);
                GC.KeepAlive(this);
-               GC.KeepAlive(short_channel_id);
-               GC.KeepAlive(source);
-               GC.KeepAlive(target);
+               GC.KeepAlive(candidate);
                GC.KeepAlive(usage);
                GC.KeepAlive(score_params);
-               if (this != null) { this.ptrs_to.AddLast(source); };
-               if (this != null) { this.ptrs_to.AddLast(target); };
                if (this != null) { this.ptrs_to.AddLast(usage); };
                if (this != null) { this.ptrs_to.AddLast(score_params); };
                return ret;
index 936d57a36e5d526dbd892acc296df9023a0e79be..5785e40def6521e67c52aa8b6c09c7501aabc6de 100644 (file)
@@ -12,16 +12,22 @@ namespace org { namespace ldk { namespace structs {
 public interface ScoreUpdateInterface {
        /**Handles updating channel penalties after failing to route through a channel.
         */
-       void payment_path_failed(Path path, long short_channel_id);
+       void payment_path_failed(Path path, long short_channel_id, long duration_since_epoch);
        /**Handles updating channel penalties after successfully routing along a path.
         */
-       void payment_path_successful(Path path);
+       void payment_path_successful(Path path, long duration_since_epoch);
        /**Handles updating channel penalties after a probe over the given path failed.
         */
-       void probe_failed(Path path, long short_channel_id);
+       void probe_failed(Path path, long short_channel_id, long duration_since_epoch);
        /**Handles updating channel penalties after a probe over the given path succeeded.
         */
-       void probe_successful(Path path);
+       void probe_successful(Path path, long duration_since_epoch);
+       /**Scorers may wish to reduce their certainty of channel liquidity information over time.
+        * Thus, this method is provided to allow scorers to observe the passage of time - the holder
+        * of this object should call this method regularly (generally via the
+        * `lightning-background-processor` crate).
+        */
+       void time_passed(long duration_since_epoch);
 }
 
 /**
@@ -41,24 +47,28 @@ public class ScoreUpdate : CommonBase {
                internal LDKScoreUpdateImpl(ScoreUpdateInterface arg, LDKScoreUpdateHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; }
                private ScoreUpdateInterface arg;
                private LDKScoreUpdateHolder impl_holder;
-               public void payment_path_failed(long _path, long _short_channel_id) {
+               public void payment_path_failed(long _path, long _short_channel_id, long _duration_since_epoch) {
                        org.ldk.structs.Path _path_hu_conv = null; if (_path < 0 || _path > 4096) { _path_hu_conv = new org.ldk.structs.Path(null, _path); }
-                       arg.payment_path_failed(_path_hu_conv, _short_channel_id);
+                       arg.payment_path_failed(_path_hu_conv, _short_channel_id, _duration_since_epoch);
                                GC.KeepAlive(arg);
                }
-               public void payment_path_successful(long _path) {
+               public void payment_path_successful(long _path, long _duration_since_epoch) {
                        org.ldk.structs.Path _path_hu_conv = null; if (_path < 0 || _path > 4096) { _path_hu_conv = new org.ldk.structs.Path(null, _path); }
-                       arg.payment_path_successful(_path_hu_conv);
+                       arg.payment_path_successful(_path_hu_conv, _duration_since_epoch);
                                GC.KeepAlive(arg);
                }
-               public void probe_failed(long _path, long _short_channel_id) {
+               public void probe_failed(long _path, long _short_channel_id, long _duration_since_epoch) {
                        org.ldk.structs.Path _path_hu_conv = null; if (_path < 0 || _path > 4096) { _path_hu_conv = new org.ldk.structs.Path(null, _path); }
-                       arg.probe_failed(_path_hu_conv, _short_channel_id);
+                       arg.probe_failed(_path_hu_conv, _short_channel_id, _duration_since_epoch);
                                GC.KeepAlive(arg);
                }
-               public void probe_successful(long _path) {
+               public void probe_successful(long _path, long _duration_since_epoch) {
                        org.ldk.structs.Path _path_hu_conv = null; if (_path < 0 || _path > 4096) { _path_hu_conv = new org.ldk.structs.Path(null, _path); }
-                       arg.probe_successful(_path_hu_conv);
+                       arg.probe_successful(_path_hu_conv, _duration_since_epoch);
+                               GC.KeepAlive(arg);
+               }
+               public void time_passed(long _duration_since_epoch) {
+                       arg.time_passed(_duration_since_epoch);
                                GC.KeepAlive(arg);
                }
        }
@@ -78,44 +88,60 @@ public class ScoreUpdate : CommonBase {
        /**
         * Handles updating channel penalties after failing to route through a channel.
         */
-       public void payment_path_failed(org.ldk.structs.Path path, long short_channel_id) {
-               bindings.ScoreUpdate_payment_path_failed(this.ptr, path == null ? 0 : path.ptr, short_channel_id);
+       public void payment_path_failed(org.ldk.structs.Path path, long short_channel_id, long duration_since_epoch) {
+               bindings.ScoreUpdate_payment_path_failed(this.ptr, path == null ? 0 : path.ptr, short_channel_id, duration_since_epoch);
                GC.KeepAlive(this);
                GC.KeepAlive(path);
                GC.KeepAlive(short_channel_id);
+               GC.KeepAlive(duration_since_epoch);
                if (this != null) { this.ptrs_to.AddLast(path); };
        }
 
        /**
         * Handles updating channel penalties after successfully routing along a path.
         */
-       public void payment_path_successful(org.ldk.structs.Path path) {
-               bindings.ScoreUpdate_payment_path_successful(this.ptr, path == null ? 0 : path.ptr);
+       public void payment_path_successful(org.ldk.structs.Path path, long duration_since_epoch) {
+               bindings.ScoreUpdate_payment_path_successful(this.ptr, path == null ? 0 : path.ptr, duration_since_epoch);
                GC.KeepAlive(this);
                GC.KeepAlive(path);
+               GC.KeepAlive(duration_since_epoch);
                if (this != null) { this.ptrs_to.AddLast(path); };
        }
 
        /**
         * Handles updating channel penalties after a probe over the given path failed.
         */
-       public void probe_failed(org.ldk.structs.Path path, long short_channel_id) {
-               bindings.ScoreUpdate_probe_failed(this.ptr, path == null ? 0 : path.ptr, short_channel_id);
+       public void probe_failed(org.ldk.structs.Path path, long short_channel_id, long duration_since_epoch) {
+               bindings.ScoreUpdate_probe_failed(this.ptr, path == null ? 0 : path.ptr, short_channel_id, duration_since_epoch);
                GC.KeepAlive(this);
                GC.KeepAlive(path);
                GC.KeepAlive(short_channel_id);
+               GC.KeepAlive(duration_since_epoch);
                if (this != null) { this.ptrs_to.AddLast(path); };
        }
 
        /**
         * Handles updating channel penalties after a probe over the given path succeeded.
         */
-       public void probe_successful(org.ldk.structs.Path path) {
-               bindings.ScoreUpdate_probe_successful(this.ptr, path == null ? 0 : path.ptr);
+       public void probe_successful(org.ldk.structs.Path path, long duration_since_epoch) {
+               bindings.ScoreUpdate_probe_successful(this.ptr, path == null ? 0 : path.ptr, duration_since_epoch);
                GC.KeepAlive(this);
                GC.KeepAlive(path);
+               GC.KeepAlive(duration_since_epoch);
                if (this != null) { this.ptrs_to.AddLast(path); };
        }
 
+       /**
+        * Scorers may wish to reduce their certainty of channel liquidity information over time.
+        * Thus, this method is provided to allow scorers to observe the passage of time - the holder
+        * of this object should call this method regularly (generally via the
+        * `lightning-background-processor` crate).
+        */
+       public void time_passed(long duration_since_epoch) {
+               bindings.ScoreUpdate_time_passed(this.ptr, duration_since_epoch);
+               GC.KeepAlive(this);
+               GC.KeepAlive(duration_since_epoch);
+       }
+
 }
 } } }
index 5e557bd1965ca060177803e0a30fb1607d658402..c20659b38b661220c6574db77cd1e822b43fcbf1 100644 (file)
@@ -23,10 +23,11 @@ public class SendError : CommonBase {
                        case 1: return new SendError_TooBigPacket(ptr);
                        case 2: return new SendError_TooFewBlindedHops(ptr);
                        case 3: return new SendError_InvalidFirstHop(ptr);
-                       case 4: return new SendError_InvalidMessage(ptr);
-                       case 5: return new SendError_BufferFull(ptr);
-                       case 6: return new SendError_GetNodeIdFailed(ptr);
-                       case 7: return new SendError_BlindedPathAdvanceFailed(ptr);
+                       case 4: return new SendError_PathNotFound(ptr);
+                       case 5: return new SendError_InvalidMessage(ptr);
+                       case 6: return new SendError_BufferFull(ptr);
+                       case 7: return new SendError_GetNodeIdFailed(ptr);
+                       case 8: return new SendError_BlindedPathAdvanceFailed(ptr);
                        default:
                                throw new ArgumentException("Impossible enum variant");
                }
@@ -51,7 +52,16 @@ public class SendError : CommonBase {
        }
        /** A SendError of type InvalidFirstHop */
        public class SendError_InvalidFirstHop : SendError {
+               public byte[] invalid_first_hop;
                internal SendError_InvalidFirstHop(long ptr) : base(null, ptr) {
+                       long invalid_first_hop = bindings.LDKSendError_InvalidFirstHop_get_invalid_first_hop(ptr);
+                       byte[] invalid_first_hop_conv = InternalUtils.decodeUint8Array(invalid_first_hop);
+                       this.invalid_first_hop = invalid_first_hop_conv;
+               }
+       }
+       /** A SendError of type PathNotFound */
+       public class SendError_PathNotFound : SendError {
+               internal SendError_PathNotFound(long ptr) : base(null, ptr) {
                }
        }
        /** A SendError of type InvalidMessage */
@@ -129,8 +139,20 @@ public class SendError : CommonBase {
        /**
         * Utility method to constructs a new InvalidFirstHop-variant SendError
         */
-       public static SendError invalid_first_hop() {
-               long ret = bindings.SendError_invalid_first_hop();
+       public static SendError invalid_first_hop(byte[] a) {
+               long ret = bindings.SendError_invalid_first_hop(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)));
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SendError ret_hu_conv = org.ldk.structs.SendError.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new PathNotFound-variant SendError
+        */
+       public static SendError path_not_found() {
+               long ret = bindings.SendError_path_not_found();
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.SendError ret_hu_conv = org.ldk.structs.SendError.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
diff --git a/c_sharp/src/org/ldk/structs/SendSuccess.cs b/c_sharp/src/org/ldk/structs/SendSuccess.cs
new file mode 100644 (file)
index 0000000..4ddb4c9
--- /dev/null
@@ -0,0 +1,100 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+/**
+ * Result of successfully [sending an onion message].
+ * 
+ * [sending an onion message]: OnionMessenger::send_onion_message
+ */
+public class SendSuccess : CommonBase {
+       protected SendSuccess(object _dummy, long ptr) : base(ptr) { }
+       ~SendSuccess() {
+               if (ptr != 0) { bindings.SendSuccess_free(ptr); }
+       }
+
+       internal static SendSuccess constr_from_ptr(long ptr) {
+               long raw_ty = bindings.LDKSendSuccess_ty_from_ptr(ptr);
+               switch (raw_ty) {
+                       case 0: return new SendSuccess_Buffered(ptr);
+                       case 1: return new SendSuccess_BufferedAwaitingConnection(ptr);
+                       default:
+                               throw new ArgumentException("Impossible enum variant");
+               }
+       }
+
+       /** A SendSuccess of type Buffered */
+       public class SendSuccess_Buffered : SendSuccess {
+               internal SendSuccess_Buffered(long ptr) : base(null, ptr) {
+               }
+       }
+       /** A SendSuccess of type BufferedAwaitingConnection */
+       public class SendSuccess_BufferedAwaitingConnection : SendSuccess {
+               public byte[] buffered_awaiting_connection;
+               internal SendSuccess_BufferedAwaitingConnection(long ptr) : base(null, ptr) {
+                       long buffered_awaiting_connection = bindings.LDKSendSuccess_BufferedAwaitingConnection_get_buffered_awaiting_connection(ptr);
+                       byte[] buffered_awaiting_connection_conv = InternalUtils.decodeUint8Array(buffered_awaiting_connection);
+                       this.buffered_awaiting_connection = buffered_awaiting_connection_conv;
+               }
+       }
+       internal long clone_ptr() {
+               long ret = bindings.SendSuccess_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the SendSuccess
+        */
+       public SendSuccess clone() {
+               long ret = bindings.SendSuccess_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SendSuccess ret_hu_conv = org.ldk.structs.SendSuccess.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new Buffered-variant SendSuccess
+        */
+       public static SendSuccess buffered() {
+               long ret = bindings.SendSuccess_buffered();
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SendSuccess ret_hu_conv = org.ldk.structs.SendSuccess.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Utility method to constructs a new BufferedAwaitingConnection-variant SendSuccess
+        */
+       public static SendSuccess buffered_awaiting_connection(byte[] a) {
+               long ret = bindings.SendSuccess_buffered_awaiting_connection(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)));
+               GC.KeepAlive(a);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SendSuccess ret_hu_conv = org.ldk.structs.SendSuccess.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two SendSuccesss contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        */
+       public bool eq(org.ldk.structs.SendSuccess b) {
+               bool ret = bindings.SendSuccess_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is SendSuccess)) return false;
+               return this.eq((SendSuccess)o);
+       }
+}
+} } }
index a7ea3d7840743587b7a036a6025f384f512c9b66..142d8fdf9d30da2085493ebb6924a054b4478528 100644 (file)
@@ -92,6 +92,18 @@ public class Shutdown : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the Shutdown.
+        */
+       public long hash() {
+               long ret = bindings.Shutdown_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two Shutdowns contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 30bf39a305b7cb48c3d98b37e01021916836f939..cb9709f2f50299c80a22b3a5476bf65e447252fb 100644 (file)
@@ -108,17 +108,16 @@ public class ShutdownScript : CommonBase {
         * 
         * This function may return an error if `program` is invalid for the segwit `version`.
         */
-       public static Result_ShutdownScriptInvalidShutdownScriptZ new_witness_program(org.ldk.util.WitnessVersion version, byte[] program) {
-               long ret = bindings.ShutdownScript_new_witness_program(version.getVal(), InternalUtils.encodeUint8Array(program));
-               GC.KeepAlive(version);
-               GC.KeepAlive(program);
+       public static Result_ShutdownScriptInvalidShutdownScriptZ new_witness_program(org.ldk.structs.WitnessProgram witness_program) {
+               long ret = bindings.ShutdownScript_new_witness_program(witness_program.ptr);
+               GC.KeepAlive(witness_program);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_ShutdownScriptInvalidShutdownScriptZ ret_hu_conv = Result_ShutdownScriptInvalidShutdownScriptZ.constr_from_ptr(ret);
                return ret_hu_conv;
        }
 
        /**
-        * Converts the shutdown script into the underlying [`Script`].
+        * Converts the shutdown script into the underlying [`ScriptBuf`].
         */
        public byte[] into_inner() {
                long ret = bindings.ShutdownScript_into_inner(this.ptr);
index 9396d02fde4186899e7709a5add452c27b39e372..440e60ac48d8438497659604cb6bdda2ca2d9d71 100644 (file)
@@ -10,7 +10,7 @@ namespace org { namespace ldk { namespace structs {
 
 /** An implementation of SignerProvider */
 public interface SignerProviderInterface {
-       /**Generates a unique `channel_keys_id` that can be used to obtain a [`Self::Signer`] through
+       /**Generates a unique `channel_keys_id` that can be used to obtain a [`Self::EcdsaSigner`] through
         * [`SignerProvider::derive_channel_signer`]. The `user_channel_id` is provided to allow
         * implementations of [`SignerProvider`] to maintain a mapping between itself and the generated
         * `channel_keys_id`.
@@ -36,7 +36,7 @@ public interface SignerProviderInterface {
         * This method is slowly being phased out -- it will only be called when reading objects
         * written by LDK versions prior to 0.0.113.
         * 
-        * [`Signer`]: Self::Signer
+        * [`Signer`]: Self::EcdsaSigner
         * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
         * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
         */
@@ -46,9 +46,10 @@ public interface SignerProviderInterface {
         * If this function returns an error, this will result in a channel failing to open.
         * 
         * This method should return a different value each time it is called, to avoid linking
-        * on-chain funds across channels as controlled to the same user.
+        * on-chain funds across channels as controlled to the same user. `channel_keys_id` may be
+        * used to derive a unique value for each channel.
         */
-       Result_CVec_u8ZNoneZ get_destination_script();
+       Result_CVec_u8ZNoneZ get_destination_script(byte[] channel_keys_id);
        /**Get a script pubkey which we will send funds to when closing a channel.
         * 
         * If this function returns an error, this will result in a channel failing to open or close.
@@ -100,8 +101,9 @@ public class SignerProvider : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long get_destination_script() {
-                       Result_CVec_u8ZNoneZ ret = arg.get_destination_script();
+               public long get_destination_script(long _channel_keys_id) {
+                       byte[] _channel_keys_id_conv = InternalUtils.decodeUint8Array(_channel_keys_id);
+                       Result_CVec_u8ZNoneZ ret = arg.get_destination_script(_channel_keys_id_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -127,7 +129,7 @@ public class SignerProvider : CommonBase {
        }
 
        /**
-        * Generates a unique `channel_keys_id` that can be used to obtain a [`Self::Signer`] through
+        * Generates a unique `channel_keys_id` that can be used to obtain a [`Self::EcdsaSigner`] through
         * [`SignerProvider::derive_channel_signer`]. The `user_channel_id` is provided to allow
         * implementations of [`SignerProvider`] to maintain a mapping between itself and the generated
         * `channel_keys_id`.
@@ -175,7 +177,7 @@ public class SignerProvider : CommonBase {
         * This method is slowly being phased out -- it will only be called when reading objects
         * written by LDK versions prior to 0.0.113.
         * 
-        * [`Signer`]: Self::Signer
+        * [`Signer`]: Self::EcdsaSigner
         * [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
         * [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
         */
@@ -194,11 +196,13 @@ public class SignerProvider : CommonBase {
         * If this function returns an error, this will result in a channel failing to open.
         * 
         * This method should return a different value each time it is called, to avoid linking
-        * on-chain funds across channels as controlled to the same user.
+        * on-chain funds across channels as controlled to the same user. `channel_keys_id` may be
+        * used to derive a unique value for each channel.
         */
-       public Result_CVec_u8ZNoneZ get_destination_script() {
-               long ret = bindings.SignerProvider_get_destination_script(this.ptr);
+       public Result_CVec_u8ZNoneZ get_destination_script(byte[] channel_keys_id) {
+               long ret = bindings.SignerProvider_get_destination_script(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_keys_id, 32)));
                GC.KeepAlive(this);
+               GC.KeepAlive(channel_keys_id);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_CVec_u8ZNoneZ ret_hu_conv = Result_CVec_u8ZNoneZ.constr_from_ptr(ret);
                return ret_hu_conv;
index 42abb61cbab778f394923f41c58e5cdbd7f9070f..096f79f65aba15b52309aa4b5db5957942fba0cc 100644 (file)
@@ -200,6 +200,18 @@ public class SocketAddress : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the SocketAddress.
+        */
+       public long hash() {
+               long ret = bindings.SocketAddress_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two SocketAddresss contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index dc8ca432fe2861217e25ea90f909aa10284bf0a9..b6ffa08e2df4cfe367a0371ae28d7a6b2b2d835e 100644 (file)
@@ -43,6 +43,19 @@ public class SpendableOutputDescriptor : CommonBase {
                 * The output which is referenced by the given outpoint.
                 */
                public TxOut output;
+               /**
+                * The `channel_keys_id` for the channel which this output came from.
+                * 
+                * For channels which were generated on LDK 0.0.119 or later, this is the value which was
+                * passed to the [`SignerProvider::get_destination_script`] call which provided this
+                * output script.
+                * 
+                * For channels which were generated prior to LDK 0.0.119, no such argument existed,
+                * however this field may still be filled in if such data is available.
+                * 
+                * Note that this (or a relevant inner pointer) may be NULL or all-0s to represent None
+                */
+               public byte[] channel_keys_id;
                internal SpendableOutputDescriptor_StaticOutput(long ptr) : base(null, ptr) {
                        long outpoint = bindings.LDKSpendableOutputDescriptor_StaticOutput_get_outpoint(ptr);
                        org.ldk.structs.OutPoint outpoint_hu_conv = null; if (outpoint < 0 || outpoint > 4096) { outpoint_hu_conv = new org.ldk.structs.OutPoint(null, outpoint); }
@@ -51,6 +64,9 @@ public class SpendableOutputDescriptor : CommonBase {
                        long output = bindings.LDKSpendableOutputDescriptor_StaticOutput_get_output(ptr);
                        TxOut output_conv = new TxOut(null, output);
                        this.output = output_conv;
+                       long channel_keys_id = bindings.LDKSpendableOutputDescriptor_StaticOutput_get_channel_keys_id(ptr);
+                       byte[] channel_keys_id_conv = InternalUtils.decodeUint8Array(channel_keys_id);
+                       this.channel_keys_id = channel_keys_id_conv;
                }
        }
        /** A SpendableOutputDescriptor of type DelayedPaymentOutput */
@@ -94,10 +110,11 @@ public class SpendableOutputDescriptor : CommonBase {
        /**
         * Utility method to constructs a new StaticOutput-variant SpendableOutputDescriptor
         */
-       public static SpendableOutputDescriptor static_output(org.ldk.structs.OutPoint outpoint, org.ldk.structs.TxOut output) {
-               long ret = bindings.SpendableOutputDescriptor_static_output(outpoint == null ? 0 : outpoint.ptr, output.ptr);
+       public static SpendableOutputDescriptor static_output(org.ldk.structs.OutPoint outpoint, org.ldk.structs.TxOut output, byte[] channel_keys_id) {
+               long ret = bindings.SpendableOutputDescriptor_static_output(outpoint == null ? 0 : outpoint.ptr, output.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_keys_id, 32)));
                GC.KeepAlive(outpoint);
                GC.KeepAlive(output);
+               GC.KeepAlive(channel_keys_id);
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.SpendableOutputDescriptor ret_hu_conv = org.ldk.structs.SpendableOutputDescriptor.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
diff --git a/c_sharp/src/org/ldk/structs/Splice.cs b/c_sharp/src/org/ldk/structs/Splice.cs
new file mode 100644 (file)
index 0000000..b5912ea
--- /dev/null
@@ -0,0 +1,209 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A splice message to be sent by or received from the stfu initiator (splice initiator).
+ */
+public class Splice : CommonBase {
+       internal Splice(object _dummy, long ptr) : base(ptr) { }
+       ~Splice() {
+               if (ptr != 0) { bindings.Splice_free(ptr); }
+       }
+
+       /**
+        * The channel ID where splicing is intended
+        */
+       public byte[] get_channel_id() {
+               long ret = bindings.Splice_get_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The channel ID where splicing is intended
+        */
+       public void set_channel_id(byte[] val) {
+               bindings.Splice_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The genesis hash of the blockchain where the channel is intended to be spliced
+        */
+       public byte[] get_chain_hash() {
+               long ret = bindings.Splice_get_chain_hash(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The genesis hash of the blockchain where the channel is intended to be spliced
+        */
+       public void set_chain_hash(byte[] val) {
+               bindings.Splice_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The intended change in channel capacity: the amount to be added (positive value)
+        * or removed (negative value) by the sender (splice initiator) by splicing into/from the channel.
+        */
+       public long get_relative_satoshis() {
+               long ret = bindings.Splice_get_relative_satoshis(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The intended change in channel capacity: the amount to be added (positive value)
+        * or removed (negative value) by the sender (splice initiator) by splicing into/from the channel.
+        */
+       public void set_relative_satoshis(long val) {
+               bindings.Splice_set_relative_satoshis(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The feerate for the new funding transaction, set by the splice initiator
+        */
+       public int get_funding_feerate_perkw() {
+               int ret = bindings.Splice_get_funding_feerate_perkw(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The feerate for the new funding transaction, set by the splice initiator
+        */
+       public void set_funding_feerate_perkw(int val) {
+               bindings.Splice_set_funding_feerate_perkw(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The locktime for the new funding transaction
+        */
+       public int get_locktime() {
+               int ret = bindings.Splice_get_locktime(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The locktime for the new funding transaction
+        */
+       public void set_locktime(int val) {
+               bindings.Splice_set_locktime(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The key of the sender (splice initiator) controlling the new funding transaction
+        */
+       public byte[] get_funding_pubkey() {
+               long ret = bindings.Splice_get_funding_pubkey(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The key of the sender (splice initiator) controlling the new funding transaction
+        */
+       public void set_funding_pubkey(byte[] val) {
+               bindings.Splice_set_funding_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new Splice given each field
+        */
+       public static Splice of(byte[] channel_id_arg, byte[] chain_hash_arg, long relative_satoshis_arg, int funding_feerate_perkw_arg, int locktime_arg, byte[] funding_pubkey_arg) {
+               long ret = bindings.Splice_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), relative_satoshis_arg, funding_feerate_perkw_arg, locktime_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_pubkey_arg, 33)));
+               GC.KeepAlive(channel_id_arg);
+               GC.KeepAlive(chain_hash_arg);
+               GC.KeepAlive(relative_satoshis_arg);
+               GC.KeepAlive(funding_feerate_perkw_arg);
+               GC.KeepAlive(locktime_arg);
+               GC.KeepAlive(funding_pubkey_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Splice ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Splice(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.Splice_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the Splice
+        */
+       public Splice clone() {
+               long ret = bindings.Splice_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Splice ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Splice(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two Splices contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.Splice b) {
+               bool ret = bindings.Splice_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is Splice)) return false;
+               return this.eq((Splice)o);
+       }
+       /**
+        * Serialize the Splice object into a byte array which can be read by Splice_read
+        */
+       public byte[] write() {
+               long ret = bindings.Splice_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a Splice from a byte array, created by Splice_write
+        */
+       public static Result_SpliceDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.Splice_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceDecodeErrorZ ret_hu_conv = Result_SpliceDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/SpliceAck.cs b/c_sharp/src/org/ldk/structs/SpliceAck.cs
new file mode 100644 (file)
index 0000000..cfd8f5a
--- /dev/null
@@ -0,0 +1,171 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A splice_ack message to be received by or sent to the splice initiator.
+ */
+public class SpliceAck : CommonBase {
+       internal SpliceAck(object _dummy, long ptr) : base(ptr) { }
+       ~SpliceAck() {
+               if (ptr != 0) { bindings.SpliceAck_free(ptr); }
+       }
+
+       /**
+        * The channel ID where splicing is intended
+        */
+       public byte[] get_channel_id() {
+               long ret = bindings.SpliceAck_get_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The channel ID where splicing is intended
+        */
+       public void set_channel_id(byte[] val) {
+               bindings.SpliceAck_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The genesis hash of the blockchain where the channel is intended to be spliced
+        */
+       public byte[] get_chain_hash() {
+               long ret = bindings.SpliceAck_get_chain_hash(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The genesis hash of the blockchain where the channel is intended to be spliced
+        */
+       public void set_chain_hash(byte[] val) {
+               bindings.SpliceAck_set_chain_hash(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The intended change in channel capacity: the amount to be added (positive value)
+        * or removed (negative value) by the sender (splice acceptor) by splicing into/from the channel.
+        */
+       public long get_relative_satoshis() {
+               long ret = bindings.SpliceAck_get_relative_satoshis(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * The intended change in channel capacity: the amount to be added (positive value)
+        * or removed (negative value) by the sender (splice acceptor) by splicing into/from the channel.
+        */
+       public void set_relative_satoshis(long val) {
+               bindings.SpliceAck_set_relative_satoshis(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * The key of the sender (splice acceptor) controlling the new funding transaction
+        */
+       public byte[] get_funding_pubkey() {
+               long ret = bindings.SpliceAck_get_funding_pubkey(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The key of the sender (splice acceptor) controlling the new funding transaction
+        */
+       public void set_funding_pubkey(byte[] val) {
+               bindings.SpliceAck_set_funding_pubkey(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new SpliceAck given each field
+        */
+       public static SpliceAck of(byte[] channel_id_arg, byte[] chain_hash_arg, long relative_satoshis_arg, byte[] funding_pubkey_arg) {
+               long ret = bindings.SpliceAck_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(chain_hash_arg, 32)), relative_satoshis_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(funding_pubkey_arg, 33)));
+               GC.KeepAlive(channel_id_arg);
+               GC.KeepAlive(chain_hash_arg);
+               GC.KeepAlive(relative_satoshis_arg);
+               GC.KeepAlive(funding_pubkey_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SpliceAck ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.SpliceAck(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.SpliceAck_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the SpliceAck
+        */
+       public SpliceAck clone() {
+               long ret = bindings.SpliceAck_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SpliceAck ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.SpliceAck(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two SpliceAcks contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.SpliceAck b) {
+               bool ret = bindings.SpliceAck_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is SpliceAck)) return false;
+               return this.eq((SpliceAck)o);
+       }
+       /**
+        * Serialize the SpliceAck object into a byte array which can be read by SpliceAck_read
+        */
+       public byte[] write() {
+               long ret = bindings.SpliceAck_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a SpliceAck from a byte array, created by SpliceAck_write
+        */
+       public static Result_SpliceAckDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.SpliceAck_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceAckDecodeErrorZ ret_hu_conv = Result_SpliceAckDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/SpliceLocked.cs b/c_sharp/src/org/ldk/structs/SpliceLocked.cs
new file mode 100644 (file)
index 0000000..17bbcd1
--- /dev/null
@@ -0,0 +1,108 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A splice_locked message to be sent to or received from a peer.
+ */
+public class SpliceLocked : CommonBase {
+       internal SpliceLocked(object _dummy, long ptr) : base(ptr) { }
+       ~SpliceLocked() {
+               if (ptr != 0) { bindings.SpliceLocked_free(ptr); }
+       }
+
+       /**
+        * The channel ID
+        */
+       public byte[] get_channel_id() {
+               long ret = bindings.SpliceLocked_get_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The channel ID
+        */
+       public void set_channel_id(byte[] val) {
+               bindings.SpliceLocked_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new SpliceLocked given each field
+        */
+       public static SpliceLocked of(byte[] channel_id_arg) {
+               long ret = bindings.SpliceLocked_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)));
+               GC.KeepAlive(channel_id_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SpliceLocked ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.SpliceLocked(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.SpliceLocked_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the SpliceLocked
+        */
+       public SpliceLocked clone() {
+               long ret = bindings.SpliceLocked_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.SpliceLocked ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.SpliceLocked(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two SpliceLockeds contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.SpliceLocked b) {
+               bool ret = bindings.SpliceLocked_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is SpliceLocked)) return false;
+               return this.eq((SpliceLocked)o);
+       }
+       /**
+        * Serialize the SpliceLocked object into a byte array which can be read by SpliceLocked_read
+        */
+       public byte[] write() {
+               long ret = bindings.SpliceLocked_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a SpliceLocked from a byte array, created by SpliceLocked_write
+        */
+       public static Result_SpliceLockedDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.SpliceLocked_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_SpliceLockedDecodeErrorZ ret_hu_conv = Result_SpliceLockedDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/Stfu.cs b/c_sharp/src/org/ldk/structs/Stfu.cs
new file mode 100644 (file)
index 0000000..f374687
--- /dev/null
@@ -0,0 +1,127 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * An stfu (quiescence) message to be sent by or received from the stfu initiator.
+ */
+public class Stfu : CommonBase {
+       internal Stfu(object _dummy, long ptr) : base(ptr) { }
+       ~Stfu() {
+               if (ptr != 0) { bindings.Stfu_free(ptr); }
+       }
+
+       /**
+        * The channel ID where quiescence is intended
+        */
+       public byte[] get_channel_id() {
+               long ret = bindings.Stfu_get_channel_id(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * The channel ID where quiescence is intended
+        */
+       public void set_channel_id(byte[] val) {
+               bindings.Stfu_set_channel_id(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 32)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Initiator flag, 1 if initiating, 0 if replying to an stfu.
+        */
+       public byte get_initiator() {
+               byte ret = bindings.Stfu_get_initiator(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Initiator flag, 1 if initiating, 0 if replying to an stfu.
+        */
+       public void set_initiator(byte val) {
+               bindings.Stfu_set_initiator(this.ptr, val);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new Stfu given each field
+        */
+       public static Stfu of(byte[] channel_id_arg, byte initiator_arg) {
+               long ret = bindings.Stfu_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), initiator_arg);
+               GC.KeepAlive(channel_id_arg);
+               GC.KeepAlive(initiator_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Stfu ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Stfu(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.Stfu_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the Stfu
+        */
+       public Stfu clone() {
+               long ret = bindings.Stfu_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Stfu ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.Stfu(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Checks if two Stfus contain equal inner contents.
+        * This ignores pointers and is_owned flags and looks at the values in fields.
+        * Two objects with NULL inner values will be considered "equal" here.
+        */
+       public bool eq(org.ldk.structs.Stfu b) {
+               bool ret = bindings.Stfu_eq(this.ptr, b == null ? 0 : b.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(b);
+               if (this != null) { this.ptrs_to.AddLast(b); };
+               return ret;
+       }
+
+       public override bool Equals(object o) {
+               if (!(o is Stfu)) return false;
+               return this.eq((Stfu)o);
+       }
+       /**
+        * Serialize the Stfu object into a byte array which can be read by Stfu_read
+        */
+       public byte[] write() {
+               long ret = bindings.Stfu_write(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Read a Stfu from a byte array, created by Stfu_write
+        */
+       public static Result_StfuDecodeErrorZ read(byte[] ser) {
+               long ret = bindings.Stfu_read(InternalUtils.encodeUint8Array(ser));
+               GC.KeepAlive(ser);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_StfuDecodeErrorZ ret_hu_conv = Result_StfuDecodeErrorZ.constr_from_ptr(ret);
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 5a1e192777386d3072516e54e14086e8bbfe3053..30e237cc39fdf16ba2fc5257b113a11cc73e1ec9 100644 (file)
@@ -19,5 +19,56 @@ public class TaggedHash : CommonBase {
                if (ptr != 0) { bindings.TaggedHash_free(ptr); }
        }
 
+       internal long clone_ptr() {
+               long ret = bindings.TaggedHash_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a copy of the TaggedHash
+        */
+       public TaggedHash clone() {
+               long ret = bindings.TaggedHash_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.TaggedHash ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.TaggedHash(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Returns the digest to sign.
+        */
+       public byte[] as_digest() {
+               long ret = bindings.TaggedHash_as_digest(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Returns the tag used in the tagged hash.
+        */
+       public string tag() {
+               long ret = bindings.TaggedHash_tag(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               string ret_conv = InternalUtils.decodeString(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Returns the merkle root used in the tagged hash.
+        */
+       public byte[] merkle_root() {
+               long ret = bindings.TaggedHash_merkle_root(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
 }
 } } }
diff --git a/c_sharp/src/org/ldk/structs/ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ.cs b/c_sharp/src/org/ldk/structs/ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ.cs
new file mode 100644 (file)
index 0000000..9b770b0
--- /dev/null
@@ -0,0 +1,89 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A Tuple
+ */
+public class ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ : CommonBase {
+       internal ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ(object _dummy, long ptr) : base(ptr) { }
+       ~ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ() {
+               if (ptr != 0) { bindings.C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public OnionMessage get_b() {
+               long ret = bindings.C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OnionMessage ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OnionMessage(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * 
+        */
+       public Option_CVec_SocketAddressZZ get_c() {
+               long ret = bindings.C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_get_c(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_CVec_SocketAddressZZ ret_hu_conv = org.ldk.structs.Option_CVec_SocketAddressZZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new tuple which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ clone() {
+               long ret = bindings.C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ ret_hu_conv = new ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ from the contained elements.
+        */
+       public static ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ of(byte[] a, org.ldk.structs.OnionMessage b, org.ldk.structs.Option_CVec_SocketAddressZZ c) {
+               long ret = bindings.C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)), b == null ? 0 : b.ptr, c.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               GC.KeepAlive(c);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ ret_hu_conv = new ThreeTuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(c); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ.cs b/c_sharp/src/org/ldk/structs/ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ.cs
new file mode 100644 (file)
index 0000000..7ca3d48
--- /dev/null
@@ -0,0 +1,89 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A Tuple
+ */
+public class ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ : CommonBase {
+       internal ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ(object _dummy, long ptr) : base(ptr) { }
+       ~ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ() {
+               if (ptr != 0) { bindings.C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public RecipientOnionFields get_b() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RecipientOnionFields ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RecipientOnionFields(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * 
+        */
+       public RouteParameters get_c() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_get_c(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.RouteParameters ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RouteParameters(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new tuple which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ clone() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ ret_hu_conv = new ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ from the contained elements.
+        */
+       public static ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ of(byte[] a, org.ldk.structs.RecipientOnionFields b, org.ldk.structs.RouteParameters c) {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), b == null ? 0 : b.ptr, c == null ? 0 : c.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               GC.KeepAlive(c);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ ret_hu_conv = new ThreeTuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(c); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ.cs b/c_sharp/src/org/ldk/structs/ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ.cs
new file mode 100644 (file)
index 0000000..2fd402a
--- /dev/null
@@ -0,0 +1,85 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A Tuple
+ */
+public class ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ : CommonBase {
+       internal ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ(object _dummy, long ptr) : base(ptr) { }
+       ~ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ() {
+               if (ptr != 0) { bindings.C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public int get_b() {
+               int ret = bindings.C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * 
+        */
+       public Option_ThirtyTwoBytesZ get_c() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_get_c(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.Option_ThirtyTwoBytesZ ret_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new tuple which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ clone() {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ ret_hu_conv = new ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ from the contained elements.
+        */
+       public static ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ of(byte[] a, int b, org.ldk.structs.Option_ThirtyTwoBytesZ c) {
+               long ret = bindings.C3Tuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), b, c.ptr);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               GC.KeepAlive(c);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ ret_hu_conv = new ThreeTuple_ThirtyTwoBytesu32COption_ThirtyTwoBytesZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(c); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index afba6556ff15acdd6be1723e36be5dae1872f043..bf3c9eccbd1d7afce81e03c40d22cf059b08c82d 100644 (file)
@@ -36,6 +36,18 @@ public class TransactionU16LenLimited : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TransactionU16LenLimited.
+        */
+       public long hash() {
+               long ret = bindings.TransactionU16LenLimited_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TransactionU16LenLimiteds contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8Zu64Z.cs b/c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8Zu64Z.cs
new file mode 100644 (file)
index 0000000..978bb61
--- /dev/null
@@ -0,0 +1,71 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A Tuple
+ */
+public class TwoTuple_CVec_u8Zu64Z : CommonBase {
+       internal TwoTuple_CVec_u8Zu64Z(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_CVec_u8Zu64Z() {
+               if (ptr != 0) { bindings.C2Tuple_CVec_u8Zu64Z_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_CVec_u8Zu64Z_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public long get_b() {
+               long ret = bindings.C2Tuple_CVec_u8Zu64Z_get_b(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_CVec_u8Zu64Z_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new tuple which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public TwoTuple_CVec_u8Zu64Z clone() {
+               long ret = bindings.C2Tuple_CVec_u8Zu64Z_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_CVec_u8Zu64Z ret_hu_conv = new TwoTuple_CVec_u8Zu64Z(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_CVec_u8Zu64Z from the contained elements.
+        */
+       public static TwoTuple_CVec_u8Zu64Z of(byte[] a, long b) {
+               long ret = bindings.C2Tuple_CVec_u8Zu64Z_new(InternalUtils.encodeUint8Array(a), b);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_CVec_u8Zu64Z ret_hu_conv = new TwoTuple_CVec_u8Zu64Z(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8ZusizeZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_CVec_u8ZusizeZ.cs
deleted file mode 100644 (file)
index 4a31f4a..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-
-/**
- * A Tuple
- */
-public class TwoTuple_CVec_u8ZusizeZ : CommonBase {
-       internal TwoTuple_CVec_u8ZusizeZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_CVec_u8ZusizeZ() {
-               if (ptr != 0) { bindings.C2Tuple_CVec_u8ZusizeZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               long ret = bindings.C2Tuple_CVec_u8ZusizeZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
-       }
-
-       /**
-        * 
-        */
-       public long get_b() {
-               long ret = bindings.C2Tuple_CVec_u8ZusizeZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_CVec_u8ZusizeZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new tuple which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public TwoTuple_CVec_u8ZusizeZ clone() {
-               long ret = bindings.C2Tuple_CVec_u8ZusizeZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_CVec_u8ZusizeZ ret_hu_conv = new TwoTuple_CVec_u8ZusizeZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_CVec_u8ZusizeZ from the contained elements.
-        */
-       public static TwoTuple_CVec_u8ZusizeZ of(byte[] a, long b) {
-               long ret = bindings.C2Tuple_CVec_u8ZusizeZ_new(InternalUtils.encodeUint8Array(a), b);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_CVec_u8ZusizeZ ret_hu_conv = new TwoTuple_CVec_u8ZusizeZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyCVec_SocketAddressZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyCVec_SocketAddressZZ.cs
new file mode 100644 (file)
index 0000000..a6060a8
--- /dev/null
@@ -0,0 +1,82 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A Tuple
+ */
+public class TwoTuple_PublicKeyCVec_SocketAddressZZ : CommonBase {
+       internal TwoTuple_PublicKeyCVec_SocketAddressZZ(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple_PublicKeyCVec_SocketAddressZZ() {
+               if (ptr != 0) { bindings.C2Tuple_PublicKeyCVec_SocketAddressZZ_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple_PublicKeyCVec_SocketAddressZZ_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public SocketAddress[] get_b() {
+               long ret = bindings.C2Tuple_PublicKeyCVec_SocketAddressZZ_get_b(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               int ret_conv_15_len = InternalUtils.getArrayLength(ret);
+               SocketAddress[] ret_conv_15_arr = new SocketAddress[ret_conv_15_len];
+               for (int p = 0; p < ret_conv_15_len; p++) {
+                       long ret_conv_15 = InternalUtils.getU64ArrayElem(ret, p);
+                       org.ldk.structs.SocketAddress ret_conv_15_hu_conv = org.ldk.structs.SocketAddress.constr_from_ptr(ret_conv_15);
+                       if (ret_conv_15_hu_conv != null) { ret_conv_15_hu_conv.ptrs_to.AddLast(this); };
+                       ret_conv_15_arr[p] = ret_conv_15_hu_conv;
+               }
+               bindings.free_buffer(ret);
+               return ret_conv_15_arr;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple_PublicKeyCVec_SocketAddressZZ_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new tuple which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public TwoTuple_PublicKeyCVec_SocketAddressZZ clone() {
+               long ret = bindings.C2Tuple_PublicKeyCVec_SocketAddressZZ_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_PublicKeyCVec_SocketAddressZZ ret_hu_conv = new TwoTuple_PublicKeyCVec_SocketAddressZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple_PublicKeyCVec_SocketAddressZZ from the contained elements.
+        */
+       public static TwoTuple_PublicKeyCVec_SocketAddressZZ of(byte[] a, SocketAddress[] b) {
+               long ret = bindings.C2Tuple_PublicKeyCVec_SocketAddressZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(b, b_conv_15 => b_conv_15.ptr)));
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple_PublicKeyCVec_SocketAddressZZ ret_hu_conv = new TwoTuple_PublicKeyCVec_SocketAddressZZ(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               foreach (SocketAddress b_conv_15 in b) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b_conv_15); }; };
+               return ret_hu_conv;
+       }
+
+}
+} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyOnionMessageZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_PublicKeyOnionMessageZ.cs
deleted file mode 100644 (file)
index 0b47eda..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-
-/**
- * A Tuple
- */
-public class TwoTuple_PublicKeyOnionMessageZ : CommonBase {
-       internal TwoTuple_PublicKeyOnionMessageZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_PublicKeyOnionMessageZ() {
-               if (ptr != 0) { bindings.C2Tuple_PublicKeyOnionMessageZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               long ret = bindings.C2Tuple_PublicKeyOnionMessageZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
-       }
-
-       /**
-        * 
-        */
-       public OnionMessage get_b() {
-               long ret = bindings.C2Tuple_PublicKeyOnionMessageZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.OnionMessage ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OnionMessage(null, ret); }
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_PublicKeyOnionMessageZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new tuple which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public TwoTuple_PublicKeyOnionMessageZ clone() {
-               long ret = bindings.C2Tuple_PublicKeyOnionMessageZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PublicKeyOnionMessageZ ret_hu_conv = new TwoTuple_PublicKeyOnionMessageZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_PublicKeyOnionMessageZ from the contained elements.
-        */
-       public static TwoTuple_PublicKeyOnionMessageZ of(byte[] a, org.ldk.structs.OnionMessage b) {
-               long ret = bindings.C2Tuple_PublicKeyOnionMessageZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 33)), b == null ? 0 : b.ptr);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_PublicKeyOnionMessageZ ret_hu_conv = new TwoTuple_PublicKeyOnionMessageZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ.cs b/c_sharp/src/org/ldk/structs/TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ.cs
deleted file mode 100644 (file)
index ea6dfcf..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-using org.ldk.impl;
-using org.ldk.enums;
-using org.ldk.util;
-using System;
-
-namespace org { namespace ldk { namespace structs {
-
-
-/**
- * A Tuple
- */
-public class TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ : CommonBase {
-       internal TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ(object _dummy, long ptr) : base(ptr) { }
-       ~TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ() {
-               if (ptr != 0) { bindings.C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_free(ptr); }
-       }
-
-       /**
-        * 
-        */
-       public byte[] get_a() {
-               long ret = bindings.C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_a(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
-       }
-
-       /**
-        * 
-        */
-       public Option_ThirtyTwoBytesZ get_b() {
-               long ret = bindings.C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_get_b(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               org.ldk.structs.Option_ThirtyTwoBytesZ ret_hu_conv = org.ldk.structs.Option_ThirtyTwoBytesZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       internal long clone_ptr() {
-               long ret = bindings.C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone_ptr(this.ptr);
-               GC.KeepAlive(this);
-               return ret;
-       }
-
-       /**
-        * Creates a new tuple which has the same data as `orig`
-        * but with all dynamically-allocated buffers duplicated in new buffers.
-        */
-       public TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ clone() {
-               long ret = bindings.C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_clone(this.ptr);
-               GC.KeepAlive(this);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Creates a new C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ from the contained elements.
-        */
-       public static TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ of(byte[] a, org.ldk.structs.Option_ThirtyTwoBytesZ b) {
-               long ret = bindings.C2Tuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), b.ptr);
-               GC.KeepAlive(a);
-               GC.KeepAlive(b);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ ret_hu_conv = new TwoTuple_ThirtyTwoBytesCOption_ThirtyTwoBytesZZ(null, ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(b); };
-               return ret_hu_conv;
-       }
-
-}
-} } }
diff --git a/c_sharp/src/org/ldk/structs/TwoTuple__u832u16Z.cs b/c_sharp/src/org/ldk/structs/TwoTuple__u832u16Z.cs
new file mode 100644 (file)
index 0000000..1c1598e
--- /dev/null
@@ -0,0 +1,71 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+
+/**
+ * A Tuple
+ */
+public class TwoTuple__u832u16Z : CommonBase {
+       internal TwoTuple__u832u16Z(object _dummy, long ptr) : base(ptr) { }
+       ~TwoTuple__u832u16Z() {
+               if (ptr != 0) { bindings.C2Tuple__u832u16Z_free(ptr); }
+       }
+
+       /**
+        * 
+        */
+       public byte[] get_a() {
+               long ret = bindings.C2Tuple__u832u16Z_get_a(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * 
+        */
+       public short get_b() {
+               short ret = bindings.C2Tuple__u832u16Z_get_b(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       internal long clone_ptr() {
+               long ret = bindings.C2Tuple__u832u16Z_clone_ptr(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       /**
+        * Creates a new tuple which has the same data as `orig`
+        * but with all dynamically-allocated buffers duplicated in new buffers.
+        */
+       public TwoTuple__u832u16Z clone() {
+               long ret = bindings.C2Tuple__u832u16Z_clone(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple__u832u16Z ret_hu_conv = new TwoTuple__u832u16Z(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * Creates a new C2Tuple__u832u16Z from the contained elements.
+        */
+       public static TwoTuple__u832u16Z of(byte[] a, short b) {
+               long ret = bindings.C2Tuple__u832u16Z_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(a, 32)), b);
+               GC.KeepAlive(a);
+               GC.KeepAlive(b);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               TwoTuple__u832u16Z ret_hu_conv = new TwoTuple__u832u16Z(null, ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               return ret_hu_conv;
+       }
+
+}
+} } }
index 24502ba3162fbcf89ab628a645cd6381853a337f..47f24a72a13534cd4915122707b86343e36df270 100644 (file)
@@ -88,6 +88,18 @@ public class TxAbort : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxAbort.
+        */
+       public long hash() {
+               long ret = bindings.TxAbort_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxAborts contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 970a533432e150f4291e0a34e2d079c776dfbec6..43dec5a547bbe3dc59b00b6dcac36cf59c708eab 100644 (file)
@@ -92,6 +92,18 @@ public class TxAckRbf : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxAckRbf.
+        */
+       public long hash() {
+               long ret = bindings.TxAckRbf_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxAckRbfs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 8bc30bba78ef8779d1869e903168836822d706cc..338a04a76eb5a63ce9a88365117f4a44ae1a5627 100644 (file)
@@ -150,6 +150,18 @@ public class TxAddInput : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxAddInput.
+        */
+       public long hash() {
+               long ret = bindings.TxAddInput_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxAddInputs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index be541edbcd41d917d83a95a73009f7e54b540614..01d0d9473fc35ab124e71885ed877bd8459d933e 100644 (file)
@@ -126,6 +126,18 @@ public class TxAddOutput : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxAddOutput.
+        */
+       public long hash() {
+               long ret = bindings.TxAddOutput_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxAddOutputs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index bcd8814cc3a80893e9e1cf9f4eadabad3b80da04..783ef55520f318150e91e649b37b05caa7a239f4 100644 (file)
@@ -66,6 +66,18 @@ public class TxComplete : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxComplete.
+        */
+       public long hash() {
+               long ret = bindings.TxComplete_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxCompletes contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index ba7ab4e14c5942ee3b445d00c10d447926236281..58b6f6ab3e04ec3e6f96b3f52d0a244e982c0693 100644 (file)
@@ -50,12 +50,13 @@ public class TxCreationKeys : CommonBase {
         * transaction to provide their counterparty the ability to punish them if they broadcast
         * an old state.
         */
-       public byte[] get_revocation_key() {
+       public RevocationKey get_revocation_key() {
                long ret = bindings.TxCreationKeys_get_revocation_key(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.RevocationKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.RevocationKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
@@ -63,77 +64,84 @@ public class TxCreationKeys : CommonBase {
         * transaction to provide their counterparty the ability to punish them if they broadcast
         * an old state.
         */
-       public void set_revocation_key(byte[] val) {
-               bindings.TxCreationKeys_set_revocation_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_revocation_key(org.ldk.structs.RevocationKey val) {
+               bindings.TxCreationKeys_set_revocation_key(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
         * Broadcaster's HTLC Key
         */
-       public byte[] get_broadcaster_htlc_key() {
+       public HtlcKey get_broadcaster_htlc_key() {
                long ret = bindings.TxCreationKeys_get_broadcaster_htlc_key(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.HtlcKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
         * Broadcaster's HTLC Key
         */
-       public void set_broadcaster_htlc_key(byte[] val) {
-               bindings.TxCreationKeys_set_broadcaster_htlc_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_broadcaster_htlc_key(org.ldk.structs.HtlcKey val) {
+               bindings.TxCreationKeys_set_broadcaster_htlc_key(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
         * Countersignatory's HTLC Key
         */
-       public byte[] get_countersignatory_htlc_key() {
+       public HtlcKey get_countersignatory_htlc_key() {
                long ret = bindings.TxCreationKeys_get_countersignatory_htlc_key(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.HtlcKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.HtlcKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
         * Countersignatory's HTLC Key
         */
-       public void set_countersignatory_htlc_key(byte[] val) {
-               bindings.TxCreationKeys_set_countersignatory_htlc_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_countersignatory_htlc_key(org.ldk.structs.HtlcKey val) {
+               bindings.TxCreationKeys_set_countersignatory_htlc_key(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
         * Broadcaster's Payment Key (which isn't allowed to be spent from for some delay)
         */
-       public byte[] get_broadcaster_delayed_payment_key() {
+       public DelayedPaymentKey get_broadcaster_delayed_payment_key() {
                long ret = bindings.TxCreationKeys_get_broadcaster_delayed_payment_key(this.ptr);
                GC.KeepAlive(this);
                if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
+               org.ldk.structs.DelayedPaymentKey ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.DelayedPaymentKey(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
        }
 
        /**
         * Broadcaster's Payment Key (which isn't allowed to be spent from for some delay)
         */
-       public void set_broadcaster_delayed_payment_key(byte[] val) {
-               bindings.TxCreationKeys_set_broadcaster_delayed_payment_key(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+       public void set_broadcaster_delayed_payment_key(org.ldk.structs.DelayedPaymentKey val) {
+               bindings.TxCreationKeys_set_broadcaster_delayed_payment_key(this.ptr, val == null ? 0 : val.ptr);
                GC.KeepAlive(this);
                GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
        /**
         * Constructs a new TxCreationKeys given each field
         */
-       public static TxCreationKeys of(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(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(revocation_key_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster_htlc_key_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(countersignatory_htlc_key_arg, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster_delayed_payment_key_arg, 33)));
+       public static TxCreationKeys of(byte[] per_commitment_point_arg, org.ldk.structs.RevocationKey revocation_key_arg, org.ldk.structs.HtlcKey broadcaster_htlc_key_arg, org.ldk.structs.HtlcKey countersignatory_htlc_key_arg, org.ldk.structs.DelayedPaymentKey broadcaster_delayed_payment_key_arg) {
+               long ret = bindings.TxCreationKeys_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point_arg, 33)), revocation_key_arg == null ? 0 : revocation_key_arg.ptr, broadcaster_htlc_key_arg == null ? 0 : broadcaster_htlc_key_arg.ptr, countersignatory_htlc_key_arg == null ? 0 : countersignatory_htlc_key_arg.ptr, broadcaster_delayed_payment_key_arg == null ? 0 : broadcaster_delayed_payment_key_arg.ptr);
                GC.KeepAlive(per_commitment_point_arg);
                GC.KeepAlive(revocation_key_arg);
                GC.KeepAlive(broadcaster_htlc_key_arg);
@@ -142,6 +150,10 @@ public class TxCreationKeys : CommonBase {
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.TxCreationKeys ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.TxCreationKeys(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(revocation_key_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(broadcaster_htlc_key_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(countersignatory_htlc_key_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(broadcaster_delayed_payment_key_arg); };
                return ret_hu_conv;
        }
 
@@ -206,8 +218,8 @@ public class TxCreationKeys : CommonBase {
         * Create per-state keys from channel base points and the per-commitment point.
         * Key set is asymmetric and can't be used as part of counter-signatory set of transactions.
         */
-       public static TxCreationKeys derive_new(byte[] per_commitment_point, byte[] broadcaster_delayed_payment_base, byte[] broadcaster_htlc_base, byte[] countersignatory_revocation_base, byte[] countersignatory_htlc_base) {
-               long ret = bindings.TxCreationKeys_derive_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster_delayed_payment_base, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster_htlc_base, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(countersignatory_revocation_base, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(countersignatory_htlc_base, 33)));
+       public static TxCreationKeys derive_new(byte[] per_commitment_point, org.ldk.structs.DelayedPaymentBasepoint broadcaster_delayed_payment_base, org.ldk.structs.HtlcBasepoint broadcaster_htlc_base, org.ldk.structs.RevocationBasepoint countersignatory_revocation_base, org.ldk.structs.HtlcBasepoint countersignatory_htlc_base) {
+               long ret = bindings.TxCreationKeys_derive_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)), broadcaster_delayed_payment_base == null ? 0 : broadcaster_delayed_payment_base.ptr, broadcaster_htlc_base == null ? 0 : broadcaster_htlc_base.ptr, countersignatory_revocation_base == null ? 0 : countersignatory_revocation_base.ptr, countersignatory_htlc_base == null ? 0 : countersignatory_htlc_base.ptr);
                GC.KeepAlive(per_commitment_point);
                GC.KeepAlive(broadcaster_delayed_payment_base);
                GC.KeepAlive(broadcaster_htlc_base);
@@ -216,6 +228,10 @@ public class TxCreationKeys : CommonBase {
                if (ret >= 0 && ret <= 4096) { return null; }
                org.ldk.structs.TxCreationKeys ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.TxCreationKeys(null, ret); }
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(broadcaster_delayed_payment_base); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(broadcaster_htlc_base); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(countersignatory_revocation_base); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(countersignatory_htlc_base); };
                return ret_hu_conv;
        }
 
index 35e50a7a1534633f9e9d3efde2489f62f3cd25cf..7e930f3eefbe585601eca46d62c7d1781b9409ca 100644 (file)
@@ -130,6 +130,18 @@ public class TxInitRbf : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxInitRbf.
+        */
+       public long hash() {
+               long ret = bindings.TxInitRbf_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxInitRbfs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 3ee52bdcdd1411b719a640703707420a393789c5..18d4b5504b154052ab6f8ec076f7bb773f0e0953 100644 (file)
@@ -84,6 +84,18 @@ public class TxRemoveInput : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxRemoveInput.
+        */
+       public long hash() {
+               long ret = bindings.TxRemoveInput_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxRemoveInputs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index e229b274d932c5ffd58dc55c1b41dc2f29703fef..b5d15bf67f4d4e20b7543d38e9c8a6b9b56feeff 100644 (file)
@@ -84,6 +84,18 @@ public class TxRemoveOutput : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxRemoveOutput.
+        */
+       public long hash() {
+               long ret = bindings.TxRemoveOutput_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxRemoveOutputs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 246ee29b976c186544c7b8cf1a5d1c839e3191c1..43a524104fed2da80fccaf28fb4543ee8f584a5b 100644 (file)
@@ -117,6 +117,18 @@ public class TxSignatures : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the TxSignatures.
+        */
+       public long hash() {
+               long ret = bindings.TxSignatures_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two TxSignaturess contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 8c1880053960affaed391f9e8510640927b80ac4..98303e3b2073214062b128be8b89b1a002e6a43b 100644 (file)
@@ -235,6 +235,18 @@ public class UnsignedChannelAnnouncement : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UnsignedChannelAnnouncement.
+        */
+       public long hash() {
+               long ret = bindings.UnsignedChannelAnnouncement_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UnsignedChannelAnnouncements contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index c9ce57728e3a889f719d9fc48836aa981b82b72f..48dd7bd253c9bfed9a8b6fee8d2d88b790ed775e 100644 (file)
@@ -266,6 +266,18 @@ public class UnsignedChannelUpdate : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UnsignedChannelUpdate.
+        */
+       public long hash() {
+               long ret = bindings.UnsignedChannelUpdate_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UnsignedChannelUpdates contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 5d5efc127fdeb22af189d60e18ae740e1c925aba..c2ed14b33b658302e6cff341a6b0dfca851dff0b 100644 (file)
@@ -176,6 +176,18 @@ public class UnsignedNodeAnnouncement : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UnsignedNodeAnnouncement.
+        */
+       public long hash() {
+               long ret = bindings.UnsignedNodeAnnouncement_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UnsignedNodeAnnouncements contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 72ba39859dbee952f92eea6761fadb60a5bc359b..e2d653780dfb53c0673b147695653b03be6c078d 100644 (file)
@@ -76,6 +76,18 @@ public class UntrustedString : CommonBase {
                if (!(o is UntrustedString)) return false;
                return this.eq((UntrustedString)o);
        }
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UntrustedString.
+        */
+       public long hash() {
+               long ret = bindings.UntrustedString_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Serialize the UntrustedString object into a byte array which can be read by UntrustedString_read
         */
index f108706c2c65e07307277af514d45a343c7ff688..343346eb87bcde90ccc296ff111185c52c9d6808 100644 (file)
@@ -139,6 +139,77 @@ public class UpdateAddHTLC : CommonBase {
                if (this != null) { this.ptrs_to.AddLast(val); };
        }
 
+       /**
+        * The onion routing packet with encrypted data for the next hop.
+        */
+       public OnionPacket get_onion_routing_packet() {
+               long ret = bindings.UpdateAddHTLC_get_onion_routing_packet(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.OnionPacket ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.OnionPacket(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); };
+               return ret_hu_conv;
+       }
+
+       /**
+        * The onion routing packet with encrypted data for the next hop.
+        */
+       public void set_onion_routing_packet(org.ldk.structs.OnionPacket val) {
+               bindings.UpdateAddHTLC_set_onion_routing_packet(this.ptr, val == null ? 0 : val.ptr);
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+               if (this != null) { this.ptrs_to.AddLast(val); };
+       }
+
+       /**
+        * Provided if we are relaying or receiving a payment within a blinded path, to decrypt the onion
+        * routing packet and the recipient-provided encrypted payload within.
+        * 
+        * Note that the return value (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public byte[] get_blinding_point() {
+               long ret = bindings.UpdateAddHTLC_get_blinding_point(this.ptr);
+               GC.KeepAlive(this);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
+               return ret_conv;
+       }
+
+       /**
+        * Provided if we are relaying or receiving a payment within a blinded path, to decrypt the onion
+        * routing packet and the recipient-provided encrypted payload within.
+        * 
+        * Note that val (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public void set_blinding_point(byte[] val) {
+               bindings.UpdateAddHTLC_set_blinding_point(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(val, 33)));
+               GC.KeepAlive(this);
+               GC.KeepAlive(val);
+       }
+
+       /**
+        * Constructs a new UpdateAddHTLC given each field
+        * 
+        * Note that blinding_point_arg (or a relevant inner pointer) may be NULL or all-0s to represent None
+        */
+       public static UpdateAddHTLC of(byte[] channel_id_arg, long htlc_id_arg, long amount_msat_arg, byte[] payment_hash_arg, int cltv_expiry_arg, org.ldk.structs.Option_u64Z skimmed_fee_msat_arg, org.ldk.structs.OnionPacket onion_routing_packet_arg, byte[] blinding_point_arg) {
+               long ret = bindings.UpdateAddHTLC_new(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(channel_id_arg, 32)), htlc_id_arg, amount_msat_arg, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_hash_arg, 32)), cltv_expiry_arg, skimmed_fee_msat_arg.ptr, onion_routing_packet_arg == null ? 0 : onion_routing_packet_arg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(blinding_point_arg, 33)));
+               GC.KeepAlive(channel_id_arg);
+               GC.KeepAlive(htlc_id_arg);
+               GC.KeepAlive(amount_msat_arg);
+               GC.KeepAlive(payment_hash_arg);
+               GC.KeepAlive(cltv_expiry_arg);
+               GC.KeepAlive(skimmed_fee_msat_arg);
+               GC.KeepAlive(onion_routing_packet_arg);
+               GC.KeepAlive(blinding_point_arg);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               org.ldk.structs.UpdateAddHTLC ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.UpdateAddHTLC(null, ret); }
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(ret_hu_conv); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(skimmed_fee_msat_arg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(onion_routing_packet_arg); };
+               return ret_hu_conv;
+       }
+
        internal long clone_ptr() {
                long ret = bindings.UpdateAddHTLC_clone_ptr(this.ptr);
                GC.KeepAlive(this);
@@ -157,6 +228,18 @@ public class UpdateAddHTLC : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UpdateAddHTLC.
+        */
+       public long hash() {
+               long ret = bindings.UpdateAddHTLC_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UpdateAddHTLCs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 78ff71d344ddee8b5c2ed7e5199eb191b5cd3ec9..e4ba14962386b0c20ef83ef89e71ecf83ee659d0 100644 (file)
@@ -73,6 +73,18 @@ public class UpdateFailHTLC : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UpdateFailHTLC.
+        */
+       public long hash() {
+               long ret = bindings.UpdateFailHTLC_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UpdateFailHTLCs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 8d83b6461510b37d0a98fb39d66e03dd11d399f8..8d26d4646567d5f3faa4d8278badc65f3fee6fbf 100644 (file)
@@ -91,6 +91,18 @@ public class UpdateFailMalformedHTLC : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UpdateFailMalformedHTLC.
+        */
+       public long hash() {
+               long ret = bindings.UpdateFailMalformedHTLC_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UpdateFailMalformedHTLCs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index c90ea37c07a600799a0cdc235fb9f2378ed5c10e..90b0817a1a5588cbd78586ec432caf3b151c391b 100644 (file)
@@ -86,6 +86,18 @@ public class UpdateFee : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UpdateFee.
+        */
+       public long hash() {
+               long ret = bindings.UpdateFee_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UpdateFees contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 4177127e89f0bc0a38e60a77e5b34503b29bb650..d7c10a6b9ce36c7399e08780703bd536f91f244a 100644 (file)
@@ -107,6 +107,18 @@ public class UpdateFulfillHTLC : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the UpdateFulfillHTLC.
+        */
+       public long hash() {
+               long ret = bindings.UpdateFulfillHTLC_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two UpdateFulfillHTLCs contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
index 6e47ecc6f60b1dd39e210f3e68fae4007c665102..0ef6dd441c2bb667b360c3983452cffebc635433 100644 (file)
@@ -147,6 +147,33 @@ public class UtilMethods {
                return ret_hu_conv;
        }
 
+       /**
+        * Peel one layer off an incoming onion, returning a [`PendingHTLCInfo`] that contains information
+        * about the intended next-hop for the HTLC.
+        * 
+        * This does all the relevant context-free checks that LDK requires for payment relay or
+        * acceptance. If the payment is to be received, and the amount matches the expected amount for
+        * a given invoice, this indicates the [`msgs::UpdateAddHTLC`], once fully committed in the
+        * channel, will generate an [`Event::PaymentClaimable`].
+        * 
+        * [`Event::PaymentClaimable`]: crate::events::Event::PaymentClaimable
+        */
+       public static Result_PendingHTLCInfoInboundHTLCErrZ peel_payment_onion(org.ldk.structs.UpdateAddHTLC msg, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.Logger logger, int cur_height, bool accept_mpp_keysend, bool allow_skimmed_fees) {
+               long ret = bindings.peel_payment_onion(msg == null ? 0 : msg.ptr, node_signer.ptr, logger.ptr, cur_height, accept_mpp_keysend, allow_skimmed_fees);
+               GC.KeepAlive(msg);
+               GC.KeepAlive(node_signer);
+               GC.KeepAlive(logger);
+               GC.KeepAlive(cur_height);
+               GC.KeepAlive(accept_mpp_keysend);
+               GC.KeepAlive(allow_skimmed_fees);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_PendingHTLCInfoInboundHTLCErrZ ret_hu_conv = Result_PendingHTLCInfoInboundHTLCErrZ.constr_from_ptr(ret);
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(msg); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(node_signer); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(logger); };
+               return ret_hu_conv;
+       }
+
        /**
         * Fetches the set of [`InitFeatures`] flags that are provided by or required by
         * [`ChannelManager`].
@@ -338,20 +365,6 @@ public class UtilMethods {
                return ret_conv;
        }
 
-       /**
-        * Derives a per-commitment-transaction public key (eg an htlc key or a delayed_payment key)
-        * from the base point and the per_commitment_key. This is the public equivalent of
-        * derive_private_key - using only public keys to derive a public key instead of private keys.
-        */
-       public static byte[] derive_public_key(byte[] per_commitment_point, byte[] base_point) {
-               long ret = bindings.derive_public_key(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(base_point, 33)));
-               GC.KeepAlive(per_commitment_point);
-               GC.KeepAlive(base_point);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
-       }
-
        /**
         * Derives a per-commitment-transaction revocation key from its constituent parts.
         * 
@@ -369,35 +382,13 @@ public class UtilMethods {
                return ret_conv;
        }
 
-       /**
-        * Derives a per-commitment-transaction revocation public key from its constituent parts. This is
-        * the public equivalend of derive_private_revocation_key - using only public keys to derive a
-        * public key instead of private keys.
-        * 
-        * Only the cheating participant owns a valid witness to propagate a revoked
-        * commitment transaction, thus per_commitment_point always come from cheater
-        * and revocation_base_point always come from punisher, which is the broadcaster
-        * of the transaction spending with this key knowledge.
-        * 
-        * Note that this is infallible iff we trust that at least one of the two input keys are randomly
-        * generated (ie our own).
-        */
-       public static byte[] derive_public_revocation_key(byte[] per_commitment_point, byte[] countersignatory_revocation_base_point) {
-               long ret = bindings.derive_public_revocation_key(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(per_commitment_point, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(countersignatory_revocation_base_point, 33)));
-               GC.KeepAlive(per_commitment_point);
-               GC.KeepAlive(countersignatory_revocation_base_point);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               byte[] ret_conv = InternalUtils.decodeUint8Array(ret);
-               return ret_conv;
-       }
-
        /**
         * A script either spendable by the revocation
         * key or the broadcaster_delayed_payment_key and satisfying the relative-locktime OP_CSV constrain.
         * Encumbering a `to_holder` output on a commitment transaction or 2nd-stage HTLC transactions.
         */
-       public static byte[] get_revokeable_redeemscript(byte[] revocation_key, short contest_delay, byte[] broadcaster_delayed_payment_key) {
-               long ret = bindings.get_revokeable_redeemscript(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(revocation_key, 33)), contest_delay, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster_delayed_payment_key, 33)));
+       public static byte[] get_revokeable_redeemscript(org.ldk.structs.RevocationKey revocation_key, short contest_delay, org.ldk.structs.DelayedPaymentKey broadcaster_delayed_payment_key) {
+               long ret = bindings.get_revokeable_redeemscript(revocation_key == null ? 0 : revocation_key.ptr, contest_delay, broadcaster_delayed_payment_key == null ? 0 : broadcaster_delayed_payment_key.ptr);
                GC.KeepAlive(revocation_key);
                GC.KeepAlive(contest_delay);
                GC.KeepAlive(broadcaster_delayed_payment_key);
@@ -455,8 +446,8 @@ public class UtilMethods {
         * Panics if htlc.transaction_output_index.is_none() (as such HTLCs do not appear in the
         * commitment transaction).
         */
-       public static byte[] build_htlc_transaction(byte[] commitment_txid, int feerate_per_kw, short contest_delay, org.ldk.structs.HTLCOutputInCommitment htlc, org.ldk.structs.ChannelTypeFeatures channel_type_features, byte[] broadcaster_delayed_payment_key, byte[] revocation_key) {
-               long ret = bindings.build_htlc_transaction(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(commitment_txid, 32)), feerate_per_kw, contest_delay, htlc == null ? 0 : htlc.ptr, channel_type_features == null ? 0 : channel_type_features.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(broadcaster_delayed_payment_key, 33)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(revocation_key, 33)));
+       public static byte[] build_htlc_transaction(byte[] commitment_txid, int feerate_per_kw, short contest_delay, org.ldk.structs.HTLCOutputInCommitment htlc, org.ldk.structs.ChannelTypeFeatures channel_type_features, org.ldk.structs.DelayedPaymentKey broadcaster_delayed_payment_key, org.ldk.structs.RevocationKey revocation_key) {
+               long ret = bindings.build_htlc_transaction(InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(commitment_txid, 32)), feerate_per_kw, contest_delay, htlc == null ? 0 : htlc.ptr, channel_type_features == null ? 0 : channel_type_features.ptr, broadcaster_delayed_payment_key == null ? 0 : broadcaster_delayed_payment_key.ptr, revocation_key == null ? 0 : revocation_key.ptr);
                GC.KeepAlive(commitment_txid);
                GC.KeepAlive(feerate_per_kw);
                GC.KeepAlive(contest_delay);
@@ -668,7 +659,7 @@ public class UtilMethods {
         * 
         * We do not enforce that outputs meet the dust limit or that any output scripts are standard.
         */
-       public static Result_C2Tuple_CVec_u8ZusizeZNoneZ SpendableOutputDescriptor_create_spendable_outputs_psbt(SpendableOutputDescriptor[] descriptors, TxOut[] outputs, byte[] change_destination_script, int feerate_sat_per_1000_weight, org.ldk.structs.Option_u32Z locktime) {
+       public static Result_C2Tuple_CVec_u8Zu64ZNoneZ SpendableOutputDescriptor_create_spendable_outputs_psbt(SpendableOutputDescriptor[] descriptors, TxOut[] outputs, byte[] change_destination_script, int feerate_sat_per_1000_weight, org.ldk.structs.Option_u32Z locktime) {
                long ret = bindings.SpendableOutputDescriptor_create_spendable_outputs_psbt(InternalUtils.encodeUint64Array(InternalUtils.mapArray(descriptors, descriptors_conv_27 => descriptors_conv_27.ptr)), InternalUtils.encodeUint64Array(InternalUtils.mapArray(outputs, outputs_conv_7 => outputs_conv_7.ptr)), InternalUtils.encodeUint8Array(change_destination_script), feerate_sat_per_1000_weight, locktime.ptr);
                GC.KeepAlive(descriptors);
                GC.KeepAlive(outputs);
@@ -676,7 +667,7 @@ public class UtilMethods {
                GC.KeepAlive(feerate_sat_per_1000_weight);
                GC.KeepAlive(locktime);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_CVec_u8ZusizeZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8ZusizeZNoneZ.constr_from_ptr(ret);
+               Result_C2Tuple_CVec_u8Zu64ZNoneZ ret_hu_conv = Result_C2Tuple_CVec_u8Zu64ZNoneZ.constr_from_ptr(ret);
                foreach (SpendableOutputDescriptor descriptors_conv_27 in descriptors) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(descriptors_conv_27); }; };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(locktime); };
                return ret_hu_conv;
@@ -686,11 +677,12 @@ public class UtilMethods {
         * Creates an [`OnionMessage`] with the given `contents` for sending to the destination of
         * `path`.
         * 
-        * Returns both the node id of the peer to send the message to and the message itself.
+        * Returns the node id of the peer to send the message to, the message itself, and any addresses
+        * need to connect to the first node.
         * 
         * Note that reply_path (or a relevant inner pointer) may be NULL or all-0s to represent None
         */
-       public static Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ create_onion_message(org.ldk.structs.EntropySource entropy_source, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.OnionMessagePath path, org.ldk.structs.OnionMessageContents contents, org.ldk.structs.BlindedPath reply_path) {
+       public static Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ create_onion_message(org.ldk.structs.EntropySource entropy_source, org.ldk.structs.NodeSigner node_signer, org.ldk.structs.OnionMessagePath path, org.ldk.structs.OnionMessageContents contents, org.ldk.structs.BlindedPath reply_path) {
                long ret = bindings.create_onion_message(entropy_source.ptr, node_signer.ptr, path == null ? 0 : path.ptr, contents.ptr, reply_path == null ? 0 : reply_path.ptr);
                GC.KeepAlive(entropy_source);
                GC.KeepAlive(node_signer);
@@ -698,7 +690,7 @@ public class UtilMethods {
                GC.KeepAlive(contents);
                GC.KeepAlive(reply_path);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ ret_hu_conv = Result_C2Tuple_PublicKeyOnionMessageZSendErrorZ.constr_from_ptr(ret);
+               Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ ret_hu_conv = Result_C3Tuple_PublicKeyOnionMessageCOption_CVec_SocketAddressZZZSendErrorZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(entropy_source); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(node_signer); };
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(path); };
@@ -752,6 +744,31 @@ public class UtilMethods {
                return ret_hu_conv;
        }
 
+       /**
+        * Create a blinded path for a payment, to be forwarded along `intermediate_nodes`.
+        * 
+        * Errors if:
+        * a provided node id is invalid
+        * [`BlindedPayInfo`] calculation results in an integer overflow
+        * any unknown features are required in the provided [`ForwardTlvs`]
+        * 
+        * [`ForwardTlvs`]: crate::blinded_path::payment::ForwardTlvs
+        */
+       public static Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ BlindedPath_new_for_payment(ForwardNode[] intermediate_nodes, byte[] payee_node_id, org.ldk.structs.ReceiveTlvs payee_tlvs, long htlc_maximum_msat, org.ldk.structs.EntropySource entropy_source) {
+               long ret = bindings.BlindedPath_new_for_payment(InternalUtils.encodeUint64Array(InternalUtils.mapArray(intermediate_nodes, intermediate_nodes_conv_13 => intermediate_nodes_conv_13 == null ? 0 : intermediate_nodes_conv_13.ptr)), InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payee_node_id, 33)), payee_tlvs == null ? 0 : payee_tlvs.ptr, htlc_maximum_msat, entropy_source.ptr);
+               GC.KeepAlive(intermediate_nodes);
+               GC.KeepAlive(payee_node_id);
+               GC.KeepAlive(payee_tlvs);
+               GC.KeepAlive(htlc_maximum_msat);
+               GC.KeepAlive(entropy_source);
+               if (ret >= 0 && ret <= 4096) { return null; }
+               Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ ret_hu_conv = Result_C2Tuple_BlindedPayInfoBlindedPathZNoneZ.constr_from_ptr(ret);
+               foreach (ForwardNode intermediate_nodes_conv_13 in intermediate_nodes) { if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(intermediate_nodes_conv_13); }; };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(payee_tlvs); };
+               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(entropy_source); };
+               return ret_hu_conv;
+       }
+
        /**
         * Read a PathFailure from a byte array, created by PathFailure_write
         */
@@ -797,141 +814,48 @@ public class UtilMethods {
        }
 
        /**
-        * Pays the given [`Bolt11Invoice`], retrying if needed based on [`Retry`].
-        * 
-        * [`Bolt11Invoice::payment_hash`] is used as the [`PaymentId`], which ensures idempotency as long
-        * as the payment is still pending. If the payment succeeds, you must ensure that a second payment
-        * with the same [`PaymentHash`] is never sent.
-        * 
-        * If you wish to use a different payment idempotency token, see [`pay_invoice_with_id`].
-        */
-       public static Result_ThirtyTwoBytesPaymentErrorZ pay_invoice(org.ldk.structs.Bolt11Invoice invoice, org.ldk.structs.Retry retry_strategy, org.ldk.structs.ChannelManager channelmanager) {
-               long ret = bindings.pay_invoice(invoice == null ? 0 : invoice.ptr, retry_strategy.ptr, channelmanager == null ? 0 : channelmanager.ptr);
-               GC.KeepAlive(invoice);
-               GC.KeepAlive(retry_strategy);
-               GC.KeepAlive(channelmanager);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ThirtyTwoBytesPaymentErrorZ ret_hu_conv = Result_ThirtyTwoBytesPaymentErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(invoice); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(retry_strategy); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channelmanager); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Pays the given [`Bolt11Invoice`] with a custom idempotency key, retrying if needed based on
-        * [`Retry`].
+        * Builds the necessary parameters to pay or pre-flight probe the given zero-amount
+        * [`Bolt11Invoice`] using [`ChannelManager::send_payment`] or
+        * [`ChannelManager::send_preflight_probes`].
         * 
-        * Note that idempotency is only guaranteed as long as the payment is still pending. Once the
-        * payment completes or fails, no idempotency guarantees are made.
+        * Prior to paying, you must ensure that the [`Bolt11Invoice::payment_hash`] is unique and the
+        * same [`PaymentHash`] has never been paid before.
         * 
-        * You should ensure that the [`Bolt11Invoice::payment_hash`] is unique and the same
-        * [`PaymentHash`] has never been paid before.
+        * Will always succeed unless the invoice has an amount specified, in which case
+        * [`payment_parameters_from_invoice`] should be used.
         * 
-        * See [`pay_invoice`] for a variant which uses the [`PaymentHash`] for the idempotency token.
+        * [`ChannelManager::send_payment`]: lightning::ln::channelmanager::ChannelManager::send_payment
+        * [`ChannelManager::send_preflight_probes`]: lightning::ln::channelmanager::ChannelManager::send_preflight_probes
         */
-       public static Result_NonePaymentErrorZ pay_invoice_with_id(org.ldk.structs.Bolt11Invoice invoice, byte[] payment_id, org.ldk.structs.Retry retry_strategy, org.ldk.structs.ChannelManager channelmanager) {
-               long ret = bindings.pay_invoice_with_id(invoice == null ? 0 : invoice.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), retry_strategy.ptr, channelmanager == null ? 0 : channelmanager.ptr);
+       public static Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ payment_parameters_from_zero_amount_invoice(org.ldk.structs.Bolt11Invoice invoice, long amount_msat) {
+               long ret = bindings.payment_parameters_from_zero_amount_invoice(invoice == null ? 0 : invoice.ptr, amount_msat);
                GC.KeepAlive(invoice);
-               GC.KeepAlive(payment_id);
-               GC.KeepAlive(retry_strategy);
-               GC.KeepAlive(channelmanager);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NonePaymentErrorZ ret_hu_conv = Result_NonePaymentErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(invoice); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(retry_strategy); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channelmanager); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Pays the given zero-value [`Bolt11Invoice`] using the given amount, retrying if needed based on
-        * [`Retry`].
-        * 
-        * [`Bolt11Invoice::payment_hash`] is used as the [`PaymentId`], which ensures idempotency as long
-        * as the payment is still pending. If the payment succeeds, you must ensure that a second payment
-        * with the same [`PaymentHash`] is never sent.
-        * 
-        * If you wish to use a different payment idempotency token, see
-        * [`pay_zero_value_invoice_with_id`].
-        */
-       public static Result_ThirtyTwoBytesPaymentErrorZ pay_zero_value_invoice(org.ldk.structs.Bolt11Invoice invoice, long amount_msats, org.ldk.structs.Retry retry_strategy, org.ldk.structs.ChannelManager channelmanager) {
-               long ret = bindings.pay_zero_value_invoice(invoice == null ? 0 : invoice.ptr, amount_msats, retry_strategy.ptr, channelmanager == null ? 0 : channelmanager.ptr);
-               GC.KeepAlive(invoice);
-               GC.KeepAlive(amount_msats);
-               GC.KeepAlive(retry_strategy);
-               GC.KeepAlive(channelmanager);
+               GC.KeepAlive(amount_msat);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_ThirtyTwoBytesPaymentErrorZ ret_hu_conv = Result_ThirtyTwoBytesPaymentErrorZ.constr_from_ptr(ret);
+               Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ ret_hu_conv = Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(invoice); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(retry_strategy); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channelmanager); };
                return ret_hu_conv;
        }
 
        /**
-        * Pays the given zero-value [`Bolt11Invoice`] using the given amount and custom idempotency key,
-        * retrying if needed based on [`Retry`].
+        * Builds the necessary parameters to pay or pre-flight probe the given [`Bolt11Invoice`] using
+        * [`ChannelManager::send_payment`] or [`ChannelManager::send_preflight_probes`].
         * 
-        * Note that idempotency is only guaranteed as long as the payment is still pending. Once the
-        * payment completes or fails, no idempotency guarantees are made.
+        * Prior to paying, you must ensure that the [`Bolt11Invoice::payment_hash`] is unique and the
+        * same [`PaymentHash`] has never been paid before.
         * 
-        * You should ensure that the [`Bolt11Invoice::payment_hash`] is unique and the same
-        * [`PaymentHash`] has never been paid before.
+        * Will always succeed unless the invoice has no amount specified, in which case
+        * [`payment_parameters_from_zero_amount_invoice`] should be used.
         * 
-        * See [`pay_zero_value_invoice`] for a variant which uses the [`PaymentHash`] for the
-        * idempotency token.
+        * [`ChannelManager::send_payment`]: lightning::ln::channelmanager::ChannelManager::send_payment
+        * [`ChannelManager::send_preflight_probes`]: lightning::ln::channelmanager::ChannelManager::send_preflight_probes
         */
-       public static Result_NonePaymentErrorZ pay_zero_value_invoice_with_id(org.ldk.structs.Bolt11Invoice invoice, long amount_msats, byte[] payment_id, org.ldk.structs.Retry retry_strategy, org.ldk.structs.ChannelManager channelmanager) {
-               long ret = bindings.pay_zero_value_invoice_with_id(invoice == null ? 0 : invoice.ptr, amount_msats, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(payment_id, 32)), retry_strategy.ptr, channelmanager == null ? 0 : channelmanager.ptr);
+       public static Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ payment_parameters_from_invoice(org.ldk.structs.Bolt11Invoice invoice) {
+               long ret = bindings.payment_parameters_from_invoice(invoice == null ? 0 : invoice.ptr);
                GC.KeepAlive(invoice);
-               GC.KeepAlive(amount_msats);
-               GC.KeepAlive(payment_id);
-               GC.KeepAlive(retry_strategy);
-               GC.KeepAlive(channelmanager);
                if (ret >= 0 && ret <= 4096) { return null; }
-               Result_NonePaymentErrorZ ret_hu_conv = Result_NonePaymentErrorZ.constr_from_ptr(ret);
+               Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ ret_hu_conv = Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.constr_from_ptr(ret);
                if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(invoice); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(retry_strategy); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channelmanager); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Sends payment probes over all paths of a route that would be used to pay the given invoice.
-        * 
-        * See [`ChannelManager::send_preflight_probes`] for more information.
-        */
-       public static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ preflight_probe_invoice(org.ldk.structs.Bolt11Invoice invoice, org.ldk.structs.ChannelManager channelmanager, org.ldk.structs.Option_u64Z liquidity_limit_multiplier) {
-               long ret = bindings.preflight_probe_invoice(invoice == null ? 0 : invoice.ptr, channelmanager == null ? 0 : channelmanager.ptr, liquidity_limit_multiplier.ptr);
-               GC.KeepAlive(invoice);
-               GC.KeepAlive(channelmanager);
-               GC.KeepAlive(liquidity_limit_multiplier);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(invoice); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channelmanager); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(liquidity_limit_multiplier); };
-               return ret_hu_conv;
-       }
-
-       /**
-        * Sends payment probes over all paths of a route that would be used to pay the given zero-value
-        * invoice using the given amount.
-        * 
-        * See [`ChannelManager::send_preflight_probes`] for more information.
-        */
-       public static Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ preflight_probe_zero_value_invoice(org.ldk.structs.Bolt11Invoice invoice, long amount_msat, org.ldk.structs.ChannelManager channelmanager, org.ldk.structs.Option_u64Z liquidity_limit_multiplier) {
-               long ret = bindings.preflight_probe_zero_value_invoice(invoice == null ? 0 : invoice.ptr, amount_msat, channelmanager == null ? 0 : channelmanager.ptr, liquidity_limit_multiplier.ptr);
-               GC.KeepAlive(invoice);
-               GC.KeepAlive(amount_msat);
-               GC.KeepAlive(channelmanager);
-               GC.KeepAlive(liquidity_limit_multiplier);
-               if (ret >= 0 && ret <= 4096) { return null; }
-               Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ ret_hu_conv = Result_CVec_C2Tuple_ThirtyTwoBytesThirtyTwoBytesZZProbingErrorZ.constr_from_ptr(ret);
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(invoice); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(channelmanager); };
-               if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(liquidity_limit_multiplier); };
                return ret_hu_conv;
        }
 
index 7ad196cedc970a34be90eb5301d426ff64dfbba7..b8900e77c652ab4acfac4e131d638a31ded1a9a8 100644 (file)
@@ -20,8 +20,11 @@ public interface WalletSourceInterface {
        /**Signs and provides the full [`TxIn::script_sig`] and [`TxIn::witness`] for all inputs within
         * the transaction known to the wallet (i.e., any provided via
         * [`WalletSource::list_confirmed_utxos`]).
+        * 
+        * If your wallet does not support signing PSBTs you can call `psbt.extract_tx()` to get the
+        * unsigned transaction and then sign it with your wallet.
         */
-       Result_TransactionNoneZ sign_tx(byte[] tx);
+       Result_TransactionNoneZ sign_psbt(byte[] psbt);
 }
 
 /**
@@ -54,9 +57,9 @@ public class WalletSource : CommonBase {
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
                }
-               public long sign_tx(long _tx) {
-                       byte[] _tx_conv = InternalUtils.decodeUint8Array(_tx);
-                       Result_TransactionNoneZ ret = arg.sign_tx(_tx_conv);
+               public long sign_psbt(long _psbt) {
+                       byte[] _psbt_conv = InternalUtils.decodeUint8Array(_psbt);
+                       Result_TransactionNoneZ ret = arg.sign_psbt(_psbt_conv);
                                GC.KeepAlive(arg);
                        long result = ret == null ? 0 : ret.clone_ptr();
                        return result;
@@ -102,11 +105,14 @@ public class WalletSource : CommonBase {
         * Signs and provides the full [`TxIn::script_sig`] and [`TxIn::witness`] for all inputs within
         * the transaction known to the wallet (i.e., any provided via
         * [`WalletSource::list_confirmed_utxos`]).
+        * 
+        * If your wallet does not support signing PSBTs you can call `psbt.extract_tx()` to get the
+        * unsigned transaction and then sign it with your wallet.
         */
-       public Result_TransactionNoneZ sign_tx(byte[] tx) {
-               long ret = bindings.WalletSource_sign_tx(this.ptr, InternalUtils.encodeUint8Array(tx));
+       public Result_TransactionNoneZ sign_psbt(byte[] psbt) {
+               long ret = bindings.WalletSource_sign_psbt(this.ptr, InternalUtils.encodeUint8Array(psbt));
                GC.KeepAlive(this);
-               GC.KeepAlive(tx);
+               GC.KeepAlive(psbt);
                if (ret >= 0 && ret <= 4096) { return null; }
                Result_TransactionNoneZ ret_hu_conv = Result_TransactionNoneZ.constr_from_ptr(ret);
                return ret_hu_conv;
index b9b7b52ffd2dde10deef35460e0302ccfaeb8cf0..954075703c0bc2ec305f5a99d85cff9ba1566957 100644 (file)
@@ -100,6 +100,18 @@ public class WarningMessage : CommonBase {
                return ret_hu_conv;
        }
 
+       /**
+        * Generates a non-cryptographic 64-bit hash of the WarningMessage.
+        */
+       public long hash() {
+               long ret = bindings.WarningMessage_hash(this.ptr);
+               GC.KeepAlive(this);
+               return ret;
+       }
+
+       public override int GetHashCode() {
+               return (int)this.hash();
+       }
        /**
         * Checks if two WarningMessages contain equal inner contents.
         * This ignores pointers and is_owned flags and looks at the values in fields.
diff --git a/c_sharp/src/org/ldk/structs/WitnessProgram.cs b/c_sharp/src/org/ldk/structs/WitnessProgram.cs
new file mode 100644 (file)
index 0000000..dee51c4
--- /dev/null
@@ -0,0 +1,29 @@
+using org.ldk.impl;
+using org.ldk.enums;
+using org.ldk.util;
+using System;
+
+namespace org { namespace ldk { namespace structs {
+
+public class WitnessProgram : CommonBase {
+       /** The witness program bytes themselves */
+       public readonly byte[] program;
+       /** The witness version */
+       public readonly WitnessVersion version;
+
+       internal WitnessProgram(object _dummy, long ptr) : base(ptr) {
+               this.program = InternalUtils.decodeUint8Array(bindings.WitnessProgram_get_program(ptr));
+               this.version = new WitnessVersion(bindings.WitnessProgram_get_version(ptr));
+       }
+       static private long check_args(byte[] program, WitnessVersion version) {
+               if (program.Length < 2 || program.Length > 40) throw new ArgumentException();
+               if (version.getVal() == 0 && program.Length != 20 && program.Length != 32) throw new ArgumentException();
+               return InternalUtils.encodeUint8Array(program);
+       }
+       public WitnessProgram(byte[] program, WitnessVersion version) :
+               this(null, bindings.WitnessProgram_new(version.getVal(), check_args(program, version))) {}
+
+       ~WitnessProgram() {
+               if (ptr != 0) { bindings.WitnessProgram_free(ptr); }
+       }
+}} } }